cloudstore-memoizeit

Changes

Details

diff --git a/deployment-scripts/.gitignore b/deployment-scripts/.gitignore
new file mode 100644
index 0000000..38c2cd2
--- /dev/null
+++ b/deployment-scripts/.gitignore
@@ -0,0 +1,14 @@
+scripts/rds-tpcw-dump.sql
+scripts/config.ini
+scripts/software/showcase/target/*
+.idea/
+webservice/keypairs/*
+paramiko.log
+debug.log
+webservice/users/*
+scripts/jmeter_master.tar.gz
+scripts/jmeter_slave.tar.gz
+*.pyc
+key_pair.pub
+key_pair
+db.sqlite3
diff --git a/deployment-scripts/common/admin.py b/deployment-scripts/common/admin.py
new file mode 100644
index 0000000..655ea4c
--- /dev/null
+++ b/deployment-scripts/common/admin.py
@@ -0,0 +1,5 @@
+from django.contrib import admin
+from common import models
+
+admin.site.register(models.Task)
+admin.site.register(models.Log)
\ No newline at end of file
diff --git a/deployment-scripts/common/logger.py b/deployment-scripts/common/logger.py
new file mode 100644
index 0000000..83cdd64
--- /dev/null
+++ b/deployment-scripts/common/logger.py
@@ -0,0 +1,31 @@
+
+import logging
+import models
+import uuid
+
+logger = logging.getLogger(__name__)
+
+
+class Logger(object):
+
+    def __init__(self, task):
+        self.task = task
+
+    def log(self, msg, level=logging.INFO, append_to_last=False, fin=False):
+        logger.log(msg=msg, level=level)
+        if append_to_last:
+            db_log = models.Log.objects.filter(task=self.task).last()
+            db_log.log += msg
+        else:
+            db_log = models.Log()
+            db_log.task = self.task
+            db_log.log = msg
+
+        if level == logging.INFO:
+            db_log.fin = fin
+            db_log.save()
+
+    def clear(self):
+        msgs = models.Log.objects.filter(task=self.task)
+        for obj in msgs:
+            obj.delete()
\ No newline at end of file
diff --git a/deployment-scripts/common/migrations/__init__.py b/deployment-scripts/common/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/common/migrations/__init__.py
diff --git a/deployment-scripts/common/migrations/0001_initial.py b/deployment-scripts/common/migrations/0001_initial.py
new file mode 100644
index 0000000..4073efe
--- /dev/null
+++ b/deployment-scripts/common/migrations/0001_initial.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Task'
+        db.create_table(u'common_task', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('task_id', self.gf('django.db.models.fields.CharField')(max_length=50)),
+            ('is_running', self.gf('django.db.models.fields.BooleanField')(default=False)),
+        ))
+        db.send_create_signal(u'common', ['Task'])
+
+        # Adding model 'Log'
+        db.create_table(u'common_log', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('task', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['common.Task'])),
+            ('log', self.gf('django.db.models.fields.TextField')()),
+            ('fin', self.gf('django.db.models.fields.BooleanField')(default=False)),
+        ))
+        db.send_create_signal(u'common', ['Log'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'Task'
+        db.delete_table(u'common_task')
+
+        # Deleting model 'Log'
+        db.delete_table(u'common_log')
+
+
+    models = {
+        u'common.log': {
+            'Meta': {'object_name': 'Log'},
+            'fin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'log': ('django.db.models.fields.TextField', [], {}),
+            'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['common.Task']"})
+        },
+        u'common.task': {
+            'Meta': {'object_name': 'Task'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_running': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'task_id': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        }
+    }
+
+    complete_apps = ['common']
\ No newline at end of file
diff --git a/deployment-scripts/common/models.py b/deployment-scripts/common/models.py
new file mode 100644
index 0000000..a1b88d3
--- /dev/null
+++ b/deployment-scripts/common/models.py
@@ -0,0 +1,10 @@
+from django.db import models
+
+class Task(models.Model):
+    task_id = models.CharField(max_length=50)
+    is_running = models.BooleanField(default=False)
+
+class Log(models.Model):
+    task = models.ForeignKey(Task)
+    log = models.TextField()
+    fin = models.BooleanField(default=False)
diff --git a/deployment-scripts/configs/gunicorn.conf b/deployment-scripts/configs/gunicorn.conf
new file mode 100644
index 0000000..8278443
--- /dev/null
+++ b/deployment-scripts/configs/gunicorn.conf
@@ -0,0 +1,10 @@
+bind = '127.0.0.1:8001'
+backlog = 2048
+
+workers = 2
+worker_connections = 1000
+timeout = 30
+keepalive = 2
+
+debug = False
+spew = False
\ No newline at end of file
diff --git a/deployment-scripts/configs/nginx.conf b/deployment-scripts/configs/nginx.conf
new file mode 100644
index 0000000..e1d109b
--- /dev/null
+++ b/deployment-scripts/configs/nginx.conf
@@ -0,0 +1,82 @@
+upstream class_app_server {
+        server 127.0.0.1:8001 fail_timeout=0;
+}
+
+server {
+        listen 80;
+        client_max_body_size 4G;
+        server_name localhost
+
+        keepalive_timeout 5;
+
+        access_log  /path/to/webapp/logs/access.log;
+
+        location /robots.txt {
+            alias /path/to/webapp/static/robots.txt;
+        }
+
+        location /static/ {
+                 alias /path/to/webapp/static/;
+
+                 expires 30d;
+                 access_log off;
+
+                 gzip             on;
+                 gzip_min_length  1000;
+                 gzip_proxied     expired no-cache no-store private auth;
+                 gzip_types       text/plain text/xml text/css application/xhtml+xml application/xml application/rss+xml application/javascript application/x-javascript;
+                 gzip_disable     "MSIE [1-6]\.";
+        }
+
+        location / {
+                 try_files $uri @proxy_to_app;
+
+                 gzip             on;
+                 gzip_min_length  1000;
+                 gzip_proxied     expired no-cache no-store private auth;
+                 gzip_types       text/plain text/xml text/css application/xhtml+xml application/xml application/rss+xml application/javascript application/x-javascript;
+                 gzip_disable     "MSIE [1-6]\.";
+        }
+
+	location /showcase-1-a {
+	        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+                proxy_set_header Host $http_host;
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header REMOTE_HOST $remote_addr;
+                proxy_set_header X-FORWARDED-PROTOCOL $scheme;
+                proxy_redirect off;
+                proxy_pass http://localhost:8080/showcase-1-a;
+	}
+
+	location /showcase-1-b {
+	        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+                proxy_set_header Host $http_host;
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header REMOTE_HOST $remote_addr;
+                proxy_set_header X-FORWARDED-PROTOCOL $scheme;
+                proxy_redirect off;
+                proxy_pass http://localhost:8080/showcase-1-b;
+	}
+
+	location /showcase-0 {
+	        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+                proxy_set_header Host $http_host;
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header REMOTE_HOST $remote_addr;
+                proxy_set_header X-FORWARDED-PROTOCOL $scheme;
+                proxy_redirect off;
+                proxy_pass http://localhost:8080/showcase-0;
+	}
+
+
+        location @proxy_to_app {
+                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+                 proxy_set_header Host $http_host;
+                 proxy_set_header X-Real-IP $remote_addr;
+                 proxy_set_header REMOTE_HOST $remote_addr;
+                 proxy_set_header X-FORWARDED-PROTOCOL $scheme;
+                 proxy_redirect off;
+
+                 proxy_pass http://class_app_server;
+        }
+}
diff --git a/deployment-scripts/configs/supervisor.conf b/deployment-scripts/configs/supervisor.conf
new file mode 100644
index 0000000..61d5a54
--- /dev/null
+++ b/deployment-scripts/configs/supervisor.conf
@@ -0,0 +1,9 @@
+[program:webapp]
+environment=HOME=/path/to/webapp/releases/current/
+directory=/path/to/webapp/releases/current/
+command=/path/to/webapp/env/bin/gunicorn -c /path/to/webapp/releases/current/configs/gunicorn.conf webservice.wsgi:application
+user=cloudscale
+autostart=true
+autorestart=true
+stderr_logfile=/path/to/webapp/logs/supervisor_stderr.log
+stdout_logfile=/path/to/webapp/logs/supervisor_stdout.log
diff --git a/deployment-scripts/configs/supervisor_celery.conf b/deployment-scripts/configs/supervisor_celery.conf
new file mode 100644
index 0000000..5f2d2a9
--- /dev/null
+++ b/deployment-scripts/configs/supervisor_celery.conf
@@ -0,0 +1,24 @@
+[program:webapp_celery]
+directory=/path/to/webapp/releases/current/
+; environment=HOME=/path/to/webapp/releases/current/
+command=/path/to/webapp/env/bin/celery worker -A webservice --loglevel=INFO --concurrency=5
+user=cloudscale
+group=cloudscale
+stdout_logfile=/path/to/webapp/logs/supervisor-webapp_celery-stdout.log
+stderr_logfile=/path/to/webapp/logs/supervisor-webapp_celery-stderr.log
+autostart=true
+autorestart=true
+startsecs=10
+
+; Need to wait for currently executing tasks to finish at shutdown.
+; Increase this if you have very long running tasks.
+stopwaitsecs = 600
+
+; When resorting to send SIGKILL to the program to terminate it
+; send SIGKILL to its whole process group instead,
+; taking care of its children as well.
+killasgroup=true
+
+; if rabbitmq is supervised, set its priority higher
+; so it starts first
+priority=998
diff --git a/deployment-scripts/fabfile.py b/deployment-scripts/fabfile.py
new file mode 100644
index 0000000..047a532
--- /dev/null
+++ b/deployment-scripts/fabfile.py
@@ -0,0 +1,157 @@
+from fabric.context_managers import cd, settings, prefix
+from fabric.contrib.files import exists
+from fabric.decorators import task
+from fabric.operations import require, sudo, run, put, local
+from fabric.state import env
+
+"""
+Base configuration
+"""
+env.user = 'cloudscale'
+env.path = '/home/%(user)s' % env
+env.virtualenvwrapper = '/usr/local/bin/virtualenvwrapper.sh'
+env.branch = 'master'
+env.local_virtualenv_name = 'webservice'
+
+env.hosts = ['127.0.0.1']
+env.project = 'webapp'
+
+@task
+def setup():
+    setup_os()
+    setup_directories()
+    setup_virtualenv()
+
+@task
+def deploy():
+    env.path = '%(path)s/%(project)s' % env
+
+    cleanup()
+    package()
+    upload()
+    symlink()
+    permissions()
+    handle_big_files()
+    install_requirements()
+
+    staticfiles()
+    django_settings()
+    config()
+
+    try:
+        for callback in env.callbacks:
+            callback()
+    except:
+        pass
+
+def handle_big_files():
+    # replace 10.10.40.23 with cloudscale.xlab.si
+    sudo('wget -P %(path)s/releases/current/scripts/ http://10.10.40.23/github/rds-tpcw-dump-latest.sql' % env)
+
+def cleanup():
+    local('rm -rf scripts/software/showcase/target')
+
+def permissions():
+    with cd('%(path)s/releases/current/' % env):
+        if not exists('debug.log'):
+            run('touch debug.log')
+
+        sudo('chown %(user)s:%(user)s debug.log' % env)
+        sudo('chmod 777 debug.log')
+
+def setup_os():
+    sudo('apt-get install -y python-setuptools')
+    sudo('easy_install pip')
+    sudo('apt-get install supervisor')
+    sudo('apt-get install python-dev')
+    sudo('pip install virtualenv')
+    sudo('apt-get install libmysqlclient-dev')
+    sudo('apt-get install -y git')
+    sudo('apt-get install -y nginx')
+    sudo('aptitude install -y build-essential')
+    sudo('apt-get install -y openjdk-7-jdk')
+    sudo('apt-get install -y maven')
+
+def setup_directories():
+    run("mkdir -p %(path)s/%(project)s" % env)
+    with cd('%(path)s/%(project)s' % env):
+        run("mkdir -p logs" % env)
+        run("mkdir -p releases" % env)
+        run("mkdir -p packages" % env)
+
+def setup_virtualenv():
+    with cd('%(path)s/%(project)s' % env):
+        run('virtualenv --no-site-packages env')
+
+def symlink():
+    require('release')
+
+    with cd('%(path)s/releases' % env):
+        if exists('previous'):
+            run('rm previous')
+        if exists('current'):
+            run('mv current previous')
+        run('ln -s %(release)s current' % env)
+
+def upload():
+    require('archive_name')
+    require('release')
+
+    run('mkdir -p %(path)s/releases/%(release)s/' % env)
+    put(('%(archive_name)s' % env), ('%(path)s/packages/' % env))
+    with cd('%(path)s/releases/%(release)s/' % env):
+        run('tar zxf ../../packages/%(archive_name)s' % env)
+    local('/bin/rm %(archive_name)s' % env)
+
+def package():
+    import time
+    env.release = time.strftime('%Y%m%d%H%M%S')
+    env.archive_name = '%(release)s.tar.gz' % env
+    local('/usr/bin/git archive --format=tar %(branch)s | /bin/gzip > %(archive_name)s' % env)
+
+def install_requirements():
+    require('release')
+    require('project')
+
+    with settings(virtualhost_path = '%(path)s/env' % env):
+        with cd('%(virtualhost_path)s' % env):
+            with prefix('source %(virtualhost_path)s/bin/activate' % env):
+                run('%(virtualhost_path)s/bin/pip install -r %(path)s/releases/%(release)s/requirements.txt' % env)
+
+def staticfiles():
+    with cd('%(path)s/releases/current/' % env):
+        with prefix('source %(path)s/env/bin/activate' % env):
+            sudo('%(path)s/env/bin/python manage.py collectstatic --noinput' % env)
+
+
+
+def django_settings():
+    require('project')
+    sudo('rm %(path)s/releases/current/webservice/settings_local.py*' % env)
+    sudo('rm %(path)s/releases/current/webservice/settings.pyc*' % env)
+
+
+def config():
+    require('project')
+
+    config_supervisor()
+    config_nginx()
+
+def config_supervisor():
+    require('project')
+
+    supervisor_conf_path = '%(path)s/releases/current/configs/supervisor.conf' % env
+    supervisor_celery_conf_path = '%(path)s/releases/current/configs/supervisor_celery.conf' % env
+
+    sudo('cp %s /etc/supervisor/conf.d/%s.conf' % (supervisor_conf_path, env.project))
+    sudo('cp %s /etc/supervisor/conf.d/%s_celery.conf' % (supervisor_celery_conf_path, env.project))
+    sudo('supervisorctl -c /etc/supervisor/supervisord.conf restart all')
+    sudo('supervisorctl update')
+
+def config_nginx():
+    require('project')
+
+    nginx_conf_path = '%(path)s/releases/current/configs/nginx.conf' % env
+    sudo('cp %s /etc/nginx/sites-available/%s.conf' % (nginx_conf_path, env.project))
+    sudo('ln -sf /etc/nginx/sites-available/%(project)s.conf /etc/nginx/sites-enabled/' % env)
+    sudo('service nginx restart')
\ No newline at end of file
diff --git a/deployment-scripts/form/__init__.py b/deployment-scripts/form/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/form/__init__.py
diff --git a/deployment-scripts/form/admin.py b/deployment-scripts/form/admin.py
new file mode 100644
index 0000000..de6445a
--- /dev/null
+++ b/deployment-scripts/form/admin.py
@@ -0,0 +1,5 @@
+from django.contrib import admin
+from form import models
+
+admin.site.register(models.Ec2InstanceTypes)
+admin.site.register(models.RDSInstanceTypes)
diff --git a/deployment-scripts/form/models.py b/deployment-scripts/form/models.py
new file mode 100644
index 0000000..d893bb0
--- /dev/null
+++ b/deployment-scripts/form/models.py
@@ -0,0 +1,15 @@
+from django.db import models
+
+class Ec2InstanceTypes(models.Model):
+    instance_type = models.CharField(max_length=100)
+
+    def __str__(self):
+        return self.instance_type
+
+class RDSInstanceTypes(models.Model):
+    instance_type = models.CharField(max_length=100)
+
+    def __str__(self):
+        return self.instance_type
+
+
diff --git a/deployment-scripts/form/templates/form/form.html b/deployment-scripts/form/templates/form/form.html
new file mode 100644
index 0000000..a3d297d
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form.html
@@ -0,0 +1,19 @@
+{% extends "form/home.html" %}
+{% block content %}
+<div class="row" ng-controller="myController">
+    <div class="col-sm-8 col-sm-offset-2">
+        <input type="hidden" name="uid" value="{{ uid }}" ng-init="formData.uid = '{{ uid }}'" ng-model="formData.uid">
+        <div id="form-container">
+{#            {% verbatim %}#}
+{#            {{ formData }}#}
+{#            {% endverbatim %}#}
+            <!-- use ng-submit to catch the form submission and use our Angular function -->
+{#            <form id="signup-form" name="form" novalidate>#}
+                <!-- our nested state views will be injected here -->
+                <div id="form-views" ng-view></div>
+{#            </form>#}
+
+        </div>
+    </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/deployment-scripts/form/templates/form/form-step1.html b/deployment-scripts/form/templates/form/form-step1.html
new file mode 100644
index 0000000..0df5286
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step1.html
@@ -0,0 +1,16 @@
+{% load staticfiles %}<!-- form-profile.html -->
+<div class="form-group text-center">
+    <h2>Choose provider</h2>
+    <hr>
+    <p>
+        <div class="provider" ng-click="provider('aws')">
+            <img  src="{% static "../../static/images/amazon-web-services.jpg" %}" />
+        </div>
+        <div class="provider" ng-click="provider('openstack')" >
+            <img src="{% static "../../static/images/openstack-logo512.jpg" %}" />
+        </div>
+    </p>
+    <hr>
+</div>
+
+</div>
\ No newline at end of file
diff --git a/deployment-scripts/form/templates/form/form-step2.html b/deployment-scripts/form/templates/form/form-step2.html
new file mode 100644
index 0000000..3f6a7df
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step2.html
@@ -0,0 +1,20 @@
+{% load staticfiles %}<!-- form-profile.html -->
+<div class="form-group text-center">
+    <h2>Choose database</h2>
+    <hr>
+    <p>
+        <div class="provider" ng-click="db_provider('mysql')">
+            <img  src="{% static "../../static/images/mysql.png" %}" />
+        </div>
+        <div class="provider" ng-click="db_provider('mongodb')" ng-if="formData.provider == 'openstack'">
+            <img src="{% static "../../static/images/mongodb.png" %}" />
+        </div>
+    </p>
+    <hr>
+
+    <div class="text-center">
+        <button ng-click="prevStep('/step1')" class="btn btn-primary">Prev</button>
+    </div>
+</div>
+
+</div>
\ No newline at end of file
diff --git a/deployment-scripts/form/templates/form/form-step3.html b/deployment-scripts/form/templates/form/form-step3.html
new file mode 100644
index 0000000..9968a95
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step3.html
@@ -0,0 +1,185 @@
+<!-- form-interests.html -->
+<h2 class="text-center">Configure frontend</h2>
+<hr>
+
+<div class="text-left" ng-if="formData.provider == 'aws'">
+    <div class="well">
+        We require at least these permissions for EC2:
+        <ul>
+            <li>RunInstances</li>
+            <li>StartInstances</li>
+            <li>StopInstances</li>
+            <li>TerminateInstances</li>
+            <li>CreateKeyPair</li>
+            <li>DeleteKeyPair</li>
+        </ul>
+        You can simulate your permissions <a href="https://policysim.aws.amazon.com/home/index.jsp">here</a>
+    </div>
+    <form name="awsForm" novalidate ng-submit="nextStep('/step4', awsForm)">
+        <div class="form-group" ng-class="{'has-error' : submitted && awsForm.access_key.$invalid }">
+            <label>
+                Amazon access key <span tooltip="We won't save your access key" class="glyphicon glyphicon-question-sign"></span>
+            </label>
+            <input name="access_key" type="text" ng-model="formData.fr.access_key" required class="form-control">
+            <span class="help-block"
+                  ng-show="submitted && awsForm.access_key.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && awsForm.secret_key.$invalid}">
+            <label>
+                Amazon secret key <span tooltip="We won't save your secret key"class="glyphicon glyphicon-question-sign"></span>
+            </label>
+            <input name="secret_key" type="text" ng-model="formData.fr.secret_key" required class="form-control">
+            <span class="help-block"
+                  ng-show="submitted && awsForm.secret_key.$invalid">Required</span>
+        </div>
+        <div class="form-group">
+            <label>
+                Do you want autoscaling?
+            </label>
+
+            <div ng-class="{'has-error' : submitted && awsForm.autoscaling.$invalid}">
+                <div class="radio">
+                    <label>
+                        <input type="radio" ng-model="formData.fr.autoscaling" required value="yes" name="autoscaling">
+                        Yes
+                    </label>
+                </div>
+                <div class="radio">
+                    <label>
+                        <input type="radio" ng-model="formData.fr.autoscaling" required value="no" name="autoscaling">
+                        No
+                    </label>
+                </div>
+
+                <span class="help-block"
+                      ng-show="submitted && awsForm.autoscaling.$invalid">Required</span>
+            </div>
+        </div>
+        <div class="form-group" ng-if="formData.fr.autoscaling == 'no'"
+             ng-class="{'has-error' : submitted && awsForm.num_instances.$invalid}">
+            <label>
+                How many instances do you want?
+            </label>
+            <input type="number" min="1" class="form-control" required name="num_instances"
+                   ng-model="formData.fr.num_instances">
+                <span class="help-block"
+                      ng-show="submitted && awsForm.num_instances.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && awsForm.instance_type.$invalid}">
+            <label>
+                Instance type
+            </label>
+            <select name="instance_type" required ng-model="formData.fr.instance_type"
+                    ng-init="formData.fr.instance_type = ec2_instance_types[1]"
+                    ng-options="value for value in ec2_instance_types" class="form-control">
+            </select>
+                <span class="help-block"
+                      ng-show="submitted && awsForm.instance_type.$invalid">Required</span>
+        </div>
+        <hr>
+        <div class="text-center">
+            <button name="prev" ng-click="prevStep('/step2')" class="btn btn-primary">Prev</button>
+            <button name="next" type="submit" class="btn btn-primary">Next</button>
+        </div>
+    </form>
+</div>
+
+<div ng-if="formData.provider == 'openstack'">
+    <div class="well">
+        If you want to run on your own deployment of OpenStack, you should upload cloud image of Ubuntu 12.04.
+    </div>
+    <form name="openstackForm" novalidate ng-submit="nextStep('/step4', openstackForm)">
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.num_instances.$invalid}">
+            <label>
+                How many instances do you want?
+            </label>
+            <input required min="1" max="10" class="form-control" type="number" name="num_instances" ng-model="formData.fr.num_instances">
+            <span class="help-block" ng-show="submitted && openstackForm.num_instances.$invalid">Required</span>
+        </div>
+        <div class="form-group">
+            <label>
+                Do you want to run on your OpenStack infrastructure?
+            </label>
+            <div ng-class="{'has-error' : submitted && openstackForm.own_infrastructure.$invalid}">
+                <div class="radio">
+                    <label>
+                        <input type="radio" ng-model="formData.fr.own_infrastructure" required value="yes" name="own_infrastructure">
+                        Yes
+                    </label>
+                </div>
+                <div class="radio">
+                    <label>
+                        <input type="radio" ng-model="formData.fr.own_infrastructure" required value="no" name="own_infrastructure">
+                        No
+                    </label>
+                </div>
+                <span class="help-block"
+                      ng-show="submitted && openstackForm.own_infrastructure.$invalid">Required</span>
+            </div>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.auth_url.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Authentication url
+            </label>
+            <input required class="form-control" type="text" name="auth_url" ng-model="formData.fr.auth_url">
+            <span class="help-block" ng-show="submitted && openstackForm.auth_url.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.username.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Username
+            </label>
+            <input required class="form-control" type="text" name="username" ng-model="formData.fr.username">
+            <span class="help-block" ng-show="submitted && openstackForm.username.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.password.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Password
+            </label>
+            <input required class="form-control" type="password" name="password" ng-model="formData.fr.password">
+            <span class="help-block" ng-show="submitted && openstackForm.password.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.tenant.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Tenant
+            </label>
+            <input required class="form-control" type="text" name="tenant" ng-model="formData.fr.tenant">
+            <span class="help-block" ng-show="submitted && openstackForm.tenant.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.flavor.$invalid}">
+            <label>
+                Choose flavor <span tooltip="This will load when you fill in your credentials" class="glyphicon glyphicon-question-sign"></span>
+            </label>
+            <select required class="form-control" name="flavor" ng-options="flavor for flavor in flavors" ng-model="formData.fr.flavor">
+            </select>
+            <span class="help-block" ng-show="submitted && openstackForm.flavor.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.image.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Choose image <span tooltip="This will load when you fill in your credentials" class="glyphicon glyphicon-question-sign"></span>
+            </label>
+            <select required class="form-control" name="image" ng-options="image for image in images" ng-model="formData.fr.image">
+            </select>
+            </span>
+            <span class="help-block" ng-show="submitted && openstackForm.image.$invalid">Required</span>
+        </div>
+        <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.image_username.$invalid}"
+                 ng-if="formData.fr.own_infrastructure == 'yes'">
+            <label>
+                Username as which we can SSH to instance
+            </label>
+            <input required class="form-control" type="text" name="image_username" ng-model="formData.fr.image_username">
+            <span class="help-block" ng-show="submitted && openstackForm.image_username.$invalid">Required</span>
+        </div>
+        <hr>
+        <div class="text-center">
+            <button name="prev" ng-click="prevStep('/step2')" class="btn btn-primary">Prev</button>
+            <button name="next" type="submit" class="btn btn-primary">Next</button>
+        </div>
+    </form>
+</div>
+</div>
diff --git a/deployment-scripts/form/templates/form/form-step4.html b/deployment-scripts/form/templates/form/form-step4.html
new file mode 100644
index 0000000..48e4d29
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step4.html
@@ -0,0 +1,152 @@
+<h2 class="text-center">Configure database</h2>
+<hr>
+<div ng-if="formData.provider == 'aws'">
+    <div ng-if="formData.db_provider == 'mysql'">
+        <form name="awsForm" novalidate ng-submit="nextStep('/step7', awsForm)">
+            <div class="help-block">
+                <strong>NOTICE:</strong> Amazon Web Services currently doesn't provide other setup than master-slave or just one database instance.
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && awsForm.num_instances.$invalid}">
+                <label>
+                    How many database instances do you want?
+                </label>
+                <input required name="num_instances" type="number" max="6" class="form-control"
+                       ng-model="formData.db.num_instances"/>
+                <span class="help-block" ng-show="formData.db.num_instances > 1">
+                    There will be one master instance and {% verbatim %}{{ formData.db.num_instances - 1 }}{% endverbatim %} replicas
+                </span>
+                <span class="help-block" ng-show="formData.db.num_instances == 1">
+                    There will be just one database instance
+                </span>
+                <span class="help-block" ng-show="submitted && awsForm.num_instances.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && awsForm.master_identifier.$invalid}">
+                <label>
+                    Master identifier
+                </label>
+                <input value="cloudscale-master" required name="master_identifier" type="text" class="form-control"
+                       ng-model="formData.db.master_identifier" placeholder="cloudscale-master"/>
+                <span class="help-block" ng-show="submitted && awsForm.master_identifier.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-show="formData.db.num_instances > 0" ng-class="{'has-error' : submitted && awsForm.replica_identifier.$invalid}">
+                <label>
+                    Replica identifier
+                </label>
+                <input value="cloudscale-replica" required name="replica_identifier" type="text" class="form-control"
+                       ng-model="formData.db.replica_identifier" placeholder="cloudscale-replica"/>
+                <span class="help-block" ng-show="submitted && awsForm.replica_identifier.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && awsForm.instance_type.$invalid}">
+                <label>
+                    Instance type
+                </label>
+                <select required class="form-control" name="instance_type" ng-model="formData.db.instance_type"
+                        ng-init="formData.db.instance_type=rds_instance_types[0]"
+                        ng-options="value for value in rds_instance_types">
+                </select>
+                <span class="help-block" ng-show="submitted && awsForm.instance_type.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && awsForm.connection_pool_size.$invalid}">
+                <label>
+                    Connection pool size
+                </label>
+                <input required class="form-control" ng-model="formData.db.connection_pool_size" type="text"
+                       name="connection_pool_size">
+                <span class="help-block" ng-show="submitted && awsForm.connection_pool_size.$invalid">Required</span>
+            </div>
+            <hr>
+            <div class="text-center">
+                <button name="prev" ng-click="prevStep('/step3')" class="btn btn-primary">Prev</button>
+                <button name="next" type="submit" class="btn btn-primary">Next</button>
+            </div>
+        </form>
+    </div>
+</div>
+<div ng-if="formData.provider == 'openstack'">
+    <form name="openstackForm" ng-submit="nextStep('/step7', openstackForm)">
+        <div ng-if="formData.db_provider == 'mysql'">
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.setup_type.$invalid}">
+                <label>
+                    Choose setup type
+                </label>
+                <div class="radio">
+                    <label>
+                        <input required type="radio" name="setup_type" ng-model="formData.db.setup_type" value="master-master">
+                        master-master
+                    </label>
+                </div>
+                <div class="radio">
+                    <label>
+                        <input required type="radio" name="setup_type" ng-model="formData.db.setup_type" value="master-slave">
+                        master-slave
+                    </label>
+                </div>
+                <span class="help-block" ng-show="submitted && openstackForm.setup_type.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.num_instances.$invalid}">
+                <label>
+                    How many instances do you want?
+                </label>
+                <input required class="form-control" type="text" name="num_instances" ng-model="formData.db.num_instances">
+                <span class="help-block" ng-show="submitted && openstackForm.num_instances.$invalid">Required</span>
+                <span class="help-block small"><strong>Notice:</strong> If you chose master-slave, the number you'll enter include master instance.</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.connection_pool_size.$invalid}">
+                <label>
+                    Connection pool size
+                </label>
+                <input required class="form-control" type="number" min="2" max="700" name="connection_pool_size"
+                       ng-model="formData.db.connection_pool_size">
+                <span class="help-block" ng-show="submitted && openstackForm.connection_pool_size.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.flavor.$invalid}">
+                <label>
+                    Choose flavor <span tooltip="This will load when you fill in your credentials" class="glyphicon glyphicon-question-sign"></span>
+                </label>
+                <select required class="form-control" name="dbFlavor" ng-options="flavor for flavor in flavors" ng-model="formData.db.flavor">
+                </select>
+                <span class="help-block" ng-show="submitted && openstackForm.dbFlavor.$invalid">Required</span>
+            </div>
+        </div>
+        <div ng-if="formData.db_provider == 'mongodb'">
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.sharding.$invalid}">
+                <label>
+                    Do you want use sharding?
+                </label>
+                <div class="radio">
+                    <label>
+                        <input type="radio" value="yes" name="sharding" ng-model="formData.sharding" required>
+                        Yes
+                    </label>
+                </div>
+                <div class="radio">
+                    <label>
+                        <input type="radio" value="no" name="sharding" ng-model="formData.sharding" required>
+                        No
+                    </label>
+                </div>
+                <span class="help-block" ng-show="submitted && openstackForm.sharding.$invalid">Required</span>
+            </div>
+            <div ng-if="formData.sharding == 'yes'" class="form-group" ng-class="{'has-error' : submitted && openstackForm.num_shards.$invalid}">
+                <label>
+                    How many shards do you want?
+                </label>
+                <input class="form-control" type="number" min="2" max="10" name="num_shards" ng-model="formData.db.num_shards">
+                <span class="help-block" ng-show="submitted && openstackForm.num_shards.$invalid">Required</span>
+            </div>
+            <div class="form-group" ng-class="{'has-error' : submitted && openstackForm.flavor.$invalid}">
+                <label>
+                    Choose flavor <span tooltip="This will load when you fill in your credentials" class="glyphicon glyphicon-question-sign"></span>
+                </label>
+                <select required class="form-control" name="dbFlavor" ng-options="flavor for flavor in flavors" ng-model="formData.db.flavor">
+                </select>
+                <span class="help-block" ng-show="submitted && openstackForm.dbFlavor.$invalid">Required</span>
+            </div>
+        </div>
+        <hr>
+        <div class="text-center">
+            <button name="prev" ng-click="prevStep('/step3')" class="btn btn-primary">Prev</button>
+            <button name="next" type="submit" class="btn btn-primary">Finish</button>
+        </div>
+    </form>
+</div>
diff --git a/deployment-scripts/form/templates/form/form-step5.html b/deployment-scripts/form/templates/form/form-step5.html
new file mode 100644
index 0000000..d98e687
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step5.html
@@ -0,0 +1,27 @@
+<h2 class="text-center">Upload JMeter scenario</h2>
+<hr>
+<form name="form" enctype="multipart/form-data" novalidate ng-submit="nextStep('/step7', form)">
+    {% csrf_token %}
+    <div class="form-group" ng-class="{'has-error' : submitted && form.num_threads.$invalid}">
+        <label>
+            Number of threads:
+        </label>
+        <input type="number" name="num_threads" min="0" max="5000" ng-model="formData.num_threads" class="form-control">
+        <span class="help-block" ng-show="submitted && form.num_threads.$invalid">Required</span>
+    </div>
+    <div class="form-group">
+        <label>
+            Upload scenario
+        </label>
+        <div  class="dropzone" style="">
+            <div ng-class="{'ng-hide' : uploaded}" class="dz-message">
+                Click or drop scenario here
+            </div>
+        </div>
+    </div>
+    <hr>
+    <div class="text-center">
+        <button name="prev" type="button" ng-click="prevStep('/step4')" class="btn btn-primary">Prev</button>
+        <button name="next" type="submit" class="btn btn-primary">Next</button>
+    </div>
+</form>
diff --git a/deployment-scripts/form/templates/form/form-step6.html b/deployment-scripts/form/templates/form/form-step6.html
new file mode 100644
index 0000000..2720672
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step6.html
@@ -0,0 +1,11 @@
+<h2>Summary</h2>
+<div class="form-group">
+    <label>
+        Provider
+    </label>
+    <span>
+    {% verbatim %}
+        {{ formData.provider }}
+    {% endverbatim %}
+    </span>
+</div>
\ No newline at end of file
diff --git a/deployment-scripts/form/templates/form/form-step7.html b/deployment-scripts/form/templates/form/form-step7.html
new file mode 100644
index 0000000..150c7af
--- /dev/null
+++ b/deployment-scripts/form/templates/form/form-step7.html
@@ -0,0 +1,6 @@
+{% csrf_token %}
+    <div class="alert alert-danger" ng-repeat="error in errors">
+        {%  verbatim %}
+        <span ng-bind-html="trustAsHtml(error)">{{ error }}</span>
+        {% endverbatim %}
+    </div>
\ No newline at end of file
diff --git a/deployment-scripts/form/templates/form/home.html b/deployment-scripts/form/templates/form/home.html
new file mode 100644
index 0000000..fa2e6f3
--- /dev/null
+++ b/deployment-scripts/form/templates/form/home.html
@@ -0,0 +1,30 @@
+{% load staticfiles %}
+<!DOCTYPE html>
+<html ng-app="formApp">
+<head>
+    <title>Cloudscale load testing tool</title>
+    <link href="{% static "../../static/css/bootstrap/bootstrap.min.css" %}" rel="stylesheet" />
+    <link href="{% static "../../static/css/main.css" %}" rel="stylesheet" />
+
+    <!-- JS -->
+	<!-- load angular, nganimate, and ui-router -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
+    <script type="text/javascript" src="{% static "../../static/js/bootstrap/bootstrap.min.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/angular/angular.min.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/angular/angular-file-upload.min.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/app/dropzone.js" %}"></script>
+    <script src="//code.angularjs.org/1.3.0-beta.14/angular-cookies.js"></script>
+    <script src="//code.angularjs.org/1.3.0-beta.14/angular-route.js"></script>
+	<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular-animate.min.js"></script>
+	<script src="{% static "../../static/js/app/app.js" %}"></script>
+    <script src="{% static "../../static/js/app/directives.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/angular/ui-bootstrap-tpls-0.11.0.min.js" %}"></script>
+
+</head>
+<body>
+<div class="container">
+{% block content %}
+{% endblock %}
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/form/tests.py b/deployment-scripts/form/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/deployment-scripts/form/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/deployment-scripts/form/urls.py b/deployment-scripts/form/urls.py
new file mode 100644
index 0000000..54ea82c
--- /dev/null
+++ b/deployment-scripts/form/urls.py
@@ -0,0 +1,22 @@
+from django.conf.urls import patterns, url, include
+from django.views.generic import TemplateView
+from form import views
+
+angular_patterns = patterns('',
+    url(r'^form-step1.html$', TemplateView.as_view(template_name='form/form-step1.html'), name="form-step1"),
+    url(r'^form-step2.html$', TemplateView.as_view(template_name='form/form-step2.html'), name="form-step2"),
+    url(r'^form-step3.html$', TemplateView.as_view(template_name='form/form-step3.html'), name="form-step3"),
+    url(r'^form-step4.html$', TemplateView.as_view(template_name='form/form-step4.html'), name="form-step4"),
+    url(r'^form-step5.html$', TemplateView.as_view(template_name='form/form-step5.html'), name="form-step5"),
+    url(r'^form-step6.html$', TemplateView.as_view(template_name='form/form-step6.html'), name="form-step6"),
+    url(r'^form-step7.html$', TemplateView.as_view(template_name='form/form-step7.html'), name="form-step7")
+)
+
+urlpatterns = patterns('',
+    url(r'^$', views.form, name='form'),
+    url(r'^', include(angular_patterns), name='angular-patterns'),
+    url(r'^finish$', views.form_finish, name='form-finish'),
+    url(r'^ec2-instance-types$', views.ec2_instance_types, name='ec2-instance-types'),
+    url(r'^rds-instance-types$', views.rds_instance_types, name='rds-instance-types'),
+    url(r'^get-openstack-data$', views.get_openstack_data, name='get-openstack-data'),
+)
\ No newline at end of file
diff --git a/deployment-scripts/form/validate.py b/deployment-scripts/form/validate.py
new file mode 100644
index 0000000..80e30cc
--- /dev/null
+++ b/deployment-scripts/form/validate.py
@@ -0,0 +1,62 @@
+from form.models import Ec2InstanceTypes, RDSInstanceTypes
+
+
+class Validate:
+
+    def flavor(self, data):
+        errors = []
+        if data['fr']['own_infrastructure'] == 'yes':
+            if data['fr']['auth_url'] == None:
+                errors.append("You need to provide authentication url for OpenStack")
+            if data['fr']['username'] == None:
+                errors.append("You need to provide username for OpenStack")
+            if data['fr']['password'] == None:
+                errors.append("You need to provide password for OpenStack")
+            if data['fr']['tenant'] == None:
+                errors.append("You need to provide tenant for OpenStack")
+        elif data['fr']['own_infrastructure'] == None:
+            errors.append("You need to select which OpenStack infrastructure you want to use")
+        return errors
+
+    def finish(self, data):
+        errors = []
+        if data.get('provider') == None:
+            errors.append('You need to choose provider at <a href="#/step2">step 2</a>!')
+
+        if data.get('db_provider') == None:
+            errors.append('You need to choose database provider! at <a href="#/step2">step 2</a>!')
+
+        if data.get('provider') == 'aws':
+            if data.get('fr').get('access_key') == None:
+                errors.append('You need to provide access key at <a href="#/step3">step 3</a>!')
+
+            if data.get('fr').get('secret_key') == None:
+                errors.append('You need to provide secret key at <a href="#/step3">step 3</a>!')
+
+            if data.get('fr').get('autoscaling') == None:
+                errors.append('You need to choose if you want autoscaling or not at <a href="#/step3">step 3</a>!')
+
+            if data.get('fr').get('autoscaling') == 'no' and data.get('fr').get('num_instances') == None:
+                errors.append(
+                    'You chose that you don\'t want autoscaling but didn\'t choose how many instances do you want at <a href="#/step3">step 3</a>')
+
+            if data.get('fr').get('instance_type') not in [i.instance_type for i in Ec2InstanceTypes.objects.all()]:
+                errors.append('You need to choose a valid instance type at <a href="#/step3">step 3</a>!')
+
+            if data.get('db_provider') == 'mysql':
+                if data.get('db').get('num_instances') == None:
+                    errors.append('You need to choose the number of database instances at <a href="#/step4">step 4</a>')
+
+                if data.get('db').get('connection_pool_size') == None:
+                    errors.append('You need to specify the size of connection pool at <a href="#/step4">step 4</a>')
+
+                if data.get('db').get('instance_type') not in [i.instance_type for i in RDSInstanceTypes.objects.all()]:
+                    errors.append('You need to choose the instance type at <a href="#/step4">step 4</a>!')
+            else:
+                errors.append("You chose the AWS provider, and only supported database with that provider is MySQL!")
+
+        if data.get('provider') == 'openstack':
+            # TODO: validate openstack form
+            pass
+
+        return errors
diff --git a/deployment-scripts/form/views.py b/deployment-scripts/form/views.py
new file mode 100644
index 0000000..1250534
--- /dev/null
+++ b/deployment-scripts/form/views.py
@@ -0,0 +1,97 @@
+import json
+import uuid
+
+from django.http import HttpResponse
+from django.shortcuts import render
+import shutil
+from django.views.decorators.csrf import csrf_exempt
+import novaclient.v1_1 as novaclient
+from common.models import Task
+from form.validate import Validate
+import workers.tasks
+from workers.config import Config
+
+from models import Ec2InstanceTypes, RDSInstanceTypes
+from scripts.common.Cloudscale import *
+from webservice.settings import BASE_DIR
+from common.logger import Logger
+
+
+def home(request):
+    return render(request, "form/home.html")
+
+
+def form(request):
+    if request.session.get('uid') == None:
+        request.session['uid'] = str(uuid.uuid4())
+
+    return render(request, "form/form.html", {'uid': request.session.get('uid')})
+
+
+def ec2_instance_types(request):
+    instance_types = Ec2InstanceTypes.objects.all()
+
+    return HttpResponse(json.dumps([i.instance_type for i in instance_types]), content_type='application/json')
+
+
+def rds_instance_types(request):
+    instance_types = RDSInstanceTypes.objects.all()
+    return HttpResponse(json.dumps([i.instance_type for i in instance_types]), content_type='application/json')
+
+#@csrf_exempt
+def get_openstack_data(request):
+    if request.is_ajax():
+        data = json.loads(request.POST['formData']) if request.POST.get('formData', None) else json.loads(request.body)
+        errors = Validate().flavor(data)
+        if len(errors) == 0:
+            if data['fr']['own_infrastructure'] == 'yes':
+                username = data['fr']['username']
+                password = data['fr']['password']
+                tenant = data['fr']['tenant']
+                auth_url = data['fr']['auth_url']
+            else:
+                config_path = BASE_DIR + '/scripts/config.ini'
+                cfg = read_config(config_path)
+                username = cfg.get('OPENSTACK', 'username')
+                password = cfg.get('OPENSTACK', 'password')
+                tenant = cfg.get('OPENSTACK', 'tenant_name')
+                auth_url = cfg.get('OPENSTACK', 'auth_url')
+            nc = novaclient.Client(username, password, tenant, auth_url)
+            response_data = {'flavors' : [f.name for f in nc.flavors.list()], 'images' : [i.name for i in nc.images.list()]}
+            return HttpResponse(content_type="application/json", content=json.dumps(response_data))
+        return HttpResponse(content_type="application/json", content=json.dumps({'errors' : errors}), status=500)
+    return HttpResponse('Only AJAX request allowed!', status=400)
+
+def form_finish(request):
+    errors = []
+    if request.is_ajax():
+        data = json.loads(request.POST.get('formData')) if request.POST.get('formData', None) else json.loads(request.body)
+        errors += Validate().finish(data)
+        if len(errors) == 0:
+            task = Task(task_id=uuid.uuid4())
+            task.save()
+
+            path = '%s/webservice/users/%s' % (BASE_DIR, task.task_id)
+            if not os.path.exists(path):
+                os.makedirs(path)
+
+            # copy config.ini template to user dir
+            shutil.copy2('%s/../scripts/config.ini' % os.path.abspath(os.path.dirname(__file__)), path)
+            config = Config(data, path)
+            if data['provider'] == 'aws':
+                master_identifier = data['db']['master_identifier']
+                replica_identifier = data['db']['replica_identifier']
+                config.cfg.save_user_option('RDS', 'master_identifier', master_identifier)
+                config.cfg.save_user_option('RDS', 'replica_identifier', replica_identifier)
+
+            workers.tasks.setup.delay(config, path, Logger(task))
+
+            return HttpResponse(json.dumps({'task_id' : str(task.task_id)}), status=200, content_type="application/json")
+    else:
+        errors.append("Only AJAX requests allowed")
+
+    return HttpResponse(json.dumps({'errors': errors}), status=500, content_type='application/json')
+
+
+
+
diff --git a/deployment-scripts/manage.py b/deployment-scripts/manage.py
new file mode 100644
index 0000000..6a011d6
--- /dev/null
+++ b/deployment-scripts/manage.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webservice.settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
diff --git a/deployment-scripts/requirements.txt b/deployment-scripts/requirements.txt
new file mode 100644
index 0000000..0c7ce2a
--- /dev/null
+++ b/deployment-scripts/requirements.txt
@@ -0,0 +1,25 @@
+Babel==1.3
+Django==1.6.5
+Fabric==1.9.0
+South==1.0
+amqp==1.4.5
+anyjson==0.3.3
+argparse==1.2.1
+billiard==3.3.0.18
+boto==2.31.1
+celery==3.1.13
+ecdsa==0.11
+gunicorn==19.1.0
+iso8601==0.1.10
+kombu==3.0.21
+paramiko==1.14.0
+pbr==0.10.0
+prettytable==0.7.2
+pycrypto==2.6.1
+python-novaclient==2.18.1
+pytz==2014.4
+requests==2.3.0
+selenium==2.42.1
+simplejson==3.6.2
+six==1.7.3
+wsgiref==0.1.2
diff --git a/deployment-scripts/results/__init__.py b/deployment-scripts/results/__init__.py
new file mode 100644
index 0000000..8f76346
--- /dev/null
+++ b/deployment-scripts/results/__init__.py
@@ -0,0 +1 @@
+__author__ = 'ivansek'
diff --git a/deployment-scripts/results/templates/results.html b/deployment-scripts/results/templates/results.html
new file mode 100644
index 0000000..c02d7c6
--- /dev/null
+++ b/deployment-scripts/results/templates/results.html
@@ -0,0 +1,77 @@
+{% load staticfiles %}
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <link href="{% static "../../static/css/bootstrap/bootstrap.min.css" %}" rel="stylesheet"/>
+    <link href="{% static "../../static/css/main.css" %}" rel="stylesheet"/>
+    <link href='http://fonts.googleapis.com/css?family=VT323' rel='stylesheet' type='text/css'>
+    <!-- JS -->
+    <!-- load angular, nganimate, and ui-router -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
+    <script type="text/javascript" src="{% static "../../static/js/bootstrap/bootstrap.min.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/angular/angular.min.js" %}"></script>
+    <script type="text/javascript" src="{% static "../../static/js/angular/angular-file-upload.min.js" %}"></script>
+    <script type="text/javascript">
+        var app = angular.module('results', [])
+        app.config(function ($httpProvider) {
+
+            $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
+            $httpProvider.defaults.xsrfCookieName = 'csrftoken';
+            $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
+        });
+        app.controller('logCtrl', function ($scope, $sce, $http, $timeout) {
+            var poll = function () {
+                var promise = $timeout(function () {
+
+                    $http.get('{{ path }}')
+                    .success(function (response) {
+                            $scope.logs = response.logs
+                            if (response.fin)
+                            {
+                                $scope.finished = true
+                                $scope.$apply()
+                            }
+                    })
+                    .error(function (response) {
+                        console.log(response)
+                    })
+                    if (!$scope.finished)
+                    {
+                        $timeout.cancel(promise)
+                        poll()
+                    }
+                }, 2000)
+            }
+            $scope.trustAsHtml = function(txt){
+                return $sce.trustAsHtml(txt)
+            }
+            poll()
+        })
+    </script>
+    <style type="text/css">
+        .output{
+            background-color: #141414;
+            font-family: monospace;
+            color: #ffff00;
+            padding: 10px;
+            width: 600px;
+            margin: auto;
+            height: 500px;
+            overflow-y: scroll;
+        }
+    </style>
+</head>
+<body ng-app="results">
+<div ng-controller="logCtrl" class="output">
+    <div ng-repeat="log in logs track by $index">
+    {% verbatim %}
+    {{ trustAsHtml(log) }}
+    {% endverbatim %}
+    </div>
+    <div ng-show="finished">
+        Now you can use our <a href="/distributed-jmeter/">tool for distributed jmeter</a> to test your deployment.
+    </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/results/views.py b/deployment-scripts/results/views.py
new file mode 100644
index 0000000..22bfe80
--- /dev/null
+++ b/deployment-scripts/results/views.py
@@ -0,0 +1,18 @@
+import json
+from django.http import HttpResponse
+from django.shortcuts import render, get_object_or_404
+from common.models import Task, Log
+
+
+def task(request, task_id):
+    if request.is_ajax():
+        task = get_object_or_404(Task, task_id=task_id)
+
+        logs = Log.objects.filter(task=task)
+        fin = False
+        for log in logs:
+            if log.fin:
+                fin = log.fin
+
+        return HttpResponse(json.dumps({'logs' : [log.log for log in logs], 'fin' : fin}), content_type='application/json')
+    return render(request, "results.html", {'path' : request.path})
\ No newline at end of file
diff --git a/deployment-scripts/scripts/__init__.py b/deployment-scripts/scripts/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/__init__.py
diff --git a/deployment-scripts/scripts/common/__init__.py b/deployment-scripts/scripts/common/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/common/__init__.py
diff --git a/deployment-scripts/scripts/common/Cloudscale.py b/deployment-scripts/scripts/common/Cloudscale.py
new file mode 100644
index 0000000..81530e4
--- /dev/null
+++ b/deployment-scripts/scripts/common/Cloudscale.py
@@ -0,0 +1,34 @@
+import boto
+import sys, os
+
+def read_config(config_file):
+    cfg = boto.Config()
+    cfg.load_from_path(os.path.abspath(config_file))
+
+    return cfg
+
+def usage(args):
+    print 'Usage:\n $ python %s %s' % (sys.argv[0].split("/")[-1], args)
+
+def check_args(num_args, args_desc):
+    if len(sys.argv) < num_args+1:
+        usage(args_desc)
+        exit(0)
+
+
+def parse_args(provider='EC2'):
+    config_file = sys.argv[1]
+
+    if not os.path.isfile(config_file):
+        print config_file + ' doesn\'t exist!'
+        exit(0)
+
+    cfg = read_config(config_file)
+    key_name = cfg.get('EC2', 'key_name')
+    key_pair = os.path.abspath(cfg.get('EC2', 'key_pair'))
+    if provider != 'OPENSTACK' and not os.path.isfile(key_pair):
+        print key_pair + ' doesn\'t exist!'
+        exit(0)
+
+    return config_file, cfg, key_name, key_pair
+
diff --git a/deployment-scripts/scripts/infrastructure/__init__.py b/deployment-scripts/scripts/infrastructure/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/__init__.py
diff --git a/deployment-scripts/scripts/infrastructure/aws/__init__.py b/deployment-scripts/scripts/infrastructure/aws/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/__init__.py
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws_create_ami.py b/deployment-scripts/scripts/infrastructure/aws/aws_create_ami.py
new file mode 100644
index 0000000..3863171
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws_create_ami.py
@@ -0,0 +1,88 @@
+# from common.Cloudscale import *
+import boto.ec2
+import time
+from scripts.common.Cloudscale import check_args, parse_args
+
+
+class EC2CreateAMI:
+
+    def __init__(self, config, logger):
+        self.logger = logger
+        self.cfg = config.cfg
+        self.config = config
+        self.key_name = self.cfg.get('EC2', 'key_name')
+        self.key_pair = self.cfg.get('EC2', 'key_pair')
+        self.conn = boto.ec2.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+
+        ami_id = self.create_ami(self.cfg.get('infrastructure', 'ip_address'))
+        self.config.save('infrastructure', 'ami_id', ami_id)
+        self.logger.log("Done")
+
+    def create_ami(self, instance_ip):
+        self.logger.log("Creating AMI from instance %s" % instance_ip)
+        if instance_ip is None:
+            self.logger.log("instance_ip is null")
+            exit(0)
+
+        instance_id = None
+        for instance in self.conn.get_only_instances():
+            if instance.ip_address == instance_ip:
+                instance_id = instance.id
+                break
+
+        if instance_id is None:
+            self.logger.log("Can't find any instances to create ami from!")
+            exit(0)
+        try:
+            image_id = self.conn.create_image(instance_id, 'cloudscale-as-image')
+            self.wait_available(image_id)
+            self.terminate_instance(instance_id)
+            return image_id
+        except boto.exception.EC2ResponseError as e:
+            if str(e.error_code) == 'InvalidAMIName.Duplicate':
+                image = self.conn.get_all_images(filters={'name' : 'cloudscale-as-image'})[0]
+                image.deregister()
+                return self.create_ami(instance_ip)
+        self.logger.log("Error creating AMI image")
+        exit(0)
+
+    def terminate_instance(self, instance_id):
+        self.conn.terminate_instances([instance_id])
+        self.wait_terminate(instance_id)
+
+    def wait_available(self, image_id):
+        self.logger.log("Waiting to create AMI from instance ..")
+        status = self.conn.get_all_images(image_ids=[image_id])[0].state
+        i=1
+        while status != 'available':
+            if i%10 == 0:
+                self.logger.log("\nPlease wait .")
+            self.logger.log(".", append_to_last=True)
+            status = self.conn.get_all_images(image_ids=[image_id])[0].state
+            time.sleep(3)
+            i=i+1
+
+        self.logger.log("Done")
+
+    def wait_terminate(self, instance_id):
+        self.logger.log("Waiting for instance to terminate\nPlease wait ..")
+        status = self.conn.get_all_instances([instance_id])[0].instances[0].state
+        i=1
+        while status != 'terminated':
+            if i%10 == 0:
+                self.logger.log("\nPlease wait .")
+            self.logger.log(".", append_to_last=True)
+            status = self.conn.get_all_instances([instance_id])[0].instances[0].state
+            time.sleep(3)
+            i=i+1
+
+        self.logger.log("Instance is terminated!")
+
+if __name__ == "__main__":
+    check_args(1, "<config_path>")
+    config_file, cfg, key_name, key_pair = parse_args()
+    EC2CreateAMI(config_file, cfg, key_name, key_pair)
+
+
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws_create_autoscalability.py b/deployment-scripts/scripts/infrastructure/aws/aws_create_autoscalability.py
new file mode 100644
index 0000000..61f7f2e
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws_create_autoscalability.py
@@ -0,0 +1,148 @@
+import boto.ec2.elb
+import boto.ec2.autoscale
+from boto.ec2.autoscale import AutoScalingGroup
+from boto.ec2.autoscale import LaunchConfiguration
+from boto.ec2.autoscale import ScalingPolicy
+import boto.ec2.cloudwatch
+from boto.ec2.cloudwatch import MetricAlarm
+from scripts.common.Cloudscale import *
+
+class Autoscalability:
+    def __init__(self, config, key_name, key_pair, logger):
+        self.cfg = config.cfg
+        self.logger = logger
+        self.config = config
+        self.key_name = key_name
+        self.key_pair = key_pair
+
+    def create(self):
+        self.conn = boto.ec2.autoscale.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        lb = self.create_load_balancer()
+        self.create_security_group('http', 'Security group for HTTP', '0.0.0.0/0', '80')
+        self.create_security_group('ssh', 'Security group for SSH', '0.0.0.0/0', '22')
+
+        lc = self.create_launch_configuration()
+        self.create_autoscalability_group(lb.name, lc)
+        scale_up_policy_arn, scale_down_policy_arn = self.create_scaling_policy()
+        self.create_cloudwatch_alarms(scale_up_policy_arn, scale_down_policy_arn)
+        return lb.dns_name
+
+    def create_cloudwatch_alarms(self, scale_up_policy_arn, scale_down_policy_arn):
+        self.logger.log("Creating CloudWatch alarms ...")
+
+        conn = boto.ec2.cloudwatch.connect_to_region(self.cfg.get('EC2', 'region'),
+                                                     aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                                     aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        alarm_dimensions = {'AutoScalingGroupName' : 'cloudscale-as'}
+
+        scale_up_alarm = MetricAlarm(
+            name='scale_up_on_cpu', namespace='AWS/EC2',
+            metric='CPUUtilization', statistic='Average',
+            comparison='>', threshold='70',
+            period='60', evaluation_periods=1,
+            alarm_actions=[scale_up_policy_arn],
+            dimensions=alarm_dimensions)
+
+        scale_down_alarm = MetricAlarm(
+            name='scale_down_on_cpu', namespace='AWS/EC2',
+            metric='CPUUtilization', statistic='Average',
+            comparison='<', threshold='20',
+            period='60', evaluation_periods=1,
+            alarm_actions=[scale_down_policy_arn],
+            dimensions=alarm_dimensions)
+
+        conn.create_alarm(scale_up_alarm)
+        conn.create_alarm(scale_down_alarm)
+
+    def create_scaling_policy(self):
+        self.logger.log("Creating scaling policy ...")
+        scale_up_policy = ScalingPolicy(name='scale_up',
+                                        adjustment_type='ChangeInCapacity',
+                                        as_name='cloudscale-as',
+                                        scaling_adjustment=1,
+                                        cooldown=120
+                        )
+        scale_down_policy = ScalingPolicy(name='scale_down',
+                                          adjustment_type='ChangeInCapacity',
+                                          as_name='cloudscale-as',
+                                          scaling_adjustment=-1,
+                                          cooldown=120)
+        self.conn.create_scaling_policy(scale_up_policy)
+        self.conn.create_scaling_policy(scale_down_policy)
+        scale_up_policy = self.conn.get_all_policies(
+            as_group='cloudscale-as', policy_names=['scale_up'])[0]
+        scale_down_policy = self.conn.get_all_policies(
+            as_group='cloudscale-as', policy_names=['scale_down'])[0]
+
+        return scale_up_policy.policy_arn, scale_down_policy.policy_arn
+
+    def create_launch_configuration(self):
+        self.logger.log("Creating launch configuration ...")
+
+        try:
+            lc = LaunchConfiguration(self.conn,
+                                 "cloudscale-lc",
+                                 self.cfg.get('infrastructure', 'ami_id'),
+                                 self.key_name,
+                                 ['http'],
+                                 None,
+                                 self.cfg.get('EC2', 'instance_type'),
+				instance_monitoring=True)
+
+            self.conn.create_launch_configuration(lc)
+            return lc
+        except boto.exception.BotoServerError as e:
+            if e.error_code == 'AlreadyExists':
+                return self.conn.get_all_launch_configurations(names=['cloudscale-lc'])
+            else:
+                raise
+
+    def create_autoscalability_group(self, lb_name, lc):
+        self.logger.log("Creating autoscalability group ...")
+
+        try:
+            ag = AutoScalingGroup(group_name='cloudscale-as',
+                              load_balancers=[lb_name],
+                              availability_zones=self.cfg.get('EC2', 'availability_zones').split(","),
+                              launch_config=lc, min_size=1, max_size=10, connection=self.conn)
+            self.conn.create_auto_scaling_group(ag)
+        except boto.exception.BotoServerError as e:
+            if e.error_code != 'AlreadyExists':
+                raise # self.conn.get_all_groups(names=['cloudscale-as'])[0]
+
+
+    def create_security_group(self, name, description, cidr, port):
+        try:
+            conn = boto.ec2.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+            conn.create_security_group(name, description)
+            conn.authorize_security_group(group_name=name, ip_protocol='tcp', from_port=port, to_port=port, cidr_ip=cidr)
+
+            conn.create_dbsecurity_group(name, description)
+            conn.authorize_dbsecurity_group(name, cidr, name)
+        except boto.exception.EC2ResponseError as e:
+            if str(e.error_code) != 'InvalidGroup.Duplicate':
+                raise
+
+    def create_load_balancer(self):
+        self.logger.log("Creating load balancer ...")
+        conn = boto.ec2.elb.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+
+        zones = self.cfg.get('EC2', 'availability_zones').split(",")
+        ports = [(80, 80, 'http')]
+
+        lb = conn.create_load_balancer('cloudscale-lb', zones, ports)
+
+        return lb
+
+
+if __name__ == "__main__":
+    check_args(1, "<config_path>")
+    _, cfg, key_name, key_pair = parse_args()
+
+    Autoscalability(cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws_create_instance.py b/deployment-scripts/scripts/infrastructure/aws/aws_create_instance.py
new file mode 100644
index 0000000..35c7b06
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws_create_instance.py
@@ -0,0 +1,84 @@
+import boto, boto.exception
+import boto, boto.ec2
+import boto.manage.cmdshell
+import time
+import paramiko
+
+import sys, os
+from scripts.common.Cloudscale import *
+
+class CreateEC2Instance:
+
+    def __init__(self, cfg, logger):
+        self.key_pair = cfg.get('EC2', 'key_pair')
+        self.key_name = cfg.get('EC2', 'key_name')
+        self.cfg = cfg
+        self.conn = boto.ec2.connect_to_region(
+            self.cfg.get('EC2', 'region'),
+            aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+            aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key')
+        )
+        self.logger = logger
+
+
+    def create(self):
+        self.create_security_groups()
+        instance = self.create_instance()
+        #self.write_config(instance)
+        return instance
+
+    def create_security_groups(self):
+        self.logger.log("Creating security groups http and ssh ...")
+        self.create_security_group('http', 'Security group for HTTP protocol', '80', '0.0.0.0/0')
+        self.create_security_group('ssh', 'Security group for HTTP protocol', '22', '0.0.0.0/0')
+
+    def create_security_group(self, name, description, port, cidr):
+        try:
+            self.conn.create_security_group(name, description)
+            self.conn.authorize_security_group(group_name=name, ip_protocol='tcp', from_port=port, to_port=port, cidr_ip=cidr)
+        except boto.exception.EC2ResponseError as e:
+            if str(e.error_code) != 'InvalidGroup.Duplicate':
+                raise
+
+    def create_instance(self):
+        self.logger.log("Creating EC2 instance ...")
+        res = self.conn.run_instances(
+            self.cfg.get('EC2', 'ami_id'),
+            key_name=self.key_name,
+            instance_type=self.cfg.get('EC2','instance_type'),
+            security_groups=['http', 'ssh'],
+            placement=self.cfg.get('EC2', 'availability_zones').split(',')[0]
+        )
+        self.wait_available(res.instances[0])
+        instance = self.conn.get_all_instances([res.instances[0].id])[0].instances[0]
+
+        return instance
+
+    def wait_available(self, instance):
+        self.logger.log("Waiting for instance to become available\nPlease wait . .")
+        status = self.conn.get_all_instances([instance.id])[0].instances[0].state
+        i=1
+        while status != 'running':
+            if i%10 == 0:
+                self.logger.log("\nPlease wait .")
+            self.logger.log(".", append_to_last=True)
+            status = self.conn.get_all_instances([instance.id])[0].instances[0].state
+            time.sleep(3)
+            i=i+1
+
+        self.logger.log("Instance is running!")
+
+
+    def write_config(self, instance):
+        self.cfg.save_user_option('infrastructure', 'remote_user', 'ubuntu')
+        self.cfg.save_user_option('infrastructure', 'ip_address', instance.ip_address)
+        # f = open(os.path.abspath('../infrastructure.ini'), 'w')
+        # f.write('[EC2]\n')
+        # f.write('remote_user=ubuntu\n')
+        # f.write('ip_address=' + instance.ip_address + '\n')
+        # f.close()
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    config_path, cfg, key_name, key_pair = parse_args()
+    CreateEC2Instance(config_path, cfg, key_pair, key_name)
\ No newline at end of file
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws_create_keypair.py b/deployment-scripts/scripts/infrastructure/aws/aws_create_keypair.py
new file mode 100644
index 0000000..91afd98
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws_create_keypair.py
@@ -0,0 +1,28 @@
+from boto import ec2
+import os
+from boto.exception import EC2ResponseError
+from webservice.settings import BASE_DIR
+
+class CreateKeyPair:
+
+    def __init__(self, config):
+        self.config = config
+        self.cfg = config.cfg
+
+    def create(self):
+        conn = ec2.connect_to_region(
+            self.cfg.get('EC2', 'region'),
+            aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+            aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key')
+        )
+
+        try:
+            keypair = conn.create_key_pair(self.cfg.get('EC2', 'key_name'))
+        except EC2ResponseError as e:
+            if e.error_code == 'InvalidKeyPair.Duplicate':
+                conn.delete_key_pair(key_name=self.cfg.get('EC2', 'key_name') )
+                keypair = conn.create_key_pair(self.cfg.get('EC2', 'key_name'))
+            else:
+                raise e
+
+        keypair.save(self.config.user_path)
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py b/deployment-scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py
new file mode 100644
index 0000000..7cc6627
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws_create_loadbalancer.py
@@ -0,0 +1,47 @@
+from boto import ec2
+from boto.exception import BotoServerError
+
+
+class CreateLoadbalancer:
+
+    def __init__(self, instances, config, logger):
+        self.instances = instances
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+
+    def create(self):
+        self.logger.log("Creating load balancer ...")
+        conn = ec2.elb.connect_to_region(self.cfg.get('EC2', 'region'),
+                                           aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                           aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+
+        zones = self.cfg.get('EC2', 'availability_zones').split(",")
+        ports = [(80, 80, 'http')]
+
+
+
+        lb_name = 'cloudscale-lb'
+        try:
+            lb = conn.get_all_load_balancers(load_balancer_names=[lb_name])
+        except BotoServerError as e:
+            lb =[]
+
+        i = 2
+        while len(lb) > 0:
+            lb_name = 'cloudscale-lb-%s' % i
+            try:
+                lb = conn.get_all_load_balancers(load_balancer_names=[lb_name])
+            except BotoServerError as e:
+                lb = []
+            i+=1
+
+        lb = conn.create_load_balancer(lb_name, zones, ports)
+
+        self.attach_instances(lb)
+
+        return lb
+
+    def attach_instances(self, lb):
+        lb.register_instances([i.id for i in self.instances])
diff --git a/deployment-scripts/scripts/infrastructure/aws/aws-remove-all.py b/deployment-scripts/scripts/infrastructure/aws/aws-remove-all.py
new file mode 100644
index 0000000..1d24523
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/aws/aws-remove-all.py
@@ -0,0 +1,239 @@
+import boto.ec2.elb
+import boto.rds
+import boto.ec2.autoscale
+from boto.ec2.autoscale import AutoScalingGroup
+from boto.ec2.autoscale import LaunchConfiguration
+from boto.ec2.autoscale import ScalingPolicy
+import boto.ec2.cloudwatch
+from boto.exception import BotoServerError
+from boto.ec2.cloudwatch import MetricAlarm
+from common.Cloudscale import *
+import time
+
+class RemoveAll:
+    def __init__(self, cfg, key_name, key_pair):
+        self.cfg = cfg
+        self.key_name = key_name
+        self.key_pair = key_pair
+        self.conn_ec2 = boto.ec2.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        self.conn_as = boto.ec2.autoscale.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        self.remove_cloudwatch_alarms()
+
+        self.remove_load_balancer()
+        self.remove_ami()
+        self.remove_ec2_instances()
+        self.remove_autoscale_group()
+        self.remove_launch_configuration()
+        self.remove_rds_instances()
+        # self.remove_security_groups()
+
+
+
+        print "Done"
+
+    def remove_rds_instances(self):
+        print "Removing RDS instances .."
+        conn = boto.rds.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+
+        try:
+            conn.delete_dbinstance(id='cloudscale-master', skip_final_snapshot=True)
+        except BotoServerError as e:
+            print e.message
+
+        num = self.cfg.get('RDS', 'num_replicas')
+        for i in xrange(int(num)):
+            try:
+                conn.delete_dbinstance(id='cloudscale-replica%s' % str(i+1), skip_final_snapshot=True)
+            except BotoServerError as e:
+                print e.message
+
+    def remove_ec2_instances(self):
+        print "Terminating EC2 instances ..."
+
+        group = self.conn_as.get_all_groups(['cloudscale-as'])
+        instance_ids = []
+        if len(group) > 0:
+            instance_ids = [i.instance_id for i in group[0].instances]
+
+        if len(instance_ids) > 0:
+            self.conn_ec2.terminate_instances(instance_ids=instance_ids)
+            for instance_id in instance_ids:
+                self.wait_terminate(instance_id)
+
+    def wait_terminate(self, instance_id):
+        print "Waiting for instance to terminate\nPlease wait . .",
+        status = self.conn_ec2.get_all_instances([instance_id])[0].instances[0].state
+        i=1
+        while status != 'terminated':
+            if i%10 == 0:
+                print "\nPlease wait .",
+            print ".",
+            status = self.conn_ec2.get_all_instances([instance_id])[0].instances[0].state
+            time.sleep(3)
+            i=i+1
+
+        print "Instance is terminated!"
+
+    def remove_autoscale_group(self):
+        print "Removing autoscale group ..."
+        try:
+            self.conn_as.delete_auto_scaling_group('cloudscale-as')
+        except BotoServerError as e:
+            print e.message
+
+
+    def remove_launch_configuration(self):
+        print "Removing launch configuration .."
+        try:
+            self.conn_as.delete_launch_configuration('cloudscale-lc')
+        except BotoServerError as e:
+            print e.message
+
+    def remove_cloudwatch_alarms(self):
+        print "Removing cloudwatch alarms ..."
+        conn_cw = boto.ec2.cloudwatch.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        conn_cw.delete_alarms(['scale_up_on_cpu', 'scale_down_on_cpu'])
+
+    def remove_security_groups(self):
+        print "Removing security groups ..."
+        self.conn_ec2.delete_security_group('ssh')
+        self.conn_ec2.delete_security_group('http')
+
+    def remove_load_balancer(self):
+        print "Removing load balancer ..."
+        conn_elb = boto.ec2.elb.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        conn_elb.delete_load_balancer('cloudscale-lb')
+
+    def remove_ami(self):
+        print "Removing ami ..."
+        try:
+            self.conn_ec2.deregister_image(self.cfg.get('infrastructure', 'ami_id'))
+        except:
+            pass
+
+    def create_cloudwatch_alarms(self, scale_up_policy_arn, scale_down_policy_arn):
+        print "Creating CloudWatch alarms"
+
+        conn = boto.ec2.cloudwatch.connect_to_region(self.cfg.get('EC2', 'region'),
+                                                     aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                                     aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        alarm_dimensions = {'AutoScalingGroupName' : 'cloudscale-as'}
+
+        scale_up_alarm = MetricAlarm(
+            name='scale_up_on_cpu', namespace='AWS/EC2',
+            metric='CPUUtilization', statistic='Average',
+            comparison='>', threshold='70',
+            period='60', evaluation_periods=2,
+            alarm_actions=[scale_up_policy_arn],
+            dimensions=alarm_dimensions)
+
+        scale_down_alarm = MetricAlarm(
+            name='scale_down_on_cpu', namespace='AWS/EC2',
+            metric='CPUUtilization', statistic='Average',
+            comparison='<', threshold='40',
+            period='60', evaluation_periods=2,
+            alarm_actions=[scale_down_policy_arn],
+            dimensions=alarm_dimensions)
+
+        conn.create_alarm(scale_up_alarm)
+        conn.create_alarm(scale_down_alarm)
+
+    def create_scaling_policy(self):
+        print "Creating scaling policy ..."
+        scale_up_policy = ScalingPolicy(name='scale_up',
+                                        adjustment_type='ChangeInCapacity',
+                                        as_name='cloudscale-as',
+                                        scaling_adjustment=2,
+                                        cooldown=180
+                        )
+        scale_down_policy = ScalingPolicy(name='scale_down',
+                                          adjustment_type='ChangeInCapacity',
+                                          as_name='cloudscale-as',
+                                          scaling_adjustment=-2,
+                                          cooldown=180)
+        self.conn.create_scaling_policy(scale_up_policy)
+        self.conn.create_scaling_policy(scale_down_policy)
+        scale_up_policy = self.conn.get_all_policies(
+            as_group='cloudscale-as', policy_names=['scale_up'])[0]
+        scale_down_policy = self.conn.get_all_policies(
+            as_group='cloudscale-as', policy_names=['scale_down'])[0]
+
+        return scale_up_policy.policy_arn, scale_down_policy.policy_arn
+
+    def create_launch_configuration(self):
+        print "Creating launch configuration ..."
+
+        try:
+            lc = LaunchConfiguration(self.conn,
+                                 "cloudscale-lc",
+                                 self.cfg.get('infrastructure', 'ami_id'),
+                                 self.key_name,
+                                 ['http'],
+                                 None,
+                                 self.cfg.get('EC2', 'instance_type'))
+
+            self.conn.create_launch_configuration(lc)
+            return lc
+        except boto.exception.BotoServerError as e:
+            if e.error_code == 'AlreadyExists':
+                return self.conn.get_all_launch_configurations(names=['cloudscale-lc'])
+            else:
+                raise
+
+    def create_autoscalability_group(self, lb_name, lc):
+        print "Creating autoscalability group ..."
+
+        try:
+            ag = AutoScalingGroup(group_name='cloudscale-as',
+                              load_balancers=[lb_name],
+                              availability_zones=self.cfg.get('EC2', 'availability_zones').split(","),
+                              launch_config=lc, min_size=2, max_size=8, connection=self.conn)
+            self.conn.create_auto_scaling_group(ag)
+        except boto.exception.BotoServerError as e:
+            if e.error_code != 'AlreadyExists':
+                raise # self.conn.get_all_groups(names=['cloudscale-as'])[0]
+
+
+    def create_security_group(self, name, description, cidr, port):
+        try:
+            conn = boto.ec2.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+            conn.create_security_group(name, description)
+            conn.authorize_security_group(group_name=name, ip_protocol='tcp', from_port=port, to_port=port, cidr_ip=cidr)
+
+            conn.create_dbsecurity_group(name, description)
+            conn.authorize_dbsecurity_group(name, cidr, name)
+        except boto.exception.EC2ResponseError as e:
+            if str(e.error_code) != 'InvalidGroup.Duplicate':
+                raise
+
+    def create_load_balancer(self):
+        print "Creating load balancer ..."
+        conn = boto.ec2.elb.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+
+        zones = self.cfg.get('EC2', 'availability_zones').split(",")
+        ports = [(80, 80, 'http')]
+
+        lb = conn.create_load_balancer('cloudscale-lb', zones, ports)
+
+        return lb.name
+
+
+if __name__ == "__main__":
+    check_args(1, "<config_path>")
+    _, cfg, key_name, key_pair = parse_args()
+
+    RemoveAll(cfg, key_name, key_pair)
\ No newline at end of file
diff --git a/deployment-scripts/scripts/infrastructure/openstack/__init__.py b/deployment-scripts/scripts/infrastructure/openstack/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/__init__.py
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py
new file mode 100644
index 0000000..8e60465
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_balancer_instance.py
@@ -0,0 +1,151 @@
+import base64
+from novaclient.v1_1 import client as novaclient
+import time
+from scripts.common.Cloudscale import *
+from webservice.settings import BASE_DIR
+
+
+class CreateInstance:
+
+    def __init__(self, config, logger):
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+
+        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
+        self.instance_name = 'cloudscale-lb'
+        self.num_instances = self.config.fr.get('num_instances')
+        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+        showcase_servers = self.nc.servers.findall(name="cloudscale-sc")
+
+        if len(showcase_servers) == 1:
+            self.logger.log("Only one instance")
+            server_id = showcase_servers[0].id
+            self.load_balancer_public_ip = self.add_floating_ip(server_id)
+            self.add_security_group(server_id, "ssh")
+            return
+
+        self.logger.log("Creating load balancer instance:")
+
+        self.file_path = BASE_DIR + "/scripts/software"
+
+        ha_proxy_config = open(self.file_path + '/haproxy.cfg', 'r').read()
+        checker = base64.b64encode(open(self.file_path + '/check-running-showcase_instances.py', 'r').read())
+        openstack_config = base64.b64encode(open(self.config.config_path, 'r').read())
+
+        #############################################################################################################
+        # TODO: remove this when instances can connect to openstack, as servers will be automatically added by script
+        # add showcase servers to config
+        for server in showcase_servers:
+            for address in server.addresses[server.addresses.keys()[0]]:
+                if address['OS-EXT-IPS:type'] == 'fixed':
+                    server_ip = address['addr']
+                    break
+            else:
+                server_ip = None
+                self.logger.log("Error: can not get IP address")
+            ha_proxy_config += """
+    server %s %s:80 check""" % (server_ip, server_ip)
+        #############################################################################################################
+
+        userdata = open(self.file_path + '/install-load-balancer.sh', 'r').read()
+        userdata = ha_proxy_config.join(
+            userdata.split("#####REPLACE_ME_WITH_CONFIG#####")
+        )
+        userdata = checker.join(
+            userdata.split("###PLACEHOLDER_FOR_checker.py###")
+        )
+        userdata = openstack_config.join(
+            userdata.split("###PLACEHOLDER_FOR_config.ini###")
+        )
+
+        server_id = self.create_instance(userdata=userdata)
+
+        self.add_security_group(server_id, "ssh")
+        self.add_security_group(server_id, "http")
+
+        self.load_balancer_public_ip = self.add_floating_ip(server_id)
+
+        self.logger.log('Done creating load balancer instance')
+
+    def get_public_ip(self):
+        return self.load_balancer_public_ip
+
+    def create_instance(self, image_name=None, files=None, userdata=None, wait_on_active_status=True):
+        if image_name is None:
+            image_name = self.image_name
+
+        for f in self.nc.flavors.list():
+            if f.name == self.instance_type:
+                flavor = f
+                break
+        else:
+            self.logger.log("Instance flavor '%s' not found!" % self.instance_type)
+            return False
+
+        for img in self.nc.images.list():
+            if img.name == image_name:
+                image = img
+                break
+        else:
+            self.logger.log("Image '%s' not found!" % image_name)
+            return False
+
+        server_id = self.nc.servers.create(
+            self.instance_name, image, flavor, key_name=self.key_name, files=files, userdata=userdata
+        ).id
+
+        if wait_on_active_status and not self.wait_active(server_id):
+            return False
+
+        return server_id
+
+    def wait_active(self, server_id):
+        self.logger.log("Waiting for instance to be built . . .")
+        status = self.wait_for_instance_status(server_id, u'BUILD', u'ACTIVE')
+        if not status:
+            self.logger.log("Can not start instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_for_instance_status(self, server_id, current_status, wait_for_status):
+        while True:
+            server = self.nc.servers.get(server_id)
+            if server.status != current_status:
+                if server.status == wait_for_status:
+                    return True
+                return False
+            time.sleep(1)
+
+    def add_floating_ip(self, server_id):
+        server = self.nc.servers.get(server_id)
+        unallocated_floating_ips = self.nc.floating_ips.findall(fixed_ip=None)
+        if len(unallocated_floating_ips) < 1:
+            unallocated_floating_ips.append(self.nc.floating_ips.create())
+        floating_ip = unallocated_floating_ips[0]
+        server.add_floating_ip(floating_ip)
+        return floating_ip.ip
+
+    def add_security_group(self, server_id, group_name):
+        self.logger.log("Adding security group %s" % group_name)
+        server = self.nc.servers.get(server_id)
+        server.add_security_group(group_name)
+
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    config_file, cfg, key_name, key_pair = parse_args('OPENSTACK')
+    CreateInstance(config_file, cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py
new file mode 100644
index 0000000..a65a763
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mongodb_instances.py
@@ -0,0 +1,296 @@
+import os
+from novaclient.v1_1 import client as novaclient
+import time
+import paramiko
+from scripts.common.Cloudscale import check_args, parse_args
+from webservice.settings import BASE_DIR
+
+
+class ConfigureMongodb:
+
+    def __init__(self, config, logger):
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+
+        self.instance_type = self.cfg.get('MONGODB', 'instance_type')
+        self.instance_name = 'cloudscale-db-mongo'
+        self.num_replicas = self.cfg.get('MONGODB', 'num_replicas')
+
+        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.mongodb_image_name = "cloudscale-db-mongo-image"
+
+        self.database_name = self.cfg.get('MONGODB', 'database_name')
+        self.database_user = self.cfg.get('MONGODB', 'database_user')
+        self.database_pass = self.cfg.get('MONGODB', 'database_pass')
+
+        self.generate_dump_path = BASE_DIR + '/scripts/' + self.cfg.get('MONGODB', 'generate_dump_path')
+
+        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
+
+        self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+        self.logger.log("Creating database instances:")
+        images = self.nc.images.list()
+        for image in images:
+            if image.name == self.mongodb_image_name:
+                self.logger.log('Image already exists.')
+                break
+        else:
+            self.file_path = BASE_DIR + "/scripts/software"
+
+            userdata = """#!/bin/bash
+USERNAME=%s
+""" % self.remote_user + open(self.file_path + '/install-mongodb.sh', 'r').read()
+
+            server_id = self.create_instance(userdata=userdata)
+            self.wait_powered_off(server_id)
+            self.create_image(server_id, self.mongodb_image_name)
+            self.delete_instance(server_id)
+
+            self.logger.log("Done creating database image")
+
+        database_server_ids = self.create_database_instances()
+
+        self.start_mongo_on_instances(database_server_ids)
+
+        self.logger.log('Done creating database instances')
+
+    def delete_instance(self, server_id):
+        self.logger.log("Deleting instance ...")
+        server = self.nc.servers.get(server_id)
+        server.delete()
+
+    def create_instance(self, image_name=None, userdata=None, wait_on_active_status=True):
+        if image_name is None:
+            image_name = self.image_name
+
+        for f in self.nc.flavors.list():
+            if f.name == self.instance_type:
+                flavor = f
+                break
+        else:
+            self.logger.log("Instance flavor '%s' not found!" % self.instance_type)
+            return False
+
+        for img in self.nc.images.list():
+            if img.name == image_name:
+                image = img
+                break
+        else:
+            self.logger.log("Image '%s' not found!" % image_name)
+            return False
+
+        server_id = self.nc.servers.create(self.instance_name, image, flavor, key_name=self.key_name, userdata=userdata).id
+
+        if wait_on_active_status and not self.wait_active(server_id):
+            return False
+
+        return server_id
+
+    def wait_active(self, server_id):
+        self.logger.log("Waiting for instance to be built . . .")
+        status = self.wait_for_instance_status(server_id, u'BUILD', u'ACTIVE')
+        if not status:
+            self.logger.log("Can not start instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_all_instances_active(self, instance_ids):
+        for instance_id in instance_ids:
+            self.wait_active(instance_id)
+
+    def wait_powered_off(self, server_id):
+        self.logger.log("Waiting for instance %s to be powered off . . ." % server_id)
+        status = self.wait_for_instance_status(server_id, u'ACTIVE', u'SHUTOFF')
+        if not status:
+            self.logger.log("Error on instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_for_instance_status(self, server_id, current_status, wait_for_status):
+        while True:
+            server = self.nc.servers.get(server_id)
+            if server.status != current_status:
+                if server.status == wait_for_status:
+                    return True
+                return False
+            time.sleep(1)
+
+    def add_floating_ip(self, server_id):
+        server = self.nc.servers.get(server_id)
+        unallocated_floating_ips = self.nc.floating_ips.findall(fixed_ip=None)
+        if len(unallocated_floating_ips) < 1:
+            unallocated_floating_ips.append(self.nc.floating_ips.create())
+        floating_ip = unallocated_floating_ips[0]
+        server.add_floating_ip(floating_ip)
+        return floating_ip.ip
+
+    def remove_floating_ip(self, server_id, floating_ip):
+        server = self.nc.servers.get(server_id)
+        server.remove_floating_ip(floating_ip)
+
+    def add_security_group(self, server_id, group_name):
+        self.logger.log("Adding security group %s" % group_name)
+        server = self.nc.servers.get(server_id)
+        server.add_security_group(group_name)
+
+    def create_image(self, server_id, image_name):
+        self.logger.log("Creating image ...")
+        server = self.nc.servers.get(server_id)
+        image_id = server.create_image(image_name)
+
+        while True:
+            image = self.nc.images.get(image_id)
+            if image.status == u'ACTIVE':
+                return True
+            if image.status == u'ERROR':
+                self.logger.log("Error creating image!")
+                return False
+            time.sleep(3)
+
+    def create_database_instances(self):
+        database_server_ids = []
+
+        for i in range(int(self.num_replicas)):
+            self.logger.log("Creating database instance %s ..." % (i + 1))
+            database_server_ids.append(
+                self.create_instance(image_name=self.mongodb_image_name, wait_on_active_status=False)
+            )
+
+        self.wait_all_instances_active(database_server_ids)
+        return database_server_ids
+
+    def upload_mongo_dump(self, ip_address):
+        self.logger.log("Connecting to ssh on %s" % ip_address)
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        while True:
+            try:
+                ssh.connect(ip_address, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                break
+            except:
+                time.sleep(5)
+
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        self.logger.log("Uploading mysql dump")
+        scp.put(self.generate_dump_path, 'dump.sql')
+
+        ssh.exec_command("sudo mv dump.sql /root/dump.sql")
+
+    def get_ip(self, server_id):
+        server = self.nc.servers.get(server_id)
+
+        for address in server.addresses[server.addresses.keys()[0]]:
+            if address['OS-EXT-IPS:type'] == 'fixed':
+                server_ip = address['addr']
+                break
+        else:
+            server_ip = None
+            self.logger.log("Error: can not get IP address of this server")
+        return server_ip
+
+    def ssh_execute_command(self, ssh, command):
+        transport = ssh.get_transport()
+        channel = transport.open_session()
+        channel.exec_command(command)
+        return channel.recv_exit_status()
+
+    def start_mongo_on_instances(self, database_server_ids):
+        self.logger.log("Creating ssh connections")
+        ssh_connections = []  # (server_id, ip_address, ssh, floating_ip)
+        for server_id in database_server_ids:
+            self.add_security_group(server_id, 'mongo')
+            self.add_security_group(server_id, 'ssh')
+            floating_ip = self.add_floating_ip(server_id)
+
+            self.logger.log("Connecting to ssh on %s" % floating_ip)
+            ssh = paramiko.SSHClient()
+            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+            while True:
+                try:
+                    ssh.connect(floating_ip, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                    break
+                except:
+                    time.sleep(5)
+
+            ssh_connections.append((server_id, self.get_ip(server_id), ssh, floating_ip))
+
+        config_servers = []
+
+        self.logger.log("Starting config servers")
+        num_config_servers = 3 if len(ssh_connections) >= 3 else 1
+        for i in range(num_config_servers):
+            config_servers.append(ssh_connections[i][1] + ":27019")
+            ssh = ssh_connections[i][2]
+            self.ssh_execute_command(
+                ssh,
+                """sudo mkdir -p /data/configdb
+sudo mongod --configsvr --dbpath /data/configdb --port 27019 --syslog --fork""")
+
+        config_servers = ','.join(config_servers)
+
+        self.logger.log("Starting mongos")
+        for i in range(len(ssh_connections)):
+            ssh = ssh_connections[i][2]
+            self.ssh_execute_command(ssh, "sudo mongos --configdb %s --syslog --fork" % config_servers)
+
+        self.logger.log("Adding shards")
+        for i in range(len(ssh_connections)):
+            ssh = ssh_connections[i][2]
+            fixed_ip = ssh_connections[i][1]
+            self.ssh_execute_command(ssh, """echo 'sh.addShard("%s:27037")' | mongo""" % fixed_ip)
+
+        # only on one server
+        ssh = ssh_connections[0][2]
+
+        self.logger.log("Configuring sharding for database and collections")
+        self.ssh_execute_command(ssh, """echo 'sh.enableSharding("%s")' | mongo""" % self.database_name)
+        collections = ['address', 'author', 'ccxacts', 'customer', 'item', 'orderLine',
+                       'orderLineMR', 'orders', 'shoppingCart', 'shoppingCartLine']
+        default_shard_key_pattern = '{ "_id": "hashed" }'
+        for collection in collections:
+            shard_key_pattern = default_shard_key_pattern
+            self.ssh_execute_command(ssh, """echo 'sh.shardCollection("%s.%s", %s )' | mongo"""
+                                          % (self.database_name, collection, shard_key_pattern))
+
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        self.logger.log("Uploading mongo dump")
+        scp.put(self.generate_dump_path, 'dump.tar.gz')
+
+        self.logger.log("Extracting mongo dump")
+        self.ssh_execute_command(ssh, "mkdir dump; tar xf dump.tar.gz -C dump")
+
+        self.logger.log("Importing mongo dump")
+        self.ssh_execute_command(ssh, "mongorestore --db tpcw dump/tpcw/")
+
+        self.logger.log("Removing dump.tar.gz and folder dump/")
+        self.ssh_execute_command(ssh, "rm dump.tar.gz; rm -r dump")
+
+        self.logger.log("Creating user")
+        self.ssh_execute_command(ssh, """echo 'db.createUser({
+    "user": "%s",
+    "pwd": "%s",
+    "roles": [ { "role": "readWrite", "db": "%s" } ]
+})' | mongo %s""" % (self.database_user, self.database_pass, self.database_name, self.database_name))
+
+        self.logger.log("Close ssh connections, and removing public IPs and ssh security groups")
+        for i in range(len(ssh_connections)):
+            server_id = ssh_connections[i][0]
+            fixed_ip = ssh_connections[i][1]
+            ssh = ssh_connections[i][2]
+            floating_ip = ssh_connections[i][3]
+            ssh.close()
+            self.remove_floating_ip(server_id, floating_ip)
+
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py
new file mode 100644
index 0000000..3a5e11f
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_mysql_instances.py
@@ -0,0 +1,225 @@
+import os
+from novaclient.v1_1 import client as novaclient
+import time
+import paramiko
+from scripts.common.Cloudscale import check_args, parse_args
+from webservice.settings import BASE_DIR
+
+
+class ConfigureMySQL:
+
+    def __init__(self, config, logger):
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+
+        self.instance_type = self.cfg.get('MYSQL', 'instance_type')
+        self.instance_name = 'cloudscale-db'
+        self.num_replicas = self.cfg.get('MYSQL', 'num_replicas')
+
+        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.galera_image_name = "cloudscale-db-image"
+
+        self.database_name = self.cfg.get('MYSQL', 'database_name')
+        self.database_user = self.cfg.get('MYSQL', 'database_user')
+        self.database_pass = self.cfg.get('MYSQL', 'database_pass')
+
+        self.generate_dump_path = BASE_DIR + '/scripts/' + self.cfg.get('MYSQL', 'generate_dump_path')
+
+        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
+
+        self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+        self.logger.log("Creating database instances:")
+        images = self.nc.images.list()
+        self.file_path = BASE_DIR + "/scripts/software"
+        for image in images:
+            if image.name == self.galera_image_name:
+                self.logger.log('Image already exists.')
+                break
+        else:
+
+            userdata = """#!/bin/bash
+DB_NAME=%s
+DB_USERNAME=%s
+DB_PASSWORD=%s
+""" % (self.database_name, self.database_user, self.database_pass) + """
+USERNAME=%s
+""" % self.remote_user + open(self.file_path + '/install-mysql-galera.sh', 'r').read() + """
+echo '
+""" + open(self.file_path + '/my.cnf', 'r').read().replace("'", "\"'\"") + """
+' > /etc/mysql/my.cnf
+""" + open(self.file_path + '/install-mysql-galera-import-dump.sh', 'r').read()
+
+            server_id = self.create_instance(userdata=userdata)
+            floating_ip = self.add_floating_ip(server_id)
+            self.add_security_group(server_id, "ssh")
+            self.upload_mysql_dump(floating_ip)
+
+            self.wait_powered_off(server_id)
+            self.create_image(server_id, self.galera_image_name)
+            self.delete_instance(server_id)
+
+            self.logger.log("Done creating database image")
+
+        self.create_database_instances()
+
+        self.logger.log('Done creating database instances')
+
+    def delete_instance(self, server_id):
+        self.logger.log("Deleting instance ...")
+        server = self.nc.servers.get(server_id)
+        server.delete()
+
+    def create_instance(self, image_name=None, userdata=None, wait_on_active_status=True):
+        if image_name is None:
+            image_name = self.image_name
+
+        for f in self.nc.flavors.list():
+            if f.name == self.instance_type:
+                flavor = f
+                break
+        else:
+            self.logger.log("Instance flavor '%s' not found!" % self.instance_type)
+            return False
+
+        for img in self.nc.images.list():
+            if img.name == image_name:
+                image = img
+                break
+        else:
+            self.logger.log("Image '%s' not found!" % image_name)
+            return False
+
+        server_id = self.nc.servers.create(self.instance_name, image, flavor, key_name=self.key_name, userdata=userdata).id
+
+        if wait_on_active_status and not self.wait_active(server_id):
+            return False
+
+        return server_id
+
+    def wait_active(self, server_id):
+        self.logger.log("Waiting for instance to be built . . .")
+        status = self.wait_for_instance_status(server_id, u'BUILD', u'ACTIVE')
+        if not status:
+            self.logger.log("Can not start instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_all_instances_active(self, instance_ids):
+        for instance_id in instance_ids:
+            self.wait_active(instance_id)
+
+    def wait_powered_off(self, server_id):
+        self.logger.log("Waiting for instance %s to be powered off . . ." % server_id)
+        status = self.wait_for_instance_status(server_id, u'ACTIVE', u'SHUTOFF')
+        if not status:
+            self.logger.log("Error on instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_for_instance_status(self, server_id, current_status, wait_for_status):
+        while True:
+            server = self.nc.servers.get(server_id)
+            if server.status != current_status:
+                if server.status == wait_for_status:
+                    return True
+                return False
+            time.sleep(1)
+
+    def add_floating_ip(self, server_id):
+        server = self.nc.servers.get(server_id)
+        unallocated_floating_ips = self.nc.floating_ips.findall(fixed_ip=None)
+        if len(unallocated_floating_ips) < 1:
+            unallocated_floating_ips.append(self.nc.floating_ips.create())
+        floating_ip = unallocated_floating_ips[0]
+        server.add_floating_ip(floating_ip)
+        return floating_ip.ip
+
+    def add_security_group(self, server_id, group_name):
+        self.logger.log("Adding security group %s" % group_name)
+        server = self.nc.servers.get(server_id)
+        server.add_security_group(group_name)
+
+    def create_image(self, server_id, image_name):
+        self.logger.log("Creating image ...")
+        server = self.nc.servers.get(server_id)
+        image_id = server.create_image(image_name)
+
+        while True:
+            image = self.nc.images.get(image_id)
+            if image.status == u'ACTIVE':
+                return True
+            if image.status == u'ERROR':
+                self.logger.log("Error creating image!")
+                return False
+            time.sleep(3)
+
+    def create_database_instances(self):
+        self.logger.log("Creating first instance ...")
+
+        database_server_ids = []
+
+        userdata = open(self.file_path + '/start-mysql-galera-first-node.sh', 'r').read()
+
+        server_id = self.create_instance(image_name=self.galera_image_name, userdata=userdata)
+        database_server_ids.append(server_id)
+        time.sleep(10)
+        server = self.nc.servers.get(server_id)
+        for address in server.addresses[server.addresses.keys()[0]]:
+            if address['OS-EXT-IPS:type'] == 'fixed':
+                server_ip = address['addr']
+                break
+        else:
+            server_ip = None
+            self.logger.log("Error: can not get IP address of first node")
+        self.logger.log("IP address of first node: %s" % server_ip)
+
+        userdata = """#!/bin/bash
+FIRST_NODE_IP=%s
+""" % server_ip + open(self.file_path + '/start-mysql-galera-other-nodes.sh', 'r').read()
+
+        for i in range(int(self.num_replicas) - 1):
+            self.logger.log("Creating database instance %s ..." % (i + 2))
+            database_server_ids.append(
+                self.create_instance(image_name=self.galera_image_name, userdata=userdata, wait_on_active_status=False)
+            )
+
+        self.wait_all_instances_active(database_server_ids)
+
+        for server_id in database_server_ids:
+            self.add_security_group(server_id, 'galera')
+
+    def upload_mysql_dump(self, ip_address):
+        self.logger.log("Connecting to ssh on %s" % ip_address)
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        while True:
+            try:
+                ssh.connect(ip_address, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                break
+            except:
+                time.sleep(5)
+
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        self.logger.log("Uploading mysql dump")
+        scp.put(self.generate_dump_path, 'dump.sql')
+
+        ssh.exec_command("touch finished")
+
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    _, cfg, key_name, key_pair = parse_args('OPENSTACK')
+    ConfigureMySQL(cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py
new file mode 100644
index 0000000..931be95
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack_create_showcase_instances.py
@@ -0,0 +1,352 @@
+import subprocess
+from novaclient.v1_1 import client as novaclient
+import time
+import paramiko
+import select
+from scripts.common.Cloudscale import *
+from webservice.settings import BASE_DIR
+
+
+class CreateInstance:
+
+    def __init__(self, config, logger):
+        self.mvn_path = '/usr/bin/mvn'
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+
+        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
+        self.instance_name = 'cloudscale-sc'
+
+        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.showcase_image_name = "cloudscale-sc-image"
+
+        self.database_name = self.cfg.get('MYSQL', 'database_name')
+        self.database_user = self.cfg.get('MYSQL', 'database_user')
+        self.database_pass = self.cfg.get('MYSQL', 'database_pass')
+
+        self.connection_pool_size = self.cfg.get('MYSQL', 'connection_pool_size')
+
+        self.database_type = self.cfg.get('OPENSTACK', 'database_type').lower()
+        if self.database_type != 'mysql':
+            self.showcase_image_name = "cloudscale-sc-mongo-image"
+
+            self.database_name = self.cfg.get('MONGODB', 'database_name')
+            self.database_user = self.cfg.get('MONGODB', 'database_user')
+            self.database_pass = self.cfg.get('MONGODB', 'database_pass')
+
+
+        self.remote_user = self.cfg.get('OPENSTACK', 'image_username')
+
+        self.num_instances = self.config.fr.get('num_instances')
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+        self.delete_image(self.showcase_image_name)
+        self.logger.log("Creating showcase instance image:")
+        images = self.nc.images.list()
+        for image in images:
+            if image.name == self.showcase_image_name:
+                self.logger.log('Image already exists.')
+                break
+        else:
+            self.file_path = BASE_DIR + "/scripts/software"
+
+            userdata = """#!/bin/bash
+USERNAME=%s
+""" % self.remote_user + open(self.file_path + '/install-apache-tomcat.sh', 'r').read()
+            server_id = self.create_instance()
+            server_floating_ip = self.add_floating_ip(server_id)
+
+            self.add_security_group(server_id, "ssh")
+
+            self.create_showcase_database_config()
+            self.install_software(server_floating_ip, userdata)
+            self.upload_configs(server_floating_ip)
+
+            self.compile()
+
+            self.deploy_showcase(server_floating_ip)
+
+            self.wait_powered_off(server_floating_ip, server_id)
+            self.create_image(server_id, self.showcase_image_name)
+            self.delete_instance(server_id)
+
+            self.logger.log('Done creating showcase instance image')
+
+        self.logger.log('Creating showcase instances')
+        self.create_showcase_instances()
+        self.logger.log('Done creating showcase instances')
+
+    def install_software(self, ip, user_data):
+        self.logger.log('Installing apache and tomcat ...')
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        while True:
+            try:
+                ssh.connect(ip, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                break
+            except:
+                time.sleep(5)
+        time.sleep(30)
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        scp.put(self.file_path + '/install-apache-tomcat.sh', 'setup.sh')
+        _, stdout, _ = ssh.exec_command("sh setup.sh")
+        self.wait_for_command(stdout, verbose=True)
+
+    def upload_configs(self, ip):
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        while True:
+            try:
+                ssh.connect(ip, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                break
+            except:
+                time.sleep(5)
+
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        self.logger.log("Uploading configs on %s" % ip)
+        scp.put(self.file_path + '/../platform/server.xml', 'server.xml')
+        scp.put(self.file_path + '/cloudscale-apache-virtualhost.conf', 'cloudscale-apache-virtualhost.conf')
+        scp.put(self.file_path + '/../platform/mpm_worker.conf', 'mpm_worker.conf')
+
+        _, stdout, _ = ssh.exec_command("sudo mv server.xml /var/lib/tomcat7/conf/server.xml")
+        self.wait_for_command(stdout, verbose=True)
+
+        _, stdout, _ = ssh.exec_command("sudo mv cloudscale-apache-virtualhost.conf /etc/apache2/sites-available/cloudscale")
+        self.wait_for_command(stdout, verbose=True)
+
+        _, stdout, _ = ssh.exec_command("sudo mv mpm_worker.conf /etc/apache2/mods-enabled/mpm_worker.conf")
+        self.wait_for_command(stdout, verbose=True)
+
+    def wait_for_command(self, stdout, verbose=False):
+        # Wait for the command to terminate
+        while not stdout.channel.exit_status_ready():
+        # Only print data if there is data to read in the channel
+            if stdout.channel.recv_ready():
+                rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
+                if len(rl) > 0:
+                    response = stdout.channel.recv(1024)
+                    if verbose:
+                        print response
+
+    def delete_image(self, image_name):
+        try:
+            for image in self.nc.images.list():
+                if image.name == image_name:
+                    image.delete()
+                    break
+        except Exception as e:
+            raise e
+
+    def delete_instance(self, server_id):
+        self.logger.log("Deleting instance ...")
+        server = self.nc.servers.get(server_id)
+        server.delete()
+
+    def create_instance(self, image_name=None, files=None, userdata=None, wait_on_active_status=True):
+        if image_name is None:
+            image_name = self.image_name
+
+        for f in self.nc.flavors.list():
+            if f.name == self.instance_type:
+                flavor = f
+                break
+        else:
+            self.logger.log("Instance flavor '%s' not found!" % self.instance_type)
+            return False
+
+        for img in self.nc.images.list():
+            if img.name == image_name:
+                image = img
+                break
+        else:
+            self.logger.log("Image '%s' not found!" % image_name)
+            return False
+
+        server_id = self.nc.servers.create(
+            self.instance_name, image, flavor, key_name=self.key_name, files=files, userdata=userdata
+        ).id
+
+        if wait_on_active_status and not self.wait_active(server_id):
+            return False
+
+        return server_id
+
+    def wait_active(self, server_id):
+        self.logger.log("Waiting for instance to be built . . .")
+        status = self.wait_for_instance_status(server_id, u'BUILD', u'ACTIVE')
+        if not status:
+            self.logger.log("Can not start instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_all_instances_active(self, instance_ids):
+        for instance_id in instance_ids:
+            self.wait_active(instance_id)
+
+    def wait_powered_off(self, ip, server_id):
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        ssh.connect(ip, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+        _, stdout, _ = ssh.exec_command("sudo poweroff")
+        self.wait_for_command(stdout, verbose=True)
+
+        self.logger.log("Waiting for instance %s to be powered off . . ." % server_id)
+        status = self.wait_for_instance_status(server_id, u'ACTIVE', u'SHUTOFF')
+        if not status:
+            self.logger.log("Error on instance %s!" % self.instance_name)
+            return False
+        return True
+
+    def wait_for_instance_status(self, server_id, current_status, wait_for_status):
+        while True:
+            server = self.nc.servers.get(server_id)
+            if server.status != current_status:
+                if server.status == wait_for_status:
+                    return True
+                return False
+            time.sleep(1)
+
+    def create_image(self, server_id, image_name):
+        self.logger.log("Creating image ...")
+        server = self.nc.servers.get(server_id)
+        image_id = server.create_image(image_name)
+
+        while True:
+            image = self.nc.images.get(image_id)
+            if image.status == u'ACTIVE':
+                return True
+            if image.status == u'ERROR':
+                self.logger.log("Error creating image!")
+                return False
+            time.sleep(3)
+
+    def compile(self):
+        self.logger.log("Compiling showcase ...")
+        if self.database_type == "mysql":
+            ps = subprocess.Popen('cd ' + self.file_path + '/showcase; '+ self.mvn_path + ' -Pamazon-hibernate -Dconnection_pool_size='
+                                        + self.connection_pool_size + ' install',
+                                  shell=True)
+            ps.wait()
+            if ps.returncode != 0:
+                self.logger.log("ERROR: showcase failed to compile!")
+                pass
+        else:
+            ps = subprocess.Popen('cd ' + self.file_path + '/showcase; ' + self.mvn_path + ' -Pamazon-mongodb -Dconnection_pool_size='
+                                        + self.connection_pool_size + ' install',
+                                  shell=True)
+            ps.wait()
+            if ps.returncode != 0:
+                self.logger.log("ERROR: showcase failed to compile!")
+        pass
+
+    def create_showcase_instances(self):
+        showcase_server_ids = []
+
+        for i in range(int(self.num_instances)):
+            self.logger.log("Creating showcase instance %s ..." % (i + 1))
+            showcase_server_ids.append(
+                self.create_instance(image_name=self.showcase_image_name, wait_on_active_status=False)
+            )
+
+        self.wait_all_instances_active(showcase_server_ids)
+
+        for server_id in showcase_server_ids:
+            self.add_security_group(server_id, 'http')
+
+    def add_floating_ip(self, server_id):
+        server = self.nc.servers.get(server_id)
+        unallocated_floating_ips = self.nc.floating_ips.findall(fixed_ip=None)
+        if len(unallocated_floating_ips) < 1:
+            unallocated_floating_ips.append(self.nc.floating_ips.create())
+        floating_ip = unallocated_floating_ips[0]
+        server.add_floating_ip(floating_ip)
+        return floating_ip.ip
+
+    def add_security_group(self, server_id, group_name):
+        self.logger.log("Adding security group %s" % group_name)
+        server = self.nc.servers.get(server_id)
+        server.add_security_group(group_name)
+
+    def deploy_showcase(self, ip_address):
+        self.logger.log("Connecting to ssh on %s" % ip_address)
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        while True:
+            try:
+                ssh.connect(ip_address, username=self.remote_user, key_filename=os.path.abspath(self.key_pair))
+                break
+            except:
+                time.sleep(5)
+
+        scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+        self.logger.log("Uploading showcase.war")
+        scp.put(self.file_path + '/showcase/target/showcase-1.0.0-BUILD-SNAPSHOT.war', 'showcase-1-a.war')
+        _, stdout, _ = ssh.exec_command("sudo mv showcase-1-a.war /var/lib/tomcat7/webapps")
+        self.wait_for_command(stdout, verbose=True)
+        ssh.exec_command("sudo chown tomcat7:tomcat7 /var/lib/tomcat7/webapps/showcase-1-a.war")
+
+    def get_ip(self, server):
+        for address in server.addresses[server.addresses.keys()[0]]:
+            if address['OS-EXT-IPS:type'] == 'fixed':
+                server_ip = address['addr']
+                break
+        else:
+            server_ip = None
+            self.logger.log("Error: can not get IP address of this server")
+        return server_ip
+
+    def create_showcase_database_config(self):
+        if self.database_type == 'mysql':
+            self.logger.log("Creating jdbc configuration")
+            path = self.file_path + '/showcase/src/main/resources/database/database.aws.hibernate.properties'
+
+            servers = self.nc.servers.findall(name='cloudscale-db')
+            ips = []
+            for server in servers:
+                server_ip = self.get_ip(server)
+                ips.append(server_ip)
+            urls = ','.join(ips)
+
+            f = open(path, 'w')
+            f.write('jdbc.dbtype=mysql\n')
+            f.write('jdbc.driverClassName=com.mysql.jdbc.Driver\n')
+            f.write('jdbc.url=jdbc:mysql:loadbalance://%s/%s\n' % (urls, self.database_name))
+            f.write('jdbc.username=%s\n' % self.database_user)
+            f.write('jdbc.password=%s\n' % self.database_pass)
+            f.write('jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect\n')
+            f.close()
+        else:
+            self.logger.log("Creating jdbc configuration")
+            path = self.file_path + '/showcase/src/main/resources/database/database.aws.mongodb.properties'
+
+            servers = self.nc.servers.findall(name='cloudscale-db-mongo')
+            ips = []
+            for server in servers:
+                server_ip = self.get_ip(server)
+                ips.append(server_ip)
+            urls = ','.join(ips)
+
+            f = open(path, 'w')
+            f.write('jdbc.dbtype=mongodb\n')
+            f.write('mongodb.dbname=tpcw\n')
+            f.write('mongodb.host=%s\n' % ips[0])
+            f.write('mongodb.port=27017\n')
+            f.write('mongodb.username=tpcw\n')
+            f.write('mongodb.password=Yhm.3Ub+\n')
+            f.close()
+
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    _, cfg, key_name, key_pair = parse_args('OPENSTACK')
+    CreateInstance(cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack_remove_all.py b/deployment-scripts/scripts/infrastructure/openstack/openstack_remove_all.py
new file mode 100644
index 0000000..9814722
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack_remove_all.py
@@ -0,0 +1,129 @@
+from novaclient.exceptions import NotFound, BadRequest, NoUniqueMatch
+from scripts.common.Cloudscale import *
+import time
+
+from novaclient.v1_1 import client as novaclient
+
+
+class RemoveAll:
+    def __init__(self, config, logger):
+        self.cfg = config.cfg
+        self.config = config
+        self.logger = logger
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.image_name = self.cfg.get('OPENSTACK', 'image_name')
+        self.instance_type = self.cfg.get('OPENSTACK', 'instance_type')
+        self.instance_name = 'cloudscale'
+        self.key_name = self.cfg.get('OPENSTACK', 'key_name')
+        self.key_pair = self.cfg.get('OPENSTACK', 'key_pair')
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+        self.logger.log("Cleaning:")
+        self.remove_openstack_instances()
+        # TODO: remove images
+        self.remove_key_pair()
+        self.remove_security_groups()
+        self.logger.log("Done cleaning")
+
+        self.logger.log('Creating security groups and key-pair:')
+        self.create_security_groups()
+        self.create_key_pair()
+        self.logger.log('Done creating security groups and key-pair')
+
+    def remove_key_pair(self):
+        self.logger.log("Removing key pair ...")
+        try:
+            self.nc.keypairs.find(name=self.key_name).delete()
+        except NotFound as e:
+            pass
+
+    def remove_openstack_instances(self):
+        self.logger.log("Terminating openstack instances ...")
+
+        instance_ids = []
+        for server in self.nc.servers.list():
+            if server.name in ('cloudscale-db', 'cloudscale-sc', 'cloudscale-lb', 'cloudscale-mc'):
+                instance_ids.append(server.id)
+                server.delete()
+
+        for instance_id in instance_ids:
+            self.wait_terminate(instance_id)
+
+    def wait_terminate(self, instance_id):
+        self.logger.log("Waiting for instance to terminate, please wait ...")
+        while True:
+            try:
+                server = self.nc.servers.get(instance_id)
+            except NotFound as e:
+                break
+            time.sleep(3)
+        self.logger.log("Instance is terminated!")
+
+    def remove_security_groups(self):
+        self.logger.log("Removing security groups ...")
+
+        groups = ['ssh', 'http', 'galera', 'mongodb', 'web-deploy']
+        for group in groups:
+            try:
+                self.nc.security_groups.find(name=group).delete()
+            except (NoUniqueMatch, NotFound, BadRequest):
+                pass
+            except Exception as exc:
+                pass
+
+    def create_key_pair(self):
+        self.logger.log("Creating key pair ...")
+        if os.path.isfile(self.key_pair):
+            if not os.path.isfile(self.key_pair + '.pub'):
+                self.logger.log("Can not find public key %s!" % (self.key_pair + '.pub'))
+                exit(1)
+            public_key = open(self.key_pair + '.pub', 'r').read()
+            self.nc.keypairs.create(self.key_name, public_key=public_key)
+        else:
+            try:
+                keypair = self.nc.keypairs.find(name=self.key_name)
+            except NotFound as e:
+                keypair = self.nc.keypairs.create(self.key_name)
+
+            open(self.key_pair + '.pub', 'w').write(keypair.public_key)
+            open(self.key_pair, 'w').write(keypair.private_key)
+
+    def create_security_groups(self):
+        self.logger.log("Creating security groups http and ssh ...")
+        self.create_security_group('http', 'Security group for HTTP protocol', 'tcp', '80', '0.0.0.0/0')
+        self.create_security_group('ssh', 'Security group for SSH protocol', 'tcp', '22', '0.0.0.0/0')
+        self.create_security_group('galera', 'Security group for MySQL galera protocol', 'tcp',
+                                   ['3306', '4444', '4567', '4568'], '0.0.0.0/0')
+        self.create_security_group('mongo', 'Security group for MongoDB protocol', 'tcp',
+                                   ['27017', '27037', '27019'], '0.0.0.0/0')
+
+    def create_security_group(self, name, description, protocol,  ports, cidr):
+        try:
+            security_group = self.nc.security_groups.find(name=name)
+        except NotFound:
+            security_group = self.nc.security_groups.create(name, description)
+        except Exception as e:
+            raise e
+
+        try:
+            if not isinstance(ports, list):
+                ports = [ports]
+            for port in ports:
+                self.nc.security_group_rules.create(security_group.id, protocol, port, port, cidr)
+        except BadRequest as e:
+            if e.message != u'Security group %s already exists' % name and e.message != u'This rule already exists in group %s' % security_group.id:
+                raise
+        except Exception as e:
+            pass
+
+if __name__ == "__main__":
+    check_args(1, "<config_path>")
+    _, cfg, key_name, key_pair = parse_args('OPENSTACK')
+
+    RemoveAll(cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/infrastructure/openstack/openstack-create-instance.py b/deployment-scripts/scripts/infrastructure/openstack/openstack-create-instance.py
new file mode 100644
index 0000000..2426dac
--- /dev/null
+++ b/deployment-scripts/scripts/infrastructure/openstack/openstack-create-instance.py
@@ -0,0 +1,29 @@
+from novaclient.v1_1 import client as novaclient
+from common.Cloudscale import *
+from scripts.common.Cloudscale import check_args, parse_args
+
+
+class CreateInstance:
+
+    def __init__(self, cfg):
+        self.cfg = cfg
+        self.user = cfg.get('OPENSTACK', 'username')
+        self.pwd = cfg.get('OPENSTACK', 'password')
+        self.url = cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = cfg.get('OPENSTACK', 'tenant_name')
+        self.image_name = cfg.get('OPENSTACK', 'image_name')
+        server = self.create_instance()
+        print [s['addr'] for s in server.addresses[self.tenant] if s['OS-EXT-IPS:type'] == 'floating'][0]
+
+    def create_instance(self):
+        nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+        for f in nc.flavors.list():
+            print f
+        for server in nc.servers.list():
+            if server._info['name'] == self.instance_name:
+                return server
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    _, cfg, _, _ = parse_args()
+    CreateInstance(cfg)
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/__init__.py b/deployment-scripts/scripts/platform/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/platform/__init__.py
diff --git a/deployment-scripts/scripts/platform/aws/__init__.py b/deployment-scripts/scripts/platform/aws/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/scripts/platform/aws/__init__.py
diff --git a/deployment-scripts/scripts/platform/aws/configure_rds.py b/deployment-scripts/scripts/platform/aws/configure_rds.py
new file mode 100644
index 0000000..369ba7d
--- /dev/null
+++ b/deployment-scripts/scripts/platform/aws/configure_rds.py
@@ -0,0 +1,172 @@
+import boto, boto.exception
+import boto, boto.ec2, boto.rds
+import boto.manage.cmdshell
+import time
+import re
+import paramiko
+import subprocess
+import sys, os
+from scripts.common.Cloudscale import *
+from webservice import settings
+import logging
+
+class ConfigureRDS:
+
+    def __init__(self, config, logger):
+        self.cfg = config.cfg
+        self.config = config
+        self.logger=logger
+        self.db_password= self.cfg.get('RDS', 'database_pass')
+
+        self.conn = boto.rds.connect_to_region(self.cfg.get('EC2', 'region'),
+                                               aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                               aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        sg_id = self.create_security_group('mysql', 'Security group for MYSQL protocol', '3306', '0.0.0.0/0')
+        instance = self.create_master(sg_id)
+        self.import_data(instance)
+
+        replicas_urls = []
+        if int(self.cfg.get('RDS', 'num_replicas')) > 0:
+            replicas_urls = self.create_read_replicas()
+
+        self.write_config(instance.endpoint[0], replicas_urls)
+
+    def create_read_replicas(self):
+        num = int(self.cfg.get('RDS', 'num_replicas'))
+        urls = []
+        instance_ids = []
+        for i in xrange(int(num)):
+            self.logger.log("Creating read replica " + str(i+1))
+            try:
+                instance = self.conn.create_dbinstance_read_replica(
+                    self.cfg.get('RDS', 'replica_identifier') + str(i+1),
+                    self.cfg.get('RDS', 'master_identifier'),
+                    self.cfg.get('RDS', 'instance_type'),
+                    availability_zone="eu-west-1a"
+                )
+            except boto.exception.BotoServerError as e:
+                if not e.error_code == 'DBInstanceAlreadyExists':
+                    raise
+
+        for i in xrange(int(num)):
+            instance = self.conn.get_all_dbinstances(instance_id=self.cfg.get('RDS', 'replica_identifier') + str(i+1))[0]
+            self.wait_available(instance)
+            instance = self.conn.get_all_dbinstances(instance_id=self.cfg.get('RDS', 'replica_identifier')+ str(i+1))[0]
+            urls.append(instance.endpoint[0])
+
+        return urls
+
+
+    def import_data(self, instance):
+        self.logger.log("Importing data. This may take a while, please wait ...")
+        generate_type = self.cfg.get('RDS', 'generate_type')
+
+        if generate_type == "script":
+            config_path = self.write_showcase_database_config(instance)
+            self.generate(config_path)
+        elif generate_type == "dump":
+            self.dump(instance)
+
+        self.logger.log("Successfully imported data")
+
+    def dump(self, instance):
+        dump_file = self.cfg.get('RDS', 'generate_dump_path')
+        db = self.cfg.get('RDS', 'database_name')
+        user = self.cfg.get('RDS', 'database_user')
+        passwd = self.cfg.get('RDS', 'database_pass')
+        cmd = [os.path.abspath("scripts/platform/aws/dump.sh"), str(instance.endpoint[0]), user, passwd, db, dump_file]
+        # self.logger.log(cmd)
+        if not settings.MUTE:
+            subprocess.check_output(cmd)
+
+    def write_showcase_database_config(self, instance):
+        path = os.path.abspath('../generator/src/main/resources/generate/database.properties')
+        self.logger.log(path)
+        f = open(path, 'w')
+        f.write("jdbc.dbtype=mysql\n")
+        f.write("jdbc.driverClassName=com.mysql.jdbc.Driver\n")
+        f.write("jdbc.url=jdbc:mysql://" + instance.ip_address + "/tpcw\n")
+        f.write("jdbc.username=root\n")
+        f.write("jdbc.password=" + self.db_password + "\n")
+        f.write("jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect\n")
+        f.close()
+        return path
+
+    def generate(self, config_path):
+        script_path = os.path.abspath('generate.sh')
+        subprocess.call([script_path, 'file:///' + config_path, self.cfg.get('RDS', 'generate_type')])
+
+
+    def write_config(self, instance):
+        f = open('../database.properties', 'w')
+        f.write('')
+
+    def create_security_group(self, name, description, port, cidr):
+        ec2_conn = boto.ec2.connect_to_region(self.cfg.get('EC2', 'region'),
+                                              aws_access_key_id=self.cfg.get('EC2', 'aws_access_key_id'),
+                                              aws_secret_access_key=self.cfg.get('EC2', 'aws_secret_access_key'))
+        try:
+            ec2_conn.create_security_group(name, description)
+            ec2_conn.authorize_security_group(group_name=name, ip_protocol='tcp', from_port=port, to_port=port, cidr_ip=cidr)
+
+            self.conn.create_dbsecurity_group(name, description)
+            self.conn.authorize_dbsecurity_group(name, cidr, name)
+        except boto.exception.EC2ResponseError as e:
+            if str(e.error_code) != 'InvalidGroup.Duplicate':
+                raise e
+        finally:
+            return ec2_conn.get_all_security_groups(groupnames=['mysql'])[0].id
+
+    def create_master(self, sg_id):
+        self.logger.log("Creating RDS master instance ...")
+
+        try:
+            instance = self.conn.create_dbinstance(
+                self.cfg.get('RDS', 'master_identifier'),
+                5,
+                self.cfg.get('RDS', 'instance_type'),
+                self.cfg.get('RDS', 'database_user'),
+                self.cfg.get('RDS', 'database_pass'),
+                db_name=self.cfg.get('RDS', 'database_name'),
+                vpc_security_groups=[sg_id],
+                availability_zone='eu-west-1a',
+                backup_retention_period=1
+            )
+        except boto.exception.BotoServerError as e:
+            if not e.error_code == 'DBInstanceAlreadyExists':
+                raise
+        finally:
+            instance = self.conn.get_all_dbinstances(instance_id=self.cfg.get('RDS', 'master_identifier'))[0]
+
+        self.wait_available(instance)
+
+        instance = self.conn.get_all_dbinstances(instance_id=self.cfg.get('RDS', 'master_identifier'))[0]
+
+        return instance
+
+    def wait_available(self, instance):
+        self.logger.log("Waiting for instance to become available\nPlease wait . .")
+        status = self.conn.get_all_dbinstances(instance.id)[0].status
+        i=1
+        while status != 'available':
+            if i%10 == 0:
+                self.logger.log("\nPlease wait .")
+            self.logger.log('.', append_to_last=True)
+            status = self.conn.get_all_dbinstances(instance.id)[0].status
+            time.sleep(3)
+            i=i+1
+
+        time.sleep(5)
+
+        self.logger.log("Instance is running!")
+
+    def write_config(self, master_url, replica_urls=[]):
+        urls = master_url
+        if len(replica_urls) > 0:
+            urls += "," + ",".join(replica_urls)
+        self.config.save('platform', 'urls', urls)
+        # f = open(os.path.abspath('../platform.ini'), 'w')
+        # f.write('[Database]\n')
+        # f.write('db_urls=' + master_url)
+        # for url in replica_urls:
+        #     f.write(',' + url)
diff --git a/deployment-scripts/scripts/platform/aws/configure-dynamodb.py b/deployment-scripts/scripts/platform/aws/configure-dynamodb.py
new file mode 100644
index 0000000..8f76346
--- /dev/null
+++ b/deployment-scripts/scripts/platform/aws/configure-dynamodb.py
@@ -0,0 +1 @@
+__author__ = 'ivansek'
diff --git a/deployment-scripts/scripts/platform/aws/dump.sh b/deployment-scripts/scripts/platform/aws/dump.sh
new file mode 100755
index 0000000..9cdd1b8
--- /dev/null
+++ b/deployment-scripts/scripts/platform/aws/dump.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+PATH_TO_MYSQL_COMMAND=/usr/bin/
+
+if [ $# -lt 5 ]
+then
+    echo -e "Usage:\n$ dump.sh <host> <user> <password> <database> <dump_file_path>"
+    exit
+fi
+
+${PATH_TO_MYSQL_COMMAND}/mysql -h $1 -u $2 -p$3 --database=$4 < $5
diff --git a/deployment-scripts/scripts/platform/aws/generate.sh b/deployment-scripts/scripts/platform/aws/generate.sh
new file mode 100755
index 0000000..ae69adb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/aws/generate.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+PATH_TO_MVN_COMMAND=/usr/local/bin
+
+if [ $# -lt 1 ]
+then
+    echo -e "Usage:\n$ generate.sh <path_to_config_file>"
+    exit
+fi
+
+if [ $2 == "dump" ]
+then
+    mysql -h
+cd ../generator/
+${PATH_TO_MVN_COMMAND}/mvn -Pamazon-hibernate -Deu.cloudscale.showcase.generate.properties=$1 install
+java -cp target/dependency/*:target/showcase-1.0.0-BUILD-SNAPSHOT.jar eu.cloudscale.showcase.generate.Generate mysql
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/pom.xml b/deployment-scripts/scripts/platform/generator/pom.xml
new file mode 100644
index 0000000..8cf25d4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/pom.xml
@@ -0,0 +1,406 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>eu.cloudscale</groupId>
+	<artifactId>showcase</artifactId>
+	<name>40-Spring_webshop</name>
+	<packaging>jar</packaging>
+	<version>1.0.0-BUILD-SNAPSHOT</version>
+	<repositories>
+		<repository>
+			<id>spring-milestone</id>
+			<name>Spring Maven MILESTONE Repository</name>
+			<url>http://repo.springsource.org/libs-milestone</url>
+		</repository>
+	</repositories>
+	<properties>
+		<org.springframework.version>3.2.1.RELEASE</org.springframework.version>
+		<log4j.version>1.2.17</log4j.version>
+	</properties>
+	<dependencies>
+		<!-- Spring -->
+
+		<!-- Logging -->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jcl-over-slf4j</artifactId>
+			<version>1.7.5</version>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.7.5</version>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.7.5</version>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+
+		<!-- <dependency> -->
+		<!-- <groupId>javax.inject</groupId> -->
+		<!-- <artifactId>javax.inject</artifactId> -->
+		<!-- <version>1</version> -->
+		<!-- </dependency> -->
+
+		<!-- Servlet -->
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet.jsp</groupId>
+			<artifactId>jsp-api</artifactId>
+			<version>2.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>jstl</artifactId>
+			<version>1.2</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-mongodb</artifactId>
+			<version>1.2.0.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.thymeleaf</groupId>
+			<artifactId>thymeleaf-spring3</artifactId>
+			<version>2.0.16</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-orm</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-beans</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-dbcp</groupId>
+			<artifactId>commons-dbcp</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.mchange</groupId>
+			<artifactId>c3p0</artifactId>
+			<version>0.9.5-pre1</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.24</version>
+		</dependency>
+		<dependency>
+			<groupId>cglib</groupId>
+			<artifactId>cglib</artifactId>
+			<version>3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-c3p0</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-ehcache</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.ehcache</groupId>
+			<artifactId>ehcache</artifactId>
+			<version>2.7.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate</artifactId>
+			<version>3.6.0.Beta2</version>
+			<type>pom</type>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>nz.net.ultraq.thymeleaf</groupId>
+			<artifactId>thymeleaf-layout-dialect</artifactId>
+			<version>1.1.3</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.cargo</groupId> -->
+			<!-- <artifactId>cargo-maven2-plugin</artifactId> -->
+			<!-- <version>1.3.3</version> -->
+			<!-- <configuration> -->
+			<!-- <container> -->
+			<!-- <containerId>tomcat7x</containerId> -->
+			<!-- <type>remote</type> -->
+
+			<!-- </container> -->
+			<!-- <configuration> -->
+			<!-- <timeout>60000</timeout> -->
+			<!-- <type>runtime</type> -->
+			<!-- <properties> -->
+			<!-- <cargo.hostname>10.10.40.23</cargo.hostname> -->
+			<!-- <cargo.servlet.port>8081</cargo.servlet.port> -->
+			<!-- <cargo.remote.uri>http://10.10.40.23:8081/manager/text</cargo.remote.uri> -->
+			<!-- <cargo.remote.username>remote-deploy</cargo.remote.username> -->
+			<!-- <cargo.remote.password>prfct42x</cargo.remote.password> -->
+			<!-- </properties> -->
+			<!-- </configuration> -->
+			<!-- <deployer> -->
+			<!-- <type>remote</type> -->
+			<!-- </deployer> -->
+			<!-- <deployables> -->
+			<!-- <deployable> -->
+			<!-- <groupId>${project.groupId}</groupId> -->
+			<!-- <artifactId>${project.artifactId}</artifactId> -->
+			<!-- <type>war</type> -->
+			<!-- <properties> -->
+			<!-- <context>${project.artifactId}</context> -->
+			<!-- </properties> -->
+			<!-- <pingURL>http://10.10.40.23:8081/showcase-1</pingURL> -->
+			<!-- </deployable> -->
+			<!-- </deployables> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.4</version>
+				<!-- Enable filtering in web.xml -->
+				<configuration>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+						</manifest>
+					</archive>
+					<webResources>
+						<resource>
+							<filtering>true</filtering>
+							<directory>src/main/webapp</directory>
+							<includes>
+								<include>**/web.xml</include>
+							</includes>
+						</resource>
+					</webResources>
+					<warSourceDirectory>src/main/webapp</warSourceDirectory>
+					<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-eclipse-plugin</artifactId> -->
+			<!-- <version>2.9</version> -->
+			<!-- <configuration> -->
+			<!-- <additionalProjectnatures> -->
+			<!-- <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> -->
+			<!-- </additionalProjectnatures> -->
+			<!-- <additionalBuildcommands> -->
+			<!-- <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> -->
+			<!-- </additionalBuildcommands> -->
+			<!-- <downloadSources>true</downloadSources> -->
+			<!-- <downloadJavadocs>true</downloadJavadocs> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<!-- <plugin> -->
+			<!-- <groupId>org.apache.maven.plugins</groupId> -->
+			<!-- <artifactId>maven-compiler-plugin</artifactId> -->
+			<!-- <version>2.5.1</version> -->
+			<!-- <configuration> -->
+			<!-- <source>1.6</source> -->
+			<!-- <target>1.6</target> -->
+			<!-- <compilerArgument>-Xlint:all</compilerArgument> -->
+			<!-- <showWarnings>true</showWarnings> -->
+			<!-- <showDeprecation>true</showDeprecation> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.mojo</groupId> -->
+			<!-- <artifactId>exec-maven-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <mainClass>org.test.int1.Main</mainClass> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-assembly-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <archive> -->
+			<!-- <manifest> -->
+			<!-- <mainClass>eu.cloudscaleproject.showcase.db.generate.Generate</mainClass> -->
+			<!-- </manifest> -->
+			<!-- </archive> -->
+			<!-- <descriptorRefs> -->
+			<!-- <descriptorRef>jar-with-dependencies</descriptorRef> -->
+			<!-- </descriptorRefs> -->
+			<!-- </configuration> -->
+			<!-- <executions> -->
+			<!-- <execution> -->
+			<!-- <id>make-assembly</id> -->
+			<!-- <phase>package</phase> -->
+			<!-- <goals> -->
+			<!-- <goal>single</goal> -->
+			<!-- </goals> -->
+			<!-- </execution> -->
+			<!-- </executions> -->
+			<!-- </plugin> -->
+
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>1.2.1</version>
+				<configuration>
+					<executable>java</executable>
+					<arguments>
+						<argument>-Djava.library.path=${project.build.directory}/lib</argument>
+						<argument>-classpath ${compile.classpath}</argument>
+						<argument>eu.cloudscale.showcase.generate.Generate</argument>
+						<argument>${dbtype}</argument>
+					</arguments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<version>2.8</version>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<overWriteReleases>false</overWriteReleases>
+							<overWriteSnapshots>false</overWriteSnapshots>
+							<overWriteIfNewer>true</overWriteIfNewer>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+				<excludes>
+					<exclude>jmeter</exclude>
+					<exclude>matlab</exclude>
+					<exclude>rbe</exclude>
+					<exclude>results</exclude>
+					<exclude>aws</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-dependency-plugin
+										</artifactId>
+										<versionRange>
+											[2.8,)
+										</versionRange>
+										<goals>
+											<goal>
+												copy-dependencies
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+	<profiles>
+		<profile>
+			<id>amazon-hibernate</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>hibernate</eu.cloudscale.datasource>
+				<eu.cloudscale.showcase.generate.properties>database/database.aws.hibernate.properties</eu.cloudscale.showcase.generate.properties>
+			</properties>
+		</profile>
+		<profile>
+			<id>amazon-mongodb</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>mongodb</eu.cloudscale.datasource>
+			</properties>
+		</profile>
+	</profiles>
+</project>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/AService.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/AService.java
new file mode 100644
index 0000000..8be2422
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/AService.java
@@ -0,0 +1,419 @@
+package eu.cloudscale.showcase.db;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Transactional(readOnly=true)
+public abstract class AService implements IService
+{	
+	@SuppressWarnings( "rawtypes" )
+	@Override
+	@Cacheable("newProducts")
+	public List getNewProducts(String category)
+	{
+		return getItemDaoImpl().getNewProducts( category );
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public IShoppingCart doCart(Integer shoppingId, Integer itemId,
+	        List<Integer> ids, List<Integer> quantities)
+	{
+
+		IShoppingCartLineDao sclDao = getShoppingCartLineDaoImpl();
+		IShoppingCartDao scDao = getShoppingCartDaoImpl();
+		IItemDao itemDao = getItemDaoImpl();
+
+		if ( itemId != null )
+		{
+			addItem( shoppingId, itemDao.findById( itemId.intValue() ) );
+		}
+
+		refreshCart( shoppingId, ids, quantities );
+		addRandomItemToCartIfNecessary( sclDao, shoppingId );
+		resetCartTime( sclDao, shoppingId );
+
+		return scDao.findById( shoppingId );
+	}
+	
+	@Transactional(readOnly=false)
+	protected void addRandomItemToCartIfNecessary(IShoppingCartLineDao sclDao,
+	        int SHOPPING_ID)
+	{
+		// check and see if the cart is empty. If it's not, we do
+		// nothing.
+
+		try
+		{
+			// Check to see if the cart is empty
+			if ( sclDao.isCartEmpty( SHOPPING_ID ) )
+			{
+				// Cart is empty
+				addItem( SHOPPING_ID, getItemDaoImpl().getRandomItem() );
+			}
+
+		}
+		catch ( java.lang.Exception ex )
+		{
+			ex.printStackTrace();
+		}
+	}
+	
+	protected IShoppingCart getCart(Integer shoppingId, double discount)
+	{
+		IShoppingCartDao scDao = getShoppingCartDaoImpl();
+		IShoppingCart sc = scDao.findById( shoppingId );
+		return sc;
+	}
+
+	@Transactional(readOnly=false)
+	protected void resetCartTime(IShoppingCartLineDao sclDao, Integer shoppingId)
+	{
+		IShoppingCartDao scDao = getShoppingCartDaoImpl();
+		IShoppingCart sc = scDao.findById( shoppingId );
+		sc.setScTime( new Date() );
+		scDao.shrani( sc );
+	}
+
+	// protected void addRandomItemToCartIfNecessary(
+	// IShoppingCartLineDao sclDao, Integer shoppingId)
+	// {
+	// IItemDao itemDao = getItemDaoImpl();
+	//
+	// if ( sclDao.isCartEmpty( shoppingId ) )
+	// {
+	// IItem randItem = itemDao.getRandomItem();
+	// // related_item = getRelated1(sclDao, shoppingId, randItem);
+	// addItem( shoppingId, randItem );
+	// }
+	//
+	// }
+
+	// protected IItem getRelated1(IShoppingCartLineDao<IShoppingCartLine>
+	// sclDao,
+	// Integer shoppingId,
+	// IItem randItem)
+	// {
+	// IItemDao<IItem> itemDao = getItemDaoImpl();
+	// IItem relatedItem = itemDao.getRelated1( randItem );
+	// return relatedItem;
+	// }
+
+	@Transactional(readOnly=false)
+	protected void refreshCart(Integer shoppingId, List<Integer> ids,
+	        List<Integer> quantities)
+	{
+		IShoppingCartLineDao sclDao = getShoppingCartLineDaoImpl();
+		for ( int i = 0; i < ids.size(); i++ )
+		{
+			int itemId = ids.get( i );
+			int QTY = quantities.get( i );
+			IShoppingCartLine scl = sclDao.getBySCandItem( shoppingId, itemId );
+			if ( QTY == 0 )
+			{
+				sclDao.delete( scl );
+			}
+			else
+			{
+				scl.setSclQty( QTY );
+				sclDao.shrani( scl );
+			}
+		}
+
+	}
+
+	@Transactional(readOnly=false)
+	protected void addItem(Integer shoppingId, IItem item)
+	{
+		IShoppingCartLineDao sclDao = getShoppingCartLineDaoImpl();
+		IShoppingCartDao scDao = getShoppingCartDaoImpl();
+
+		IShoppingCartLine scl = sclDao.getBySCandItem( shoppingId,
+		        item.getIId() );
+
+		if ( scl != null )
+		{
+			scl.setSclQty( scl.getSclQty() + 1 );
+			sclDao.shrani( scl );
+		}
+		else
+		{
+			scl = sclDao.getObject();
+			scl.setItem( item );
+			scl.setSclQty( 1 );
+			IShoppingCart sc = (IShoppingCart) scDao.findById( shoppingId );
+			scl.setShoppingCart( sc );
+			sclDao.shrani( scl );
+
+			sc.getShoppingCartLines().add( scl );
+			scDao.shrani( sc );
+		}
+
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, long ccNumber, String ccName,
+	        Date ccExpiry, String shipping, String street1, String street2,
+	        String city, String state, String zip, String country)
+	{
+
+		ICustomerDao customerDao = getCustomerDaoImpl();
+		IShoppingCartDao shoppingCartDao = getShoppingCartDaoImpl();
+
+		IShoppingCart sc = shoppingCartDao.findById( shoppingId );
+		ICustomer customer = customerDao.findById( customerId );
+
+		double cDiscount = getCDiscount( customerId );
+		IShoppingCart cart = getCart( shoppingId, cDiscount );
+		IAddress address = saveAddress( street1, street2, city, state, zip,
+		        country );
+
+		IOrders order = saveOrder( address, customer, shipping, sc, cDiscount );
+
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, cart, address );
+
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, Long ccNumber, String ccName,
+	        Date ccExpiry, String shipping)
+	{
+		double discount = getCDiscount( customerId );
+		IShoppingCart sc = getCart( shoppingId, discount );
+
+		ICustomerDao customerDao = getCustomerDaoImpl();
+		ICustomer customer = customerDao.findById( customerId );
+
+		IAddress address = customer.getAddress();
+
+		IOrders order = saveOrder( address, customer, shipping, sc, discount );
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, sc, address );
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+	
+	@Transactional(readOnly=false)
+	protected void clearCart(Integer shoppingId)
+	{
+		IShoppingCartDao scDao = getShoppingCartDaoImpl();
+		IShoppingCart sc = (IShoppingCart) scDao.findById( shoppingId );
+
+		IShoppingCartLineDao sclDao = getShoppingCartLineDaoImpl();
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res )
+    		{
+    			sclDao.delete( scl );
+    		}
+		}
+	}
+
+	@Transactional(readOnly=false)
+	protected ICcXacts saveCcXacts(IOrders order, String ccType, long ccNumber,
+	        String ccName, Date ccExpiry, IShoppingCart cart, IAddress address)
+	{
+		if ( ccType.length() > 10 )
+			ccType = ccType.substring( 0, 10 );
+
+		if ( ccName.length() > 30 )
+			ccName = ccName.substring( 0, 30 );
+
+		ICcXactsDao ccXactsDao = getCcXactsDaoImpl();
+
+		ICcXacts ccXacts = ccXactsDao.getObject();
+		ccXacts.setCountry( address.getCountry() );
+		ccXacts.setOrders( order );
+		ccXacts.setCxType( ccType );
+		ccXacts.setCxNum( (int) ccNumber );
+		ccXacts.setCxName( ccName );
+		ccXacts.setCxExpiry( ccExpiry );
+		ccXacts.setCxXactAmt( calculateTotal( cart ) );
+		ccXacts.setCxXactDate( new Date() );
+		ccXacts.setCountry( address.getCountry() );
+
+		ccXactsDao.shrani( ccXacts );
+
+		return ccXacts;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IAddress saveAddress(String street1, String street2, String city,
+	        String state, String zip, String country)
+	{
+		IAddressDao addressDao = getAddressDaoImpl();
+		ICountryDao countryDao = getCountryDaoImpl();
+
+		IAddress address = addressDao.getObject();
+
+		address.setAddrStreet1( street1 );
+		address.setAddrStreet2( street2 );
+		address.setAddrCity( city );
+		address.setAddrState( state );
+		address.setAddrZip( zip );
+
+		address.setCountry( countryDao.getByName( country ) );
+		addressDao.shrani( address );
+
+		return address;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+		IOrdersDao ordersDao = getOrdersDaoImpl();
+		IOrderLineDao orderLineDao = getOrderLineDaoImpl();
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		IOrders order = ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		ordersDao.shrani( order );
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			order.getOrderLines().add( ol );
+    			orderLineDao.shrani( ol );
+    		}
+		}
+
+		ordersDao.shrani( order );
+
+		return order;
+	}
+
+	public String getRandomString(int min, int max)
+	{
+		String newstring = new String();
+		Random rand = new Random();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79
+		                                                       // characters
+		int strlen = (int) Math.floor( rand.nextDouble() * ( max - min + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected double calculateTotal(IShoppingCart sc)
+	{
+		double total = 0;
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl : res )
+    		{
+    			if( scl != null )
+    			{
+    				total += scl.getItem().getICost();
+    			}
+    		}
+		}
+
+		return total;
+	}
+
+	protected double getCDiscount(Integer customerId)
+	{
+		ICustomerDao customerDao = getCustomerDaoImpl();
+		ICustomer customer = customerDao.findById( customerId );
+
+		return customer.getCDiscount();
+	}
+
+	@Override
+	public List searchByAuthor(String keyword)
+	{
+		IAuthorDao authorDao = getAuthorDaoImpl();
+		IItemDao itemDao = getItemDaoImpl();
+
+		List<IAuthor> authors = authorDao.findBySoundexLname( keyword );
+
+		List<IItem> items = new ArrayList<IItem>();
+
+		for ( IAuthor author : authors )
+		{
+			if ( items.size() >= 50 )
+			{
+				break;
+			}
+
+			items.addAll( itemDao.findAllByAuthor( author ) );
+		}
+
+		return items;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
new file mode 100644
index 0000000..7d4be6a
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
@@ -0,0 +1,42 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+
+public class BuyConfirmResult
+{
+	public IOrders order;
+	public IShoppingCart cart;
+	
+	public BuyConfirmResult(IOrders order2, IShoppingCart sc)
+    {
+        order = order2;
+        cart = sc;
+    }
+
+	
+    public IOrders getOrder()
+    {
+    	return order;
+    }
+
+	
+    public void setOrder(IOrders order)
+    {
+    	this.order = order;
+    }
+
+	
+    public IShoppingCart getCart()
+    {
+    	return cart;
+    }
+
+	
+    public void setCart(IShoppingCart cart)
+    {
+    	this.cart = cart;
+    }
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
new file mode 100644
index 0000000..461e456
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
@@ -0,0 +1,22 @@
+package eu.cloudscale.showcase.db.common;
+
+import org.springframework.context.support.GenericXmlApplicationContext;
+
+
+public class ContextHelper 
+{
+	private static GenericXmlApplicationContext ctx = null;
+	
+	public static GenericXmlApplicationContext getApplicationContext()
+	{
+		if( ctx == null)
+		{
+			ctx = new GenericXmlApplicationContext();
+			ctx.load("classpath:app-context.xml");
+			ctx.refresh();
+		}
+		
+		return ctx;
+	}
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
new file mode 100644
index 0000000..1221688
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.db.common;
+
+import eu.cloudscale.showcase.db.IService;
+
+
+public class DatabaseHelper
+{
+	
+	private static IService db = null;
+	private static String driverName = null;
+	
+    public static IService getDatabase()
+	{
+		if( db == null )
+		{
+    		db = (IService) ContextHelper.getApplicationContext().getBean( "service" );
+		}
+		
+		return db;
+
+	}
+	
+	public static String getDriverName()
+	{
+		return driverName;
+	}
+	
+	public static void loadMySQLDriver()
+    {
+		try {
+			Class.forName("com.mysql.jdbc.Driver");
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}	    
+    }
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
new file mode 100644
index 0000000..da72e86
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.db.common;
+
+public class Soundex
+{
+
+	public static String soundex(String s)
+	{
+		char[] x = s.toUpperCase().toCharArray();
+		char firstLetter = x[0];
+
+		// convert letters to numeric code
+		for ( int i = 0; i < x.length; i++ )
+		{
+			switch ( x[i] )
+			{
+				case 'B':
+				case 'F':
+				case 'P':
+				case 'V':
+				{
+					x[i] = '1';
+					break;
+				}
+
+				case 'C':
+				case 'G':
+				case 'J':
+				case 'K':
+				case 'Q':
+				case 'S':
+				case 'X':
+				case 'Z':
+				{
+					x[i] = '2';
+					break;
+				}
+
+				case 'D':
+				case 'T':
+				{
+					x[i] = '3';
+					break;
+				}
+
+				case 'L':
+				{
+					x[i] = '4';
+					break;
+				}
+
+				case 'M':
+				case 'N':
+				{
+					x[i] = '5';
+					break;
+				}
+
+				case 'R':
+				{
+					x[i] = '6';
+					break;
+				}
+
+				default:
+				{
+					x[i] = '0';
+					break;
+				}
+			}
+		}
+
+		// remove duplicates
+		String output = "" + firstLetter;
+		for ( int i = 1; i < x.length; i++ )
+			if ( x[i] != x[i - 1] && x[i] != '0' )
+				output += x[i];
+
+		// pad with 0's or truncate
+		output = output + "0000";
+		return output.substring( 0, 4 );
+	}
+
+	public static void main(String[] args)
+	{
+		String name1 = args[0];
+		String name2 = args[1];
+		String code1 = soundex( name1 );
+		String code2 = soundex( name2 );
+		System.out.println( code1 + ": " + name1 );
+		System.out.println( code2 + ": " + name2 );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..3290e16
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.hibernate.Address;
+
+@Repository
+@Transactional(readOnly=true)
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	public AddressDaoImpl()
+	{
+		System.out.println("AddressDaoImpl constructor called!");
+	}
+
+	@Autowired
+	public AddressDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+	@Override
+    public List<IAddress> findAll()
+    {
+		return null;
+    }
+
+    @Override
+    public IAddress findById(int id)
+    {
+		return (IAddress) getCurrentSession().get( Address.class, id );
+    }
+    
+    @Override
+    public IAddress getObject()
+    {
+    	return new Address();
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..ce076ce
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
@@ -0,0 +1,64 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.hibernate.Author;
+
+@Repository
+@Transactional(readOnly=true)
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+	public AuthorDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public AuthorDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IAuthor> findAll()
+    {
+		String hql = "FROM Author";
+		Query q = getCurrentSession().createQuery( hql );
+		return q.list();
+    }
+
+    @Override
+    public IAuthor findById(int id)
+    {
+		return (IAuthor) getCurrentSession().get( Author.class, id );
+    }
+
+    @Override
+	public IAuthor getObject()
+	{
+		return new Author();
+	}
+
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    String hql = "SELECT A FROM Author as A, Item as I WHERE substring(soundex(A.ALname),0,4)=substring(soundex(:keyword),0,4) AND I.author.AId=A.AId ORDER BY I.ITitle";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "keyword", keyword );
+	    query.setMaxResults( 50 );
+	    
+	    List res = (List<Author>) query.list();
+	    
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..592d195
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+
+@Repository
+@Transactional(readOnly=true)
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	
+	public CcXactsDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CcXactsDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+
+	@SuppressWarnings( "rawtypes" )
+    @Override
+    public int getLastCcXactsId()
+    {
+		String hql = "SELECT CX_ID FROM cc_xacts ORDER BY CX_ID DESC";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+		List res = query.list();
+		
+		return ((ICcXacts) res.get( 0 )).getId();
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		String hql = "SELECT * FROM cc_xacts WHERE CX_ID = :id";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "id", id );		
+		
+		List<CcXacts> res = query.list();
+		
+		if( res.isEmpty() )
+			return null;
+		
+		return res.get( 0 );
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..f9c99e6
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
@@ -0,0 +1,72 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.hibernate.Country;
+
+@Repository
+@Transactional(readOnly=true)
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	private String tableName = "country";
+
+	public CountryDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CountryDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+//		String hql = "FROM Country C WHERE C.coId = :coId";
+//		Query q = this.session.createQuery(hql);
+//		q.setParameter("coId", id);
+//		List<Country> res = (List<Country>) q.list();
+//		return res.get(0);
+		return (ICountry) getCurrentSession().get( Country.class, id );
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public ICountry getByName(String country)
+    {
+	    String hql = "SELECT C FROM Country as C WHERE C.coName = :countryName";
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "countryName", country );
+	    
+	    List<Query> res = query.list();
+	    if( res.isEmpty() )
+	    {
+	    	return null;
+	    }
+	    
+	    return (ICountry) res.get( 0 );
+    }
+
+    @Override
+	public ICountry getObject()
+	{
+		return new Country();
+	}
+    
+    @Override
+    public void createTable()
+    {
+    	String query = "CREATE TABLE IF NOT EXISTS " + this.tableName;
+    	getCurrentSession().createSQLQuery( query );
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..fe42bca
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
@@ -0,0 +1,75 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.hibernate.Customer;
+
+@Repository
+@Transactional(readOnly=true)
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+
+	public CustomerDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+//		System.out.println("Normal constructor called!");
+	}
+	
+	@Autowired
+	public CustomerDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+    public ICustomer getUserBy(String username, String password)
+    {
+	    String query = "SELECT C FROM Customer as C WHERE C.CUname = :username AND C.CPasswd = :passwd";
+	    
+	    Query q = getCurrentSession().createQuery( query );
+	    q.setMaxResults( 1 );
+	    q.setParameter( "username", username );
+	    q.setParameter( "passwd", password );
+	    List res = q.list();
+	    
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (ICustomer) q.list().get( 0 );
+    }
+
+
+    @Override
+    public ICustomer getObject()
+    {
+	    return new Customer();
+    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return (ICustomer) getCurrentSession().get( Customer.class, id );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		String query = "SELECT C FROM Customer as C WHERE C.address = :address";
+		
+		Query q = getCurrentSession().createQuery( query );
+		q.setParameter( "address", address );
+		
+		return q.list();
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
new file mode 100644
index 0000000..1d5aca3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
@@ -0,0 +1,57 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+
+@Transactional(readOnly=true)
+public class DaoImpl<T> implements IDao<T>
+{
+	protected int count = 1;
+	protected SessionFactory sessionFactory;
+	
+	public DaoImpl()
+    {
+    }
+	
+	public DaoImpl(SessionFactory sessionFactory)
+	{
+		this.sessionFactory = sessionFactory;
+	}
+	
+
+	protected final Session getCurrentSession() 
+	{
+        return this.sessionFactory.getCurrentSession();
+    }
+	
+	@Override
+	@Transactional(readOnly=false)
+	public T shrani(T object) 
+	{	
+    	getCurrentSession().saveOrUpdate( object );
+    	return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+    @Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..3dfbe77
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
@@ -0,0 +1,251 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.hibernate.Item;
+
+@Repository
+@Transactional(readOnly=true)
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+
+	public ItemDaoImpl()
+	{
+		// super( (SessionFactory)
+		// ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public ItemDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAll()
+	{
+		String hql = "FROM Item";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setMaxResults( 20 );
+		return (List<IItem>) q.list();
+	}
+
+	@SuppressWarnings( "unused" )
+	@Override
+	public IItem findById(int id)
+	{
+		String hql = "SELECT I, A FROM Item I, Author A WHERE I.IId = :itemId AND A.AId = I.author.AId";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setParameter( "itemId", id );
+		@SuppressWarnings( "rawtypes" )
+		List res = q.list();
+		if ( q.list().get( 0 ) == null )
+			return null;
+
+		IItem item = (Item) ( (Object[]) q.list().get( 0 ) )[0];
+		// Hibernate.initialize( item.getShoppingCartLines() );
+		// Hibernate.initialize( item.getOrderLines());
+		return item;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> getPromotional()
+	{
+		String hql = "FROM Item I ORDER BY RAND()";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setMaxResults( 1 );
+
+		List<IItem> res = (List<IItem>) q.list();
+
+		ArrayList<IItem> promotional = new ArrayList<IItem>();
+//
+//		promotional.add( findById( 7296 ) );
+//
+//		promotional.add( findById( 6547 ) );
+//
+//		promotional.add( findById( 446 ) );
+//
+//		promotional.add( findById( 4807 ) );
+//
+//		promotional.add( findById( 5706 ) );
+		 promotional.add( findById( res.get( 0 ).getIRelated1() ) );
+		
+		 promotional.add( findById( res.get( 0 ).getIRelated2() ) );
+		
+		 promotional.add( findById( res.get( 0 ).getIRelated3() ) );
+		
+		 promotional.add( findById( res.get( 0 ).getIRelated4() ) );
+		
+		 promotional.add( findById( res.get( 0 ).getIRelated5() ) );
+
+		return promotional;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	@Transactional( readOnly = true )
+	public List<IItem> getNewProducts(String category)
+	{
+		Session session = sessionFactory.getCurrentSession();
+		Query query = session
+		        .createQuery( "SELECT I, A FROM Item as I, Author as A WHERE I.author.AId = A.AId AND I.ISubject = :category "
+		                + "ORDER BY I.IPubDate DESC, I.ITitle" );
+		query.setString( "category", category );
+		query.setMaxResults( 50 );
+		ArrayList<IItem> newProducts = new ArrayList<IItem>();
+
+		List<Object[]> res = query.list();
+		for ( int i = 0; i < res.size(); i++ )
+		{
+			newProducts.add( (Item) ( res.get( i )[0] ) );
+		}
+		return newProducts;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Transactional( readOnly = true )
+	public List<Object[]> getBestSellers(String category)
+	{
+		Session session = sessionFactory.openSession();
+
+		 Query query =
+		 session.createQuery("SELECT I.IId, A.AFname, A.ALname, I.ITitle, SUM(OL.olQty) AS val " +
+		 		"FROM OrderLine as OL, Item as I, Author as A " +
+		 		"WHERE " +
+		 		"I.author.AId = A.AId AND " +
+		 		"I.IId = OL.item.IId AND " +
+		 		"I.ISubject = :category " +
+		 		"GROUP BY OL.item.IId " +
+		 		"ORDER BY val DESC");
+
+//		Query query = session
+//		        .createSQLQuery(
+//		                "SELECT i_id as a, i_title as b, a_fname as c, a_lname as d, SUM(ol_qty) AS val "
+//		                        + "FROM "
+//		                        + "orders, order_line, item, author "
+//		                        + "WHERE "
+//		                        + "order_line.ol_o_id = orders.o_id AND item.i_id = order_line.ol_i_id "
+//		                        + "AND item.i_subject = :category AND item.i_a_id = author.a_id GROUP BY i_id "
+//		                        + "ORDER BY orders.o_date, val DESC" )
+//		        .addScalar( "a" ).addScalar( "b" ).addScalar( "c" )
+//		        .addScalar( "d" ).addScalar( "val" );
+
+		query.setParameter( "category", category );
+		query.setMaxResults( 50 );
+
+		long start = System.nanoTime();
+		List<Object[]> res = query.list();
+		System.out.println( "[best-sellers] Category = " + category + ", cas izvajanja = "
+		        + ( System.nanoTime() - start ) / 1E9 );
+
+		return res;
+
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public IItem getRandomItem()
+	{
+		String hql = "SELECT I FROM Item as I ORDER BY RAND()";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+
+		List<Object> res = query.list();
+		if ( res.isEmpty() )
+		{
+			return null;
+		}
+
+		return (IItem) res.get( 0 );
+	}
+
+	@Override
+	public IItem getObject()
+	{
+		return new Item();
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByAuthor(IAuthor author)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.author = :author ORDER BY I.ITitle";
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "author", author );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		ArrayList<IItem> items = new ArrayList<IItem>();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+			items.add( item );
+		}
+
+		return items;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByTitle(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I, Author as A WHERE I.author.AId = A.AId AND substring(soundex(I.ITitle), 0, 4) = substring(soundex(:title), 0, 4) ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "title", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllBySubject(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.ISubject = :subject ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "subject", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..365978b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
@@ -0,0 +1,50 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+
+@Repository
+@Transactional(readOnly=true)
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+
+	public OrderLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrderLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    String hql = "SELECT OL FROM OrderLine as OL WHERE OL.orders = :order";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "order", orders );
+	    
+	    return query.list();
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..d36bd24
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
@@ -0,0 +1,173 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+@Repository
+@Transactional(readOnly=true)
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+	public OrdersDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrdersDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@SuppressWarnings( { "rawtypes" } )
+    @Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		String hql16 = "SELECT O FROM Orders as O, Customer as C WHERE O.customer.CId = C.CId AND C.CUname = :cid ORDER BY O.ODate, O.OId DESC";
+		Query query16 = getCurrentSession().createQuery( hql16 );
+		query16.setMaxResults( 1 );
+		query16.setParameter( "cid", customer.getCId() );
+		List res16 = query16.list();
+		
+		if( res16 == null || res16.isEmpty() )
+		{
+			return null;
+		}
+		
+		IOrders order = (IOrders) res16.get( 0 );
+//		Hibernate.initialize( order.getOrderLines() );
+		
+		return order;
+////		SELECT O FROM Customer as C, Orders as O WHERE C.CId = O.OCId AND C.CUname = 'SE' ORDER BY O.ODate, O.OId DESC
+//		String hql1 = "SELECT O FROM Customer as C, Orders as O"
+//					+ " WHERE C.CId = O.customer.CId"
+//					+ " AND C.CUname = :username"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		Query query = getCurrentSession().createQuery( hql1 );
+//		query.setParameter( "username", customerUsername );
+//		query.setMaxResults( 1 );
+//		if( query.list().isEmpty() )
+//			return null;
+//		
+//		IOrders order = (IOrders) query.list().get( 0 );
+//		
+//		String hql2 = "SELECT O, C, CX, SHIP, SHIP_CO, BILL, BILL_CO FROM"
+//					+ " Orders as O, " 
+//				    + " Customer as C," 
+//				    + " CcXacts as CX, "
+//				    + " Address as SHIP, "
+//				    + " Address as BILL, "
+//				    + " Country as SHIP_CO, "
+//				    + " Country as BILL_CO "
+//				    + " WHERE O.OId = :orderId"
+//				    + " AND CX.id.cxOId = O.OId"
+//					+ " AND C.CId = O.customer.CId"
+//					+ " AND O.addressByOBillAddrId.addrId = BILL.addrId"
+//					+ " AND BILL.country.coId = BILL_CO.coId"
+//					+ " AND O.addressByOShipAddrId.addrId = SHIP.addrId"
+//					+ " AND SHIP.country.coId = SHIP_CO.coId"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		query = getCurrentSession().createQuery( hql2 );
+//		query.setMaxResults(1);
+//		query.setParameter("orderId", order.getOId());
+//		
+//		
+//		List res = query.list();
+//		if( res.isEmpty() )
+//			return null;
+//		
+//		order = new Orders((Object[]) query.list().get( 0 ));
+//		
+//	    return order;
+    }
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+		return (IOrders) getCurrentSession().get( Orders.class, cxOId );
+    }
+	
+//	  @Override
+//      public Orders getMostRecentOrder(String customerUsername, List<OrderLine> orderLines)
+//      {
+//    		String hql1 = "SELECT o_id "
+//					+ "FROM customer, orders "
+//					+ "WHERE customer.c_id = orders.o_c_id "
+//					+ "AND c_uname = ? "
+//					+ "ORDER BY o_date, orders.o_id DESC "
+//					+ "LIMIT 0,1";
+//    		Query query = getCurrentSession().createQuery( hql1 );
+//    		query.setParameter( "username", customerUsername );
+//    		query.setMaxResults( 1 );
+//    		if( query.list().isEmpty() )
+//    			return null;
+//    		
+//    		Orders order = (Orders) query.list().get( 0 );
+//    		
+//    		String hql2 = "SELECT orders.*, customer.*, "
+//					+ "  cc_xacts.cx_type, "
+//					+ "  ship.addr_street1 AS ship_addr_street1, "
+//					+ "  ship.addr_street2 AS ship_addr_street2, "
+//					+ "  ship.addr_state AS ship_addr_state, "
+//					+ "  ship.addr_zip AS ship_addr_zip, "
+//					+ "  ship_co.co_name AS ship_co_name, "
+//					+ "  bill.addr_street1 AS bill_addr_street1, "
+//					+ "  bill.addr_street2 AS bill_addr_street2, "
+//					+ "  bill.addr_state AS bill_addr_state, "
+//					+ "  bill.addr_zip AS bill_addr_zip, "
+//					+ "  bill_co.co_name AS bill_co_name "
+//					+ "FROM customer, orders, cc_xacts,"
+//					+ "  address AS ship, "
+//					+ "  country AS ship_co, "
+//					+ "  address AS bill,  "
+//					+ "  country AS bill_co "
+//					+ "WHERE orders.o_id = :orderId "
+//					+ "  AND cx_o_id = orders.o_id "
+//					+ "  AND customer.c_id = orders.o_c_id "
+//					+ "  AND orders.o_bill_addr_id = bill.addr_id "
+//					+ "  AND bill.addr_co_id = bill_co.co_id "
+//					+ "  AND orders.o_ship_addr_id = ship.addr_id "
+//					+ "  AND ship.addr_co_id = ship_co.co_id "
+//					+ "  AND orders.o_c_id = customer.c_id";
+//    		query = getCurrentSession().createQuery( hql2 );
+//    		query.setMaxResults(1);
+//    		query.setParameter("orderId", order.getOId());
+//    		
+//    		List res = query.list();
+//    		if( res.isEmpty() )
+//    			return null;
+//    		
+//    		order = new Orders((Object[]) query.list().get( 0 ));
+//    		
+//    		String hql3 = "SELECT * "
+//					+ "FROM order_line, item "
+//					+ "WHERE ol_o_id = :orderId " + "AND ol_i_id = i_id";
+//    		
+//    		query = getCurrentSession().createQuery( hql3 );
+//    		query.setParameter( "orderId", order.getOId() );
+//    		List<Object[]> res3 = query.list();
+//    		
+//    		for( Object[] obj : res3 )
+//    		{
+//    			orderLines.add( (OrderLine) obj[0] );
+//    		}
+//    		
+//    	    return order;
+//      }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..e67e099
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,83 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Repository
+@Transactional(readOnly=true)
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+
+	public ShoppingCartDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public ShoppingCartDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+    @Override
+    @Transactional(readOnly=false)
+    public Integer createEmptyCart()
+    {
+		IShoppingCart sc = new ShoppingCart();
+		sc.setScTime( new Date() );
+		shrani( sc );
+		
+		return sc.getScId();
+    }
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+    public IShoppingCart findById(Integer shoppingId)
+    {
+    	Session session = getCurrentSession();
+	    String hql = "SELECT SC FROM ShoppingCart as SC WHERE SC.scId = :scId";
+	    
+	    Query query = session.createQuery(hql);
+	    query.setParameter( "scId", shoppingId );
+	    
+	    List res = query.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    ShoppingCart sc = (ShoppingCart) res.get( 0 );
+	    Hibernate.initialize( sc.getShoppingCartLines() );
+	    return sc;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		String hql = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart = :shoppingCart";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "shoppingCart", shoppingCart );
+		
+		return query.list();
+    }
+	
+	@Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..eea318c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,95 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine;
+
+@Repository
+@Transactional(readOnly=true)
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+
+	
+	public ShoppingCartLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public ShoppingCartLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		String hql1 = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId AND SCL.item.IId = :itemId";
+	    Query q1 = getCurrentSession().createQuery( hql1 );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId );
+	    q1.setParameter( "itemId", itemId);
+	    
+	    List<Object> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (IShoppingCartLine) res.get( 0 );
+	    
+    }
+
+	@Override
+    public void delete(IShoppingCartLine obj)
+    {
+		Session session = getCurrentSession();
+		session.delete( obj );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public boolean isCartEmpty(int scId)
+    {
+		String hql = "SELECT COUNT(SCL) FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", scId);
+	    
+	    List<Long> res = q1.list();
+	    if( res != null && res.get(0) == 0 )
+	    	return true;
+	    
+	    return false;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+		String hql = "SELECT SCL, I FROM ShoppingCartLine as SCL, Item as I WHERE SCL.item.IId = I.IId AND SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId);
+	    
+	    List<Object[]> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return res;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+        return new ShoppingCartLine();
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
new file mode 100644
index 0000000..a66f55e
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+
+
+public interface IAddressDao extends IDao<IAddress>
+{	
+	public List<IAddress> findAll();
+
+	public IAddress findById(int id);
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
new file mode 100644
index 0000000..a45d8d4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
@@ -0,0 +1,15 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+public interface IAuthorDao extends IDao<IAuthor>
+{
+	public List<IAuthor> findAll();
+
+	public IAuthor findById(int id);
+
+	public List<IAuthor> findBySoundexLname(String keyword);
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
new file mode 100644
index 0000000..3165388
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+
+public interface ICcXactsDao extends IDao<ICcXacts> 
+{
+
+	int getLastCcXactsId();
+
+	public ICcXacts findById(Integer id);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
new file mode 100644
index 0000000..b3cb8f2
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+public interface ICountryDao extends IDao<ICountry>
+{
+
+	public ICountry findById(int id);
+
+	public ICountry getByName(String country);
+	
+	public void createTable();
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
new file mode 100644
index 0000000..ebf0fe2
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+public interface ICustomerDao extends IDao<ICustomer> 
+{
+
+	public ICustomer findById(Integer id);
+
+	public ICustomer getUserBy(String username, String password);
+
+	public List<ICustomer> findByAddress(IAddress addrId);
+
+	
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
new file mode 100644
index 0000000..91fc996
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
@@ -0,0 +1,12 @@
+package eu.cloudscale.showcase.db.dao;
+
+
+public interface IDao<T>
+{
+	public T shrani(T object);
+
+	public void finish();
+		
+	public T getObject();
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
new file mode 100644
index 0000000..9aadafb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
@@ -0,0 +1,21 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+
+public interface IItemDao extends IDao<IItem>
+{
+	public List<IItem> findAll();
+	public IItem findById(int id);
+	public List<IItem> getPromotional();
+	public List<IItem> getNewProducts(String category);
+	public List<Object[]> getBestSellers(String category);
+	public IItem getRandomItem();
+	public IItem getObject();
+	public List<IItem> findAllByAuthor(IAuthor author);
+	public List<IItem> findAllByTitle(String keyword);
+	public List<IItem> findAllBySubject(String keyword);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
new file mode 100644
index 0000000..103be77
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
@@ -0,0 +1,13 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrderLineDao extends IDao<IOrderLine> 
+{
+
+	List<IOrderLine> findAllByOrder(IOrders orders);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
new file mode 100644
index 0000000..e397e3c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrdersDao extends IDao<IOrders> 
+{
+	public IOrders getMostRecentOrder(ICustomer customer);
+
+	public IOrders findById(Integer cxOId);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
new file mode 100644
index 0000000..f2840a4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
@@ -0,0 +1,16 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+public interface IShoppingCartDao extends IDao<IShoppingCart> 
+{
+	public Integer createEmptyCart();
+
+	public IShoppingCart findById(Integer shoppingId);
+
+	public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
new file mode 100644
index 0000000..4822a6e
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
@@ -0,0 +1,18 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+public interface IShoppingCartLineDao extends IDao<IShoppingCartLine> 
+{
+
+	public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId);
+
+	public void delete(IShoppingCartLine bySCandItem);
+
+	public boolean isCartEmpty(int scId);
+
+	public List<Object[]> findBySCId(Integer shoppingId);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..eb964ea
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
@@ -0,0 +1,74 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.mongo.Address;
+
+@Repository("mongoAddressDao")
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	
+//	@Autowired
+//	private MongoTemplate mongoOps;	
+	
+	public AddressDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+
+	}
+	
+//	public AddressDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+
+    @Override
+	public List<IAddress> findAll()
+	{
+		return (List<IAddress>) mongoOps.findAll( IAddress.class, "address" );
+	}
+
+    @Override
+    public IAddress findById(int id)
+    {
+	    return (IAddress) mongoOps.findOne( Query.query( Criteria.where( "addrId" ).is( id )), Address.class );
+    }
+	
+    @Override
+	public IAddress getObject()
+	{
+	    return new Address();
+	}
+    
+    @Override
+    public IAddress shrani(IAddress object)
+    {
+        if( object.getAddrId() == null)
+        {
+        	object.setAddrId( getLastId() + 1 );
+        }
+        return super.shrani( object );
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "addrId" );
+	
+	    IAddress a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Address.class);
+	    
+	    if( a == null || a.getAddrId() == null)
+	    	return 0;
+	    
+	    return a.getAddrId(); 
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..814028c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
@@ -0,0 +1,82 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.mongo.Author;
+
+@Repository("mongoAuthorDao")
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+	public AuthorDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public AuthorDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+	
+    @SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+	public List<IAuthor> findAll()
+	{
+		List authors = mongoOps.findAll( Author.class, "author" );
+		return (List<IAuthor>) authors;
+	}
+
+    @Override
+    public IAuthor findById(int id)
+    {
+	    return (IAuthor) mongoOps.findOne( Query.query( Criteria.where( "authorId" ).is( id ) ), Author.class);
+    }
+    
+    @Override
+    public IAuthor getObject()
+    {
+    	return new Author();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "authorId" );
+	
+	    Author a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Author.class);
+	    
+	    if( a == null || a.getAId() == null)
+	    	return 0;
+	    
+	    return a.getAId();
+    }
+	
+	@Override
+	public IAuthor shrani(IAuthor object)
+	{
+		if( object.getAId() == null)
+		{
+			object.setAId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "lNameSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Author.class );
+	    
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..c59778a
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
@@ -0,0 +1,78 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.mongo.CcXacts;
+
+@Repository("mongoCcXactsDao")
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	public CcXactsDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public CcXactsDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+    
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		return (ICcXacts) mongoOps.findOne( Query.query(Criteria.where( "ccXactsId" ).is( id )), CcXacts.class);
+    }
+
+
+	@Override
+    public int getLastCcXactsId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );		 
+				
+	    ICcXacts cc = mongoOps.findOne( Query.query(new Criteria()).with( sort ), CcXacts.class);
+	    
+	    
+	    if( cc == null || cc.getId() == null)
+	    	return 0;
+	    
+	    return cc.getId();    
+	}
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );
+	
+	    CcXacts o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), CcXacts.class);
+	    
+	    if( o == null || o.getId() == null)
+	    	return 0;
+	    
+	    return o.getId();
+    }
+	
+	@Override
+	public ICcXacts shrani(ICcXacts object)
+	{
+		if( object.getId() == null)
+		{
+			object.setId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..ab53e53
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
@@ -0,0 +1,68 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.mongo.Country;
+
+@Repository("mongoCountryDao")
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	public CountryDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+	    return mongoOps.findOne( Query.query( Criteria.where( "coId" ).is(id) ), Country.class );
+    }
+
+	@Override
+    public ICountry getByName(String country)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "coName" ).regex(country, "i")), Country.class );
+    }
+	
+	@Override
+	public ICountry getObject()
+	{
+	    return new Country(); 
+	}
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "coId" );
+	
+	    Country o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Country.class);
+	    
+	    if( o == null || o.getCoId() == null)
+	    	return 0;
+	    
+	    return o.getCoId();
+    }
+	
+	@Override
+	public ICountry shrani(ICountry object)
+	{
+		if( object.getCoId() == null)
+		{
+			object.setCoId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@Override
+    public void createTable()
+    {
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..e873566
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
@@ -0,0 +1,80 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+
+@Repository("mongoCustomerDao")
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+	public CustomerDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public CustomerDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return mongoOps.findOne( Query.query(Criteria.where( "CId" ).is( id )), Customer.class);
+    }
+
+	@Override
+    public ICustomer getUserBy(String username, String password)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "CUname" ).is( username.toLowerCase()).and( "CPasswd" ).is(password.toLowerCase())), Customer.class );
+    }
+	
+    @Override
+	public ICustomer getObject()
+	{
+		return new Customer();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "addrId" ).is( address.getAddrId() )), Customer.class );
+		
+		return res;
+    }
+
+	@Override
+    public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "cId" );
+		
+	    Customer c = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Customer.class);
+	    
+	    if( c == null || c.getCId() == null)
+	    	return 0;
+	    
+	    return c.getCId();
+    }
+	
+	@Override
+	public ICustomer shrani(ICustomer object)
+	{
+		if( object.getCId() == null)
+		{
+			object.setCId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
new file mode 100644
index 0000000..3f75394
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
@@ -0,0 +1,48 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.annotation.Transactional;
+
+public abstract class DaoImpl<T> implements IDaoExt<T>
+{
+	@Autowired
+	protected MongoTemplate mongoOps;
+	
+	public DaoImpl()
+    {
+    }
+	
+	public DaoImpl(MongoTemplate mongoOps)
+	{
+		this.mongoOps = mongoOps;
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public T shrani(T object) 
+	{	
+		mongoOps.save( object );
+		return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+	@Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
new file mode 100644
index 0000000..24b2e4d
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
@@ -0,0 +1,10 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+
+
+public interface IDaoExt<T> extends IDao<T>
+{
+	public Integer getLastId();
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..df7914b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
@@ -0,0 +1,232 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+
+@Repository("mongoItemDao")
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+	public ItemDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+	public List<IItem> findAll()
+	{
+		List items = mongoOps.find( Query.query(new Criteria()).limit( 50 ), Item.class, "item");
+		return (List<IItem>) items;
+	}
+
+    @Override
+	public IItem findById(int id)
+	{
+		Item item = mongoOps.findOne( Query.query( Criteria.where( "IId" ).is( id ) ), Item.class);
+		return item;
+	}
+	
+    @Override
+	public IItem getRandomItem()
+	{
+		return (IItem) mongoOps.findOne( Query.query( Criteria.where( "IRandom" ).gt( new Random().nextDouble() )), Item.class, "item" );
+	}
+
+	@Override
+	public List<IItem> getPromotional() 
+	{
+
+		IItem item = getRandomItem();
+		ArrayList<IItem> promotional = new ArrayList<IItem>();
+		
+		promotional.add( findById( item.getIRelated1()));
+		
+		promotional.add(findById( item.getIRelated2()));
+		
+		promotional.add(findById( item.getIRelated3()));
+		
+		promotional.add(findById( item.getIRelated4()));
+		
+		promotional.add(findById( item.getIRelated5()));
+		
+		return promotional;
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> getNewProducts(String category)
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "IPubDate").and( new Sort(Sort.Direction.ASC, "ITitle") );
+		List items = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is(category) ).with( sort ).limit( 50 ), Item.class );
+		return (List<IItem>) items;
+    }
+	
+	class ValueObject
+	{
+		private String id;
+		private float value;
+		
+        public String getId()
+        {
+        	return id;
+        }
+		
+        public void setId(String id)
+        {
+        	this.id = id;
+        }
+		
+        public float getValue()
+        {
+        	return value;
+        }
+		
+        public void setValue(float value)
+        {
+        	this.value = value;
+        }
+		
+	}
+
+	@Override
+    public List<Object[]> getBestSellers(String category)
+    {
+    	Sort sort = new Sort( Sort.Direction.DESC, "olQty" );
+    	
+    	List<Item> res = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is( category )).limit( 50 ).with( sort ), Item.class);
+    	
+    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+    	for( Item item : res)
+    	{
+    		Object[] itemObj = new Object[5];
+    		itemObj[0] = item.getIId();
+    		itemObj[1] = item.getITitle();
+    		itemObj[2] = item.getAuthor().getAFname();
+    		itemObj[3] = item.getAuthor().getALname();
+    		itemObj[4] = item.getOlQty();
+    		
+    		items.add( itemObj );
+    	}
+    	
+    	return items;
+    	
+//    	BasicDBObject groupFields = new BasicDBObject("_id", "$itemId");
+//    	groupFields.put( "qty", new BasicDBObject("$sum", "$olQty") );
+//    	
+//    	BasicDBObject group = new BasicDBObject("$group", groupFields);
+//    	
+//    	BasicDBObject limit = new BasicDBObject("$limit", 3333);
+//    	
+//    	BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject("qty", -1));
+//    	
+//    	AggregationOutput output = mongoOps.getCollection( mongoOps.getCollectionName( OrderLine.class ) ).aggregate( group, sort, limit );
+//    	
+//    	IItemDao itemDao = DatabaseHelper.getDatabase().getItemDaoImpl();
+//    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+//    	
+//    	for( DBObject object : output.results() )
+//    	{
+//    		if( items.size() == 50 )
+//    		{
+//    			break;
+//    		}
+//    		
+//    		IItem item = itemDao.findById( (Integer) object.get( "_id" ) );
+//    		
+//    		if(item.getISubject().equals( category ))
+//    		{
+//        		Object[] itemObj = new Object[5];
+//        		itemObj[0] = item.getIId();
+//        		itemObj[1] = item.getITitle();
+//        		itemObj[2] = item.getAuthor().getAFname();
+//        		itemObj[3] = item.getAuthor().getALname(); 
+//        		itemObj[4] = object.get( "qty" );
+//        		items.add( itemObj );
+//    		}
+//    		   		
+//    		
+//    	}
+//    	
+//    	return items;
+//    	DELA FUL POCAS!!! - glej http://stackoverflow.com/questions/4430407/mongodb-mapreduce-is-much-slower-than-pure-java-processing
+//    	String mapFunction = "function()" +
+//    			"{" +
+//    			"	emit(this.itemId, this.olQty)" +
+//    			"}";
+//    	String reduceFunction = "function(k, v)" +
+//    			"{" +
+//    			"	return Array.sum(v)" +
+//    			"}";
+//    	MapReduceResults<ValueObject> results = mongoOps.mapReduce( "orderLine", mapFunction, reduceFunction, ValueObject.class );
+    }
+    
+    @Override
+    public IItem getObject()
+    {
+    	return new Item();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "iId" );
+	
+	    Item o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Item.class);
+	    
+	    if( o == null || o.getIId() == null)
+	    	return 0;
+	    
+	    return o.getIId();
+    }
+	
+	@Override
+	public IItem shrani(IItem object)
+	{
+		if( object.getIId() == null)
+		{
+			object.setIId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByAuthor(IAuthor author)
+    {
+    	List res = mongoOps.find( Query.query( Criteria.where( "authId" ).is( author.getAId() ) ).limit( 50 ), Item.class );
+	    return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByTitle(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iTitleSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Item.class );
+		
+		return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllBySubject(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iSubject" ).is( keyword )).limit( 50 ), Item.class );
+		
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..39691c2
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
@@ -0,0 +1,63 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.OrderLine;
+
+@Repository("mongoOrderLineDao")
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+
+	public OrderLineDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "orderId" ).is( orders.getOId() )), OrderLine.class );
+	    return res;
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "olId" );
+	
+	    OrderLine o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), OrderLine.class);
+	    
+	    if( o == null || o.getOlId() == null)
+	    	return 0;
+	    
+	    return o.getOlId();
+    }
+	
+	@Override
+	public IOrderLine shrani(IOrderLine object)
+	{
+		if( object.getOlId() == null)
+		{
+			object.setOlId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..9955db5
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
@@ -0,0 +1,71 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Repository("mongoOrdersDao")
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+
+	public OrdersDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+	@Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		Sort sort = new Sort( Sort.Direction.DESC, "ODate" );
+		Orders order = mongoOps.findOne( Query.query(Criteria.where( "customer" ).is(customer.getCId())).with( sort ), Orders.class );
+		
+		return order;
+    }
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+	    // TODO Auto-generated method stub
+	    return null;
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "oId" );
+	
+	    Orders o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Orders.class);
+	    
+	    if( o == null || o.getOId() == null)
+	    	return 0;
+	    
+	    return o.getOId();
+    }
+	
+	@Override
+	public IOrders shrani(IOrders object)
+	{
+		if( object.getOId() == null)
+		{
+			object.setOId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..b0f59e5
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,81 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCart;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartDao")
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+	public ShoppingCartDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+	@Override
+    public Integer createEmptyCart()
+    {
+		IShoppingCart sc = new ShoppingCart();
+		sc.setScId( getLastId() + 1 );
+		sc.setScTime( new Date() );
+		shrani( sc );
+		
+		return sc.getScId();
+    }
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "scId" );
+	
+	    ShoppingCart sc = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCart.class);
+	    
+	    if( sc == null || sc.getScId() == null)
+	    	return 0;
+	    
+	    return sc.getScId();
+    }
+
+	@Override
+    public IShoppingCart findById(Integer shoppingId)
+    {
+	    return mongoOps.findOne( Query.query(Criteria.where("scId").is(shoppingId)), ShoppingCart.class );
+    }
+	
+    @Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "shoppingCart" ).is( shoppingCart.getScId() )), ShoppingCartLine.class );
+		return res;
+    }
+	
+	@Override
+	public IShoppingCart shrani(IShoppingCart object)
+	{
+	    if( object.getScId() == null )
+	    {
+	    	object.setScId( getLastId()+1 );
+	    }
+	    return super.shrani( object );
+	}
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..3d9de2b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,87 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartLineDao")
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+	public ShoppingCartLineDaoImpl()
+	{
+		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public ShoppingCartLineDaoImpl(MongoTemplate mongoOps)
+//    {
+//		super(mongoOps);
+//    }
+
+	@Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		IShoppingCartLine scl = mongoOps.findOne( Query.query( Criteria.where( "shoppingCart" ).is( shoppingId ).andOperator( Criteria.where( "item" ).is( itemId ) )), ShoppingCartLine.class );
+			
+		return scl;
+    }
+
+	@Override
+    public void delete(IShoppingCartLine bySCandItem)
+    {
+	    // TODO Auto-generated method stub
+	    
+    }
+
+	@Override
+    public boolean isCartEmpty(int scId)
+    {
+	    // TODO Auto-generated method stub
+	    return false;
+    }
+
+	@Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+	    // TODO Auto-generated method stub
+	    return null;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+    	return new ShoppingCartLine();
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "sclId" );
+	
+	    ShoppingCartLine scl = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCartLine.class);
+	    
+	    if( scl == null || scl.getSclId() == null)
+	    	return 0;
+	    
+	    return scl.getSclId();
+    }
+    
+    @Override
+    public IShoppingCartLine shrani(IShoppingCartLine object)
+    {
+    	if( object.getSclId() == null )
+    	{
+    		object.setSclId( getLastId() + 1 );
+    	}
+        return super.shrani( object );
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDao.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDao.java
new file mode 100644
index 0000000..a09a0fb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDao.java
@@ -0,0 +1,25 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDao
+{
+	
+	public IItemDao getItemDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDao();
+
+	public IShoppingCartDao getShoppingCartDao();
+
+	public IAddressDao getAddressDao();
+
+	public ICustomerDao getCustomerDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+	 
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDaos.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDaos.java
new file mode 100644
index 0000000..7eac450
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IDaos.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDaos
+{
+	public IAddressDao getAddressDaoImpl();
+	
+	public IAuthorDao getAuthorDaoImpl();
+	
+	public ICcXactsDao getCcXactsDaoImpl();
+	
+	public ICountryDao getCountryDaoImpl();
+	
+	public ICustomerDao getCustomerDaoImpl();
+	
+	public IItemDao getItemDaoImpl();
+
+	public IOrderLineDao getOrderLineDaoImpl();
+	
+	public IOrdersDao getOrdersDaoImpl();
+	
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+
+	public IShoppingCartDao getShoppingCartDaoImpl();
+	 
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IService.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IService.java
new file mode 100644
index 0000000..ecdecc1
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/IService.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.db;
+
+import java.util.Date;
+import java.util.List;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+public interface IService extends IDaos
+{
+	
+    public List getNewProducts(String category);
+
+	public IShoppingCart doCart(Integer shoppingId, Integer itemId,
+            List<Integer> ids, List<Integer> quantities);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, long ccNumber, String ccName, Date ccExpiry,
+            String shipping, String street1, String street2, String city,
+            String state, String zip, String country);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, Long ccNumber, String ccName, Date ccExpiry,
+            String shipping);
+
+	public ICustomerDao getCustomerDaoImpl();
+
+	public List<IItem> searchByAuthor(String keyword);
+
+	public List<IItem> searchByTitle(String keyword);
+
+	public List<IItem> searchBySubject(String keyword);
+
+	public List<Object[]> getBestSellers(String category);	
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
new file mode 100644
index 0000000..cdb4a78
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
@@ -0,0 +1,183 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Address generated by hbm2java
+ */
+@Entity
+@Table( name = "address", catalog = "tpcw" )
+public class Address implements IAddress
+{
+
+	private Integer        addrId;
+
+	private ICountry        country;
+
+	private String         addrStreet1;
+
+	private String         addrStreet2;
+
+	private String         addrCity;
+
+	private String         addrState;
+
+	private String         addrZip;
+
+	private Set<IOrders>   ordersesForOBillAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<IOrders>   ordersesForOShipAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<ICustomer> customers              = new HashSet<ICustomer>( 0 );
+
+	public Address()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "ADDR_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAddrId()
+	{
+		return this.addrId;
+	}
+
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "ADDR_CO_ID", nullable = false )
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = (Country) country;
+	}
+
+	@Column( name = "ADDR_STREET1", length = 40 )
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Column( name = "ADDR_STREET2", length = 40 )
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Column( name = "ADDR_CITY", length = 30 )
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Column( name = "ADDR_STATE", length = 20 )
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Column( name = "ADDR_ZIP", length = 10 )
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOBillAddrId" )
+	public Set<IOrders> getOrdersesForOBillAddrId()
+	{
+		return this.ordersesForOBillAddrId;
+	}
+
+	public void setOrdersesForOBillAddrId(Set<IOrders> ordersesForOBillAddrId)
+	{
+		this.ordersesForOBillAddrId = ordersesForOBillAddrId;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOShipAddrId" )
+	public Set<IOrders> getOrdersesForOShipAddrId()
+	{
+		return this.ordersesForOShipAddrId;
+	}
+
+	public void setOrdersesForOShipAddrId(Set<IOrders> ordersesForOShipAddrId)
+	{
+		this.ordersesForOShipAddrId = ordersesForOShipAddrId;
+	}
+
+	@OneToMany( targetEntity=Customer.class, fetch = FetchType.LAZY, mappedBy = "address" )
+	public Set<ICustomer> getCustomers()
+	{
+		return this.customers;
+	}
+
+	public void setCustomers(Set<ICustomer> customers)
+	{
+		this.customers = customers;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
new file mode 100644
index 0000000..e71e116
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
@@ -0,0 +1,156 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+/**
+ * Author generated by hbm2java
+ */
+@Entity
+@Table( name = "author", catalog = "tpcw" )
+public class Author implements IAuthor, Serializable
+{
+
+    private static final long serialVersionUID = 1L;
+
+	private Integer      aId;
+
+	private String      AFname;
+
+	private String      ALname;
+
+	private String      AMname;
+
+	private Date        ADob;
+
+	private String      ABio;
+
+	private Set<IItem> items = new HashSet<IItem>( 0 );
+
+	public Author()
+	{
+	}
+
+	public Author(String AFname, String ALname, String AMname, Date ADob,
+	        String ABio, Set<IItem> items)
+	{
+		this.AFname = AFname;
+		this.ALname = ALname;
+		this.AMname = AMname;
+		this.ADob = ADob;
+		this.ABio = ABio;
+		this.items = items;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "A_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAId()
+	{
+		return this.aId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.aId = AId;
+	}
+
+	@Column( name = "A_FNAME", length = 20 )
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Column( name = "A_LNAME", length = 20 )
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Column( name = "A_MNAME", length = 20 )
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "A_DOB", length = 19 )
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Column( name = "A_BIO", length = 65535 )
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	@OneToMany( targetEntity=Item.class, fetch = FetchType.LAZY, mappedBy = "author" )
+	public Set<IItem> getItems()
+	{
+		return this.items;
+	}
+
+	public void setItems(Set<IItem> items)
+	{
+		this.items = items;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
new file mode 100644
index 0000000..35c0adb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
@@ -0,0 +1,187 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * CcXacts generated by hbm2java
+ */
+@Entity
+@Table( name = "cc_xacts", catalog = "tpcw" )
+public class CcXacts implements ICcXacts
+{
+
+	private ICountry country;
+
+	private IOrders  orders;
+
+	private Integer  id;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private IAuthor  cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CX_ID", unique = true, nullable = false )
+	@Override
+	public Integer getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public void setId(Integer string)
+	{
+		this.id = string;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_O_ID", nullable = false )
+	@Override
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@Column( name = "CX_TYPE", length = 10 )
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Column( name = "CX_NUM" )
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Column( name = "CX_NAME", length = 31 )
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Column( name = "CX_EXPIRY", length = 10 )
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+//	@Column( name = "CX_AUTH_ID", length = 15 )
+	@OneToOne( targetEntity=Author.class, fetch=FetchType.EAGER)
+	@JoinColumn( name="CX_AUTH_ID" )
+	@Override
+	public IAuthor getCxAuthId()
+	{
+		return this.cxAuthId;
+	}
+
+	@Override
+	public void setCxAuthId(IAuthor cxAuthId)
+	{
+		this.cxAuthId = cxAuthId;
+	}
+
+	@Column( name = "CX_XACT_AMT", precision = 15 )
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Column( name = "CX_XACT_DATE", length = 19 )
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_CO_ID", nullable = false)
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = country;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
new file mode 100644
index 0000000..d2411ef
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
@@ -0,0 +1,132 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+
+/**
+ * Country generated by hbm2java
+ */
+@Entity
+@Table( name = "country", catalog = "tpcw" )
+public class Country implements ICountry
+{
+
+	private Integer      coId;
+
+	private String      coName;
+
+	private Double      coExchange;
+
+	private String      coCurrency;
+
+	private Set<IAddress> addresses = new HashSet<IAddress>( 0 );
+
+	private Set<ICcXacts> ccXactses = new HashSet<ICcXacts>( 0 );
+
+	public Country()
+	{
+	}
+
+	public Country(String coName, Double coExchange, String coCurrency,
+	        Set<IAddress> addresses, Set<ICcXacts> ccXactses)
+	{
+		this.coName = coName;
+		this.coExchange = coExchange;
+		this.coCurrency = coCurrency;
+		this.addresses = addresses;
+		this.ccXactses = ccXactses;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CO_ID", unique = true, nullable = false )
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Column( name = "CO_NAME", length = 50 )
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Column( name = "CO_EXCHANGE", precision = 22, scale = 0 )
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Column( name = "CO_CURRENCY", length = 18 )
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+	@OneToMany( targetEntity=Address.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<IAddress> getAddresses()
+	{
+		return this.addresses;
+	}
+
+	public void setAddresses(Set<IAddress> addresses)
+	{
+		this.addresses = addresses;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
new file mode 100644
index 0000000..f1b99d3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
@@ -0,0 +1,281 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Customer generated by hbm2java
+ */
+@Entity
+@Table( name = "customer", catalog = "tpcw" )
+public class Customer implements ICustomer
+{
+
+	private Integer      cId;
+
+	private IAddress    address;
+
+	private String      CUname;
+
+	private String      CPasswd;
+
+	private String      CFname;
+
+	private String      CLname;
+
+	private String      CPhone;
+
+	private String      CEmail;
+
+	private Date        CSince;
+
+	private Date        CLastVisit;
+
+	private Date        CLogin;
+
+	private Date        CExpiration;
+
+	private Double      CDiscount;
+
+	private Double      CBalance;
+
+	private Double      CYtdPmt;
+
+	private Date        CBirthdate;
+
+	private String      CData;
+
+	private Set<IOrders> orderses = new HashSet<IOrders>( 0 );
+
+	public Customer()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "C_ID", unique = true, nullable = false )
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "C_ADDR_ID", nullable = false )
+	public IAddress getAddress()
+	{
+		return this.address;
+	}
+
+	public void setAddress(IAddress address)
+	{
+		this.address = address;
+	}
+
+	@Column( name = "C_UNAME", length = 20 )
+	public String getCUname()
+	{
+		return this.CUname;
+	}
+
+	public void setCUname(String CUname)
+	{
+		this.CUname = CUname;
+	}
+
+	@Column( name = "C_PASSWD", length = 20 )
+	public String getCPasswd()
+	{
+		return this.CPasswd;
+	}
+
+	public void setCPasswd(String CPasswd)
+	{
+		this.CPasswd = CPasswd;
+	}
+
+	@Column( name = "C_FNAME", length = 15 )
+	public String getCFname()
+	{
+		return this.CFname;
+	}
+
+	public void setCFname(String CFname)
+	{
+		this.CFname = CFname;
+	}
+
+	@Column( name = "C_LNAME", length = 15 )
+	public String getCLname()
+	{
+		return this.CLname;
+	}
+
+	public void setCLname(String CLname)
+	{
+		this.CLname = CLname;
+	}
+
+	@Column( name = "C_PHONE", length = 16 )
+	public String getCPhone()
+	{
+		return this.CPhone;
+	}
+
+	public void setCPhone(String CPhone)
+	{
+		this.CPhone = CPhone;
+	}
+
+	@Column( name = "C_EMAIL", length = 50 )
+	public String getCEmail()
+	{
+		return this.CEmail;
+	}
+
+	public void setCEmail(String CEmail)
+	{
+		this.CEmail = CEmail;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_SINCE", length = 10 )
+	public Date getCSince()
+	{
+		return this.CSince;
+	}
+
+	public void setCSince(Date CSince)
+	{
+		this.CSince = CSince;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_LAST_VISIT", length = 10 )
+	public Date getCLastVisit()
+	{
+		return this.CLastVisit;
+	}
+
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.CLastVisit = CLastVisit;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_LOGIN", length = 19 )
+	public Date getCLogin()
+	{
+		return this.CLogin;
+	}
+
+	public void setCLogin(Date CLogin)
+	{
+		this.CLogin = CLogin;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_EXPIRATION", length = 19 )
+	public Date getCExpiration()
+	{
+		return this.CExpiration;
+	}
+
+	public void setCExpiration(Date CExpiration)
+	{
+		this.CExpiration = CExpiration;
+	}
+
+	@Column( name = "C_DISCOUNT" )
+	public Double getCDiscount()
+	{
+		return this.CDiscount;
+	}
+
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.CDiscount = c_DISCOUNT;
+	}
+
+	@Column( name = "C_BALANCE" )
+	public Double getCBalance()
+	{
+		return this.CBalance;
+	}
+
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.CBalance = c_BALANCE;
+	}
+
+	@Column( name = "C_YTD_PMT" )
+	public Double getCYtdPmt()
+	{
+		return this.CYtdPmt;
+	}
+
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.CYtdPmt = c_YTD_PMT;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_BIRTHDATE", length = 10 )
+	public Date getCBirthdate()
+	{
+		return this.CBirthdate;
+	}
+
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.CBirthdate = CBirthdate;
+	}
+
+	@Column( name = "C_DATA", length = 65535 )
+	public String getCData()
+	{
+		return this.CData;
+	}
+
+	public void setCData(String CData)
+	{
+		this.CData = CData;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "customer" )
+	public Set<IOrders> getOrderses()
+	{
+		return this.orderses;
+	}
+
+	public void setOrderses(Set<IOrders> orderses)
+	{
+		this.orderses = orderses;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
new file mode 100644
index 0000000..ceed572
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
@@ -0,0 +1,378 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.hibernate.annotations.Index;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * Item generated by hbm2java
+ */
+@Entity
+@Table( name = "item", catalog = "tpcw" )
+public class Item implements java.io.Serializable, IItem
+{
+
+	private static final long serialVersionUID  = 8806932749710043085L;
+
+	private Integer           IId;
+
+	private IAuthor           author;
+
+	private String            ITitle;
+
+	private Date              IPubDate;
+
+	private String            IPublisher;
+
+	private String            ISubject;
+
+	private String            IDesc;
+
+	private Integer           IRelated1;
+
+	private Integer           IRelated2;
+
+	private Integer           IRelated3;
+
+	private Integer           IRelated4;
+
+	private Integer           IRelated5;
+
+	private String            IThumbnail;
+
+	private String            IImage;
+
+	private Double            ISrp;
+
+	private Double            ICost;
+
+	private Date              IAvail;
+
+	private Integer           IStock;
+
+	private String            IIsbn;
+
+	private String            IPage;
+
+	private String            IBacking;
+
+	private String            IDimension;
+	
+	private double			  IRandom;
+
+	private Set<IOrderLine>       orderLines        = new HashSet<IOrderLine>( 0 );
+
+	private Set<IShoppingCartLine>       shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public Item()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "I_ID", unique = true, nullable = false )
+	public Integer getIId()
+	{
+		return this.IId;
+	}
+
+	public void setIId(Integer IId)
+	{
+		this.IId = IId;
+	}
+
+	@ManyToOne( targetEntity=Author.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "I_A_ID", nullable = false )
+	public IAuthor getAuthor()
+	{
+		return this.author;
+	}
+
+	public void setAuthor(IAuthor author)
+	{
+		this.author = author;
+	}
+
+	@Column( name = "I_TITLE", length = 60 )
+	public String getITitle()
+	{
+		return this.ITitle;
+	}
+
+	public void setITitle(String ITitle)
+	{
+		this.ITitle = ITitle;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_PUB_DATE", length = 19 )
+	public Date getIPubDate()
+	{
+		return this.IPubDate;
+	}
+
+	public void setIPubDate(Date IPubDate)
+	{
+		this.IPubDate = IPubDate;
+	}
+
+	@Column( name = "I_PUBLISHER", length = 60 )
+	public String getIPublisher()
+	{
+		return this.IPublisher;
+	}
+
+	public void setIPublisher(String IPublisher)
+	{
+		this.IPublisher = IPublisher;
+	}
+
+	@Column( name = "I_SUBJECT", length = 60 )
+	public String getISubject()
+	{
+		return this.ISubject;
+	}
+
+	public void setISubject(String ISubject)
+	{
+		this.ISubject = ISubject;
+	}
+
+	@Column( name = "I_DESC", length = 65535 )
+	public String getIDesc()
+	{
+		return this.IDesc;
+	}
+
+	public void setIDesc(String IDesc)
+	{
+		this.IDesc = IDesc;
+	}
+
+	@Column( name = "I_RELATED1" )
+	public Integer getIRelated1()
+	{
+		return this.IRelated1;
+	}
+
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.IRelated1 = IRelated1;
+	}
+
+	@Column( name = "I_RELATED2" )
+	public Integer getIRelated2()
+	{
+		return this.IRelated2;
+	}
+
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.IRelated2 = IRelated2;
+	}
+
+	@Column( name = "I_RELATED3" )
+	public Integer getIRelated3()
+	{
+		return this.IRelated3;
+	}
+
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.IRelated3 = IRelated3;
+	}
+
+	@Column( name = "I_RELATED4" )
+	public Integer getIRelated4()
+	{
+		return this.IRelated4;
+	}
+
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.IRelated4 = IRelated4;
+	}
+
+	@Column( name = "I_RELATED5" )
+	public Integer getIRelated5()
+	{
+		return this.IRelated5;
+	}
+
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.IRelated5 = IRelated5;
+	}
+
+	@Column( name = "I_THUMBNAIL", length = 60 )
+	public String getIThumbnail()
+	{
+		return this.IThumbnail;
+	}
+
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.IThumbnail = IThumbnail;
+	}
+
+	@Column( name = "I_IMAGE", length = 60 )
+	public String getIImage()
+	{
+		return this.IImage;
+	}
+
+	public void setIImage(String IImage)
+	{
+		this.IImage = IImage;
+	}
+
+	@Column( name = "I_SRP" )
+	public Double getISrp()
+	{
+		return this.ISrp;
+	}
+
+	public void setISrp(Double i_SRP)
+	{
+		this.ISrp = i_SRP;
+	}
+
+	@Column( name = "I_COST" )
+	public Double getICost()
+	{
+		return this.ICost;
+	}
+
+	public void setICost(Double i_COST)
+	{
+		this.ICost = i_COST;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_AVAIL", length = 19 )
+	public Date getIAvail()
+	{
+		return this.IAvail;
+	}
+
+	public void setIAvail(Date IAvail)
+	{
+		this.IAvail = IAvail;
+	}
+
+	@Column( name = "I_STOCK" )
+	public Integer getIStock()
+	{
+		return this.IStock;
+	}
+
+	public void setIStock(Integer IStock)
+	{
+		this.IStock = IStock;
+	}
+
+	@Column( name = "I_ISBN", length = 13 )
+	public String getIIsbn()
+	{
+		return this.IIsbn;
+	}
+
+	public void setIIsbn(String IIsbn)
+	{
+		this.IIsbn = IIsbn;
+	}
+
+	@Column( name = "I_PAGE", length = 4 )
+	public String getIPage()
+	{
+		return this.IPage;
+	}
+
+	public void setIPage(String IPage)
+	{
+		this.IPage = IPage;
+	}
+
+	@Column( name = "I_BACKING", length = 15 )
+	public String getIBacking()
+	{
+		return this.IBacking;
+	}
+
+	public void setIBacking(String IBacking)
+	{
+		this.IBacking = IBacking;
+	}
+
+	@Column( name = "I_DIMENSION", length = 25 )
+	public String getIDimension()
+	{
+		return this.IDimension;
+	}
+
+	public void setIDimension(String IDimension)
+	{
+		this.IDimension = IDimension;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IShoppingCartLine> getShoppingCartLines()
+	{
+		return this.shoppingCartLines;
+	}
+
+	public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		this.shoppingCartLines = shoppingCartLines;
+	}
+
+	@Override
+	@Column( name="I_RANDOM")
+    public double getIRandom()
+    {
+	    return IRandom;
+    }
+
+	@Override
+    public void setIRandom(double num)
+    {
+	    IRandom = num;	    
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
new file mode 100644
index 0000000..604ca14
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
@@ -0,0 +1,116 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * OrderLine generated by hbm2java
+ */
+@Entity
+@Table( name = "order_line", catalog = "tpcw" )
+public class OrderLine implements IOrderLine
+{
+	private Integer     id;
+
+	private IOrders  orders;
+
+	private IItem    item;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+
+	public OrderLine()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "OL_ID", unique = true, nullable = false )
+	public Integer getOlId()
+	{
+		return this.id;
+	}
+
+	public void setOlId(Integer olId)
+	{
+		this.id = olId;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_O_ID", nullable = false )
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_I_ID", nullable = false )
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "OL_QTY" )
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Column( name = "OL_DISCOUNT" )
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Column( name = "OL_COMMENT", length = 100 )
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
new file mode 100644
index 0000000..397dfcb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
@@ -0,0 +1,218 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Entity
+@Table( name = "orders", catalog = "tpcw" )
+public class Orders implements IOrders
+{
+
+	private Integer      id;
+
+	private IAddress     addressByOShipAddrId;
+
+	private ICustomer    customer;
+
+	private IAddress     addressByOBillAddrId;
+
+	private Date        ODate;
+
+	private Double      OSubTotal;
+
+	private Double      OTax;
+
+	private Double      OTotal;
+
+	private String      OShipType;
+
+	private Date        OShipDate;
+
+	private String      OStatus;
+
+	private Set<ICcXacts> ccXactses  = new HashSet<ICcXacts>( 0 );
+
+	private Set<IOrderLine> orderLines = new HashSet<IOrderLine>( 0 );
+
+	public Orders()
+	{
+
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "O_ID", unique = true, nullable = false )
+	public Integer getOId()
+	
+	{
+		return this.id;
+	}
+
+	public void setOId(Integer OId)
+	{
+		this.id = OId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_SHIP_ADDR_ID", nullable = false )
+	public IAddress getAddressByOShipAddrId()
+	{
+		return this.addressByOShipAddrId;
+	}
+
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId;
+	}
+
+	@ManyToOne( targetEntity=Customer.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_C_ID", nullable = false )
+	public ICustomer getCustomer()
+	{
+		return this.customer;
+	}
+
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_BILL_ADDR_ID", nullable = false )
+	public IAddress getAddressByOBillAddrId()
+	{
+		return this.addressByOBillAddrId;
+	}
+
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_DATE", length = 19 )
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+
+	@Column( name = "O_SUB_TOTAL" )
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Column( name = "O_TAX" )
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Column( name = "O_TOTAL" )
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Column( name = "O_SHIP_TYPE", length = 10 )
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_SHIP_DATE", length = 19 )
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+
+	@Column( name = "O_STATUS", length = 15 )
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
new file mode 100644
index 0000000..d5cc825
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
@@ -0,0 +1,87 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+/**
+ * ShoppingCart generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart", catalog = "tpcw" )
+public class ShoppingCart implements IShoppingCart
+{
+	private Integer scId;
+
+	private Date    scTime;
+	
+	private Set<IShoppingCartLine> shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "shoppingCart" )
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+    	return shoppingCartLines;
+    }
+
+    public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+    {
+    	this.shoppingCartLines = shoppingCartLines;
+    }
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SC_ID", unique = true, nullable = false )
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "SC_TIME", length = 19 )
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
new file mode 100644
index 0000000..c3ad7e4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
@@ -0,0 +1,95 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * ShoppingCartLine generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart_line", catalog = "tpcw" )
+public class ShoppingCartLine implements IShoppingCartLine
+{
+	private Integer sclId;
+
+	private IItem    item;
+
+	private Integer sclQty;
+	
+	private IShoppingCart shoppingCart;	
+
+	public ShoppingCartLine()
+	{
+	}
+	
+	@ManyToOne( targetEntity=ShoppingCart.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "SCL_SC_ID", nullable = false )
+	@Override
+    public IShoppingCart getShoppingCart()
+    {
+    	return shoppingCart;
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart;
+    }
+
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SCL_ID", unique = true, nullable = false )
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId( Integer sclScId )
+	{
+		this.sclId = sclScId;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "SCL_I_ID", nullable = false )
+	@Override
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "SCL_QTY" )
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
new file mode 100644
index 0000000..21df49c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
@@ -0,0 +1,40 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Set;
+
+
+
+public interface IAddress
+{
+
+	public Integer getAddrId();
+
+	public void setAddrId(Integer addrId);
+
+	public  ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public String getAddrStreet1();
+
+	public void setAddrStreet1(String addrStreet1);
+
+	public String getAddrStreet2();
+
+	public void setAddrStreet2(String addrStreet2);
+
+	public String getAddrCity();
+
+	public void setAddrCity(String addrCity);
+
+	public String getAddrState();
+
+	public void setAddrState(String addrState);
+
+	public String getAddrZip();
+
+	public void setAddrZip(String addrZip);
+
+	public Set<ICustomer> getCustomers();
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
new file mode 100644
index 0000000..a1ebe5a
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
@@ -0,0 +1,34 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface IAuthor
+{
+
+	public Integer getAId();
+
+	public void setAId(Integer AId);
+
+	public String getAFname();
+
+	public void setAFname(String AFname);
+
+	public String getALname();
+
+	public void setALname(String ALname);
+
+	public String getAMname();
+
+	public void setAMname(String AMname);
+
+	public Date getADob();
+
+	public void setADob(Date ADob);
+
+	public String getABio();
+
+	public void setABio(String ABio);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
new file mode 100644
index 0000000..d7e3add
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
@@ -0,0 +1,50 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface ICcXacts
+{
+
+	public Integer getId();
+
+	public void setId(Integer id);
+
+	public ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public IOrders getOrders();
+
+	public String getCxType();
+
+	public void setCxType(String cxType);
+
+	public Integer getCxNum();
+
+	public void setCxNum(Integer cxNum);
+
+	public String getCxName();
+
+	public void setCxName(String cxName);
+
+	public Date getCxExpiry();
+
+	public void setCxExpiry(Date cxExpiry);
+
+	public IAuthor getCxAuthId();
+
+	public void setCxAuthId(IAuthor cxAuthId);
+
+	public Double getCxXactAmt();
+
+	public void setCxXactAmt(Double o_TOTAL);
+
+	public Date getCxXactDate();
+
+	public void setCxXactDate(Date cxXactDate);
+
+	public void setOrders(IOrders orders);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
new file mode 100644
index 0000000..376b67c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
@@ -0,0 +1,23 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface ICountry
+{
+
+	public Integer getCoId();
+
+	public void setCoId(Integer coId);
+
+	public String getCoName();
+
+	public void setCoName(String coName);
+
+	public Double getCoExchange();
+
+	public void setCoExchange(Double coExchange);
+
+	public String getCoCurrency();
+
+	public void setCoCurrency(String coCurrency);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
new file mode 100644
index 0000000..4046c24
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface ICustomer
+{
+
+	public Integer getCId();
+
+	public void setCId(Integer CId);
+
+	public IAddress getAddress();
+
+	public void setAddress(IAddress address);
+
+	public String getCUname();
+
+	public void setCUname(String CUname);
+
+	public String getCPasswd();
+
+	public void setCPasswd(String CPasswd);
+
+	public String getCFname();
+
+	public void setCFname(String CFname);
+
+	public String getCLname();
+
+	public void setCLname(String CLname);
+
+	public String getCPhone();
+
+	public void setCData(String CData);
+
+	public String getCData();
+
+	public void setCBirthdate(Date CBirthdate);
+
+	public Date getCBirthdate();
+
+	public void setCYtdPmt(Double c_YTD_PMT);
+
+	public Double getCYtdPmt();
+
+	public void setCBalance(Double c_BALANCE);
+
+	public Double getCBalance();
+
+	public void setCDiscount(double c_DISCOUNT);
+
+	public Double getCDiscount();
+
+	public void setCExpiration(Date CExpiration);
+
+	public Date getCExpiration();
+
+	public void setCLogin(Date CLogin);
+
+	public Date getCLogin();
+
+	public void setCLastVisit(Date CLastVisit);
+
+	public Date getCLastVisit();
+
+	public void setCSince(Date CSince);
+
+	public Date getCSince();
+
+	public void setCEmail(String CEmail);
+
+	public String getCEmail();
+
+	public void setCPhone(String CPhone);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IItem.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
new file mode 100644
index 0000000..700e485
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
@@ -0,0 +1,100 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface IItem
+{
+
+	public Integer getIId();
+
+	public void setIDimension(String IDimension);
+
+	public String getIDimension();
+
+	public void setIBacking(String IBacking);
+
+	public String getIBacking();
+
+	public void setIPage(String IPage);
+
+	public String getIPage();
+
+	public void setIIsbn(String IIsbn);
+
+	public String getIIsbn();
+
+	public void setIStock(Integer IStock);
+
+	public Integer getIStock();
+
+	public void setIAvail(Date IAvail);
+
+	public Date getIAvail();
+
+	public void setICost(Double i_COST);
+
+	public Double getICost();
+
+	public void setISrp(Double i_SRP);
+
+	public Double getISrp();
+
+	public void setIImage(String IImage);
+
+	public String getIImage();
+
+	public void setIThumbnail(String IThumbnail);
+
+	public String getIThumbnail();
+
+	public void setIRelated5(Integer IRelated5);
+
+	public Integer getIRelated5();
+
+	public void setIRelated4(Integer IRelated4);
+
+	public Integer getIRelated4();
+
+	public void setIRelated3(Integer IRelated3);
+
+	public Integer getIRelated3();
+
+	public void setIRelated2(Integer IRelated2);
+
+	public Integer getIRelated2();
+
+	public void setIRelated1(Integer IRelated1);
+
+	public Integer getIRelated1();
+
+	public void setIDesc(String IDesc);
+
+	public String getIDesc();
+
+	public void setISubject(String ISubject);
+
+	public String getISubject();
+
+	public void setIPublisher(String IPublisher);
+
+	public String getIPublisher();
+
+	public void setIPubDate(Date IPubDate);
+
+	public Date getIPubDate();
+
+	public void setITitle(String ITitle);
+
+	public String getITitle();
+
+	public void setAuthor(IAuthor author);
+
+	public IAuthor getAuthor();
+
+	public void setIId(Integer IId);
+	
+	public double getIRandom();
+	
+	public void setIRandom(double num);
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
new file mode 100644
index 0000000..581c9c8
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
@@ -0,0 +1,31 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface IOrderLine
+{
+
+	public Integer getOlId();
+
+	public void setOlId(Integer olId);
+
+	public IOrders getOrders();
+
+	public void setOrders(IOrders orders);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getOlQty();
+
+	public void setOlQty(Integer olQty);
+
+	public Double getOlDiscount();
+
+	public void setOlDiscount(Double oL_DISCOUNT);
+
+	public String getOlComment();
+
+	public void setOlComment(String olComment);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
new file mode 100644
index 0000000..6b0ad44
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+public interface IOrders
+{
+
+	public Integer getOId();
+
+	public void setOId(Integer OId);
+
+	IAddress getAddressByOShipAddrId();
+
+	void setAddressByOShipAddrId(IAddress addressByOShipAddrId);
+
+	ICustomer getCustomer();
+
+	void setCustomer(ICustomer customer);
+
+	IAddress getAddressByOBillAddrId();
+
+	void setAddressByOBillAddrId(IAddress addressByOBillAddrId);
+
+
+	void setOStatus(String OStatus);
+
+	String getOStatus();
+
+	void setOShipDate(Date OShipDate);
+
+	Date getOShipDate();
+
+	void setOShipType(String OShipType);
+
+	String getOShipType();
+
+	void setOTotal(double o_TOTAL);
+
+	Double getOTotal();
+
+	void setOTax(Double o_TAX);
+
+	Double getOTax();
+
+	void setOSubTotal(Double o_SUB_TOTAL);
+
+	Double getOSubTotal();
+
+	void setODate(Date ODate);
+
+	Date getODate();
+
+	public Set<IOrderLine> getOrderLines();
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
new file mode 100644
index 0000000..7b69ab3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+
+public interface IShoppingCart
+{
+
+	public void setScTime(Date scTime);
+
+	public Date getScTime();
+
+	public void setScId(Integer scId);
+
+	public Integer getScId();
+
+	public Set<IShoppingCartLine> getShoppingCartLines();
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
new file mode 100644
index 0000000..3a8b308
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
@@ -0,0 +1,24 @@
+package eu.cloudscale.showcase.db.model;
+
+
+
+public interface IShoppingCartLine
+{
+
+	public IShoppingCart getShoppingCart();
+
+	public void setShoppingCart(IShoppingCart shoppingCart);
+
+	public Integer getSclId();
+
+	public void setSclId(Integer sclScId);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getSclQty();
+
+	public void setSclQty(Integer sclQty);
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
new file mode 100644
index 0000000..9e13fb4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
@@ -0,0 +1,157 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "address" )
+public class Address implements IAddress, Serializable
+{
+	@Autowired
+	private MongoService service;
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 926688150220849693L;
+
+	@Id
+	private ObjectId      id;
+
+	private Integer       addrId;
+
+	private Integer		  coId;
+
+	private String        addrStreet1;
+
+	private String        addrStreet2;
+
+	private String        addrCity;
+
+	private String        addrState;
+
+	private String        addrZip;
+	
+	public Address()
+	{
+		
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAddrId()
+	{
+		return addrId;
+	}
+
+	@Override
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryDaoImpl().findById( this.coId );
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.coId = country.getCoId();
+	}
+
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@Override
+    public Set<ICustomer> getCustomers()
+    {
+		if( this.addrId == null )
+			return new HashSet<ICustomer>(0);
+		
+		IAddress address = DatabaseHelper.getDatabase().getAddressDaoImpl().findById( this.addrId );
+		return new HashSet<ICustomer>(service.getCustomerDaoImpl().findByAddress( address )); 
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
new file mode 100644
index 0000000..ba30c88
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
@@ -0,0 +1,135 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+@Document( collection = "author" )
+public class Author implements IAuthor, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = -658143403409650089L;
+
+	@Id
+	private ObjectId id;
+
+	private Integer  authorId;
+
+	private String   AFname;
+
+	private String   ALname;
+
+	private String   AMname;
+
+	private Date     ADob;
+
+	private String   ABio;
+
+	private String   lNameSoundex;
+
+	public Author()
+	{
+
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAId()
+	{
+		return this.authorId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.authorId = AId;
+	}
+
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	public String getlNameSoundex()
+	{
+		return lNameSoundex;
+	}
+
+	public void setlNameSoundex(String lNameSoundex)
+	{
+		this.lNameSoundex = lNameSoundex;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
new file mode 100644
index 0000000..419a988
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
@@ -0,0 +1,183 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "ccxacts" )
+public class CcXacts implements ICcXacts, Serializable
+{
+
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;;
+	
+    private static final long serialVersionUID = -8752879558532267562L;
+
+	@Id
+	private ObjectId id;
+	
+	private Integer   ccXactsId;
+
+	private Integer cxCoId;
+
+	private Integer cxOId;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private Integer cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+	
+	public CcXacts()
+	{
+	}
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getId()
+	{
+		return this.ccXactsId;
+	}
+
+	@Override
+	public void setId(Integer id)
+	{
+		this.ccXactsId = id;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryDaoImpl().findById( this.cxCoId );
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.cxCoId = country.getCoId();
+	}
+
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().getOrdersDaoImpl().findById( this.cxOId );
+	}
+
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+	@Override
+	public IAuthor getCxAuthId()
+	{
+		return DatabaseHelper.getDatabase().getAuthorDaoImpl().findById( this.cxAuthId );
+	}
+
+	@Override
+	public void setCxAuthId(IAuthor cxAuthId)
+	{
+		this.cxAuthId = cxAuthId.getAId();
+	}
+
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.cxOId = orders.getOId();
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
new file mode 100644
index 0000000..12179c7
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
@@ -0,0 +1,93 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+@Document( collection = "country" )
+public class Country implements ICountry, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 2938841459454938022L;
+
+	@Id
+	private ObjectId      id;
+
+	private Integer        coId;
+
+	private String        coName;
+
+	private Double        coExchange;
+
+	private String        coCurrency;
+
+	public Country()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
new file mode 100644
index 0000000..e74a230
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
@@ -0,0 +1,283 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "customer" )
+public class Customer implements ICustomer, Serializable
+{
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = 1920560375336316671L;
+
+	@Id
+	private ObjectId id;
+
+	private Integer  cId;
+
+	private Integer  addrId;
+
+	private String   cUname;
+
+	private String   cPasswd;
+
+	private String   cFname;
+
+	private String   cLname;
+
+	private String   cPhone;
+
+	private String   cEmail;
+
+	private Date     cSince;
+
+	private Date     cLastVisit;
+
+	private Date     cLogin;
+
+	private Date     cExpiration;
+
+	private Double   cDiscount;
+
+	private Double   cBalance;
+
+	private Double   cYtdPmt;
+
+	private Date     cBirthdate;
+
+	private String   cData;
+	
+	public Customer()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	@Override
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@Override
+	public IAddress getAddress()
+	{
+		return DatabaseHelper.getDatabase().getAddressDaoImpl().findById( addrId );
+	}
+
+	@Override
+	public void setAddress(IAddress address)
+	{
+		this.addrId = address.getAddrId();
+	}
+
+	@Override
+	public String getCUname()
+	{
+		return this.cUname;
+	}
+
+	@Override
+	public void setCUname(String CUname)
+	{
+		this.cUname = CUname;
+	}
+
+	@Override
+	public String getCPasswd()
+	{
+		return this.cPasswd;
+	}
+
+	@Override
+	public void setCPasswd(String CPasswd)
+	{
+		this.cPasswd = CPasswd;
+	}
+
+	@Override
+	public String getCFname()
+	{
+		return this.cFname;
+	}
+
+	@Override
+	public void setCFname(String CFname)
+	{
+		this.cFname = CFname;
+	}
+
+	@Override
+	public String getCLname()
+	{
+		return this.cLname;
+	}
+
+	@Override
+	public void setCLname(String CLname)
+	{
+		this.cLname = CLname;
+	}
+
+	@Override
+	public String getCPhone()
+	{
+		return this.cPhone;
+	}
+
+	@Override
+	public void setCPhone(String CPhone)
+	{
+		this.cPhone = CPhone;
+	}
+
+	@Override
+	public String getCEmail()
+	{
+		return this.cEmail;
+	}
+
+	@Override
+	public void setCEmail(String CEmail)
+	{
+		this.cEmail = CEmail;
+	}
+
+	@Override
+	public Date getCSince()
+	{
+		return this.cSince;
+	}
+
+	@Override
+	public void setCSince(Date CSince)
+	{
+		this.cSince = CSince;
+	}
+
+	@Override
+	public Date getCLastVisit()
+	{
+		return this.cLastVisit;
+	}
+
+	@Override
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.cLastVisit = CLastVisit;
+	}
+
+	@Override
+	public Date getCLogin()
+	{
+		return this.cLogin;
+	}
+
+	@Override
+	public void setCLogin(Date CLogin)
+	{
+		this.cLogin = CLogin;
+	}
+
+	@Override
+	public Date getCExpiration()
+	{
+		return this.cExpiration;
+	}
+
+	@Override
+	public void setCExpiration(Date CExpiration)
+	{
+		this.cExpiration = CExpiration;
+	}
+
+	@Override
+	public Double getCDiscount()
+	{
+		return this.cDiscount;
+	}
+
+	@Override
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.cDiscount = c_DISCOUNT;
+	}
+
+	@Override
+	public Double getCBalance()
+	{
+		return this.cBalance;
+	}
+
+	@Override
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.cBalance = c_BALANCE;
+	}
+
+	@Override
+	public Double getCYtdPmt()
+	{
+		return this.cYtdPmt;
+	}
+
+	@Override
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.cYtdPmt = c_YTD_PMT;
+	}
+
+	@Override
+	public Date getCBirthdate()
+	{
+		return this.cBirthdate;
+	}
+
+	@Override
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.cBirthdate = CBirthdate;
+	}
+
+	@Override
+	public String getCData()
+	{
+		return this.cData;
+	}
+
+	@Override
+	public void setCData(String CData)
+	{
+		this.cData = CData;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
new file mode 100644
index 0000000..910c172
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
@@ -0,0 +1,401 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Component
+@Document( collection = "item" )
+public class Item implements IItem, Serializable
+{
+
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = -1311610290364285271L;
+
+	@Id
+	private ObjectId id;
+
+	private Integer  iId;
+
+	private Integer  authId;
+
+	private String   iTitle;
+
+	private Date     iPubDate;
+
+	private String   iPublisher;
+
+	private String   iSubject;
+
+	private String   iDesc;
+
+	private Integer  iRelated1;
+
+	private Integer  iRelated2;
+
+	private Integer  iRelated3;
+
+	private Integer  iRelated4;
+
+	private Integer  iRelated5;
+
+	private String   iThumbnail;
+
+	private String   iImage;
+
+	private Double   iSrp;
+
+	private Double   iCost;
+
+	private Date     iAvail;
+
+	private Integer  iStock;
+
+	private String   iIsbn;
+
+	private String   iPage;
+
+	private String   iBacking;
+
+	private String   iDimension;
+
+	private Integer  olQty;
+
+	/* for random selection */
+	private double   iRandom;
+	
+	private String iTitleSoundex;
+
+	public Integer getOlQty()
+	{
+		return olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	
+    public String getiTitleSoundex()
+    {
+    	return iTitleSoundex;
+    }
+
+	
+    public void setiTitleSoundex(String iTitleSoundex)
+    {
+    	this.iTitleSoundex = iTitleSoundex;
+    }
+
+	@Override
+	public Integer getIId()
+	{
+		return this.iId;
+	}
+
+	@Override
+	public void setIId(Integer IId)
+	{
+		this.iId = IId;
+	}
+
+	@Override
+	public IAuthor getAuthor()
+	{
+		return DatabaseHelper.getDatabase().getAuthorDaoImpl().findById( this.authId );
+	}
+
+	@Override
+	public void setAuthor(IAuthor author)
+	{
+		this.setAuthId( author.getAId() );
+	}
+
+	@Override
+	public String getITitle()
+	{
+		return this.iTitle;
+	}
+
+	@Override
+	public void setITitle(String ITitle)
+	{
+		this.iTitle = ITitle;
+	}
+
+	@Override
+	public Date getIPubDate()
+	{
+		return this.iPubDate;
+	}
+
+	@Override
+	public void setIPubDate(Date IPubDate)
+	{
+		this.iPubDate = IPubDate;
+	}
+
+	@Override
+	public String getIPublisher()
+	{
+		return this.iPublisher;
+	}
+
+	@Override
+	public void setIPublisher(String IPublisher)
+	{
+		this.iPublisher = IPublisher;
+	}
+
+	@Override
+	public String getISubject()
+	{
+		return this.iSubject;
+	}
+
+	@Override
+	public void setISubject(String ISubject)
+	{
+		this.iSubject = ISubject;
+	}
+
+	@Override
+	public String getIDesc()
+	{
+		return this.iDesc;
+	}
+
+	@Override
+	public void setIDesc(String IDesc)
+	{
+		this.iDesc = IDesc;
+	}
+
+	@Override
+	public Integer getIRelated1()
+	{
+		return this.iRelated1;
+	}
+
+	@Override
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.iRelated1 = IRelated1;
+	}
+
+	@Override
+	public Integer getIRelated2()
+	{
+		return this.iRelated2;
+	}
+
+	@Override
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.iRelated2 = IRelated2;
+	}
+
+	@Override
+	public Integer getIRelated3()
+	{
+		return this.iRelated3;
+	}
+
+	@Override
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.iRelated3 = IRelated3;
+	}
+
+	@Override
+	public Integer getIRelated4()
+	{
+		return this.iRelated4;
+	}
+
+	@Override
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.iRelated4 = IRelated4;
+	}
+
+	@Override
+	public Integer getIRelated5()
+	{
+		return this.iRelated5;
+	}
+
+	@Override
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.iRelated5 = IRelated5;
+	}
+
+	@Override
+	public String getIThumbnail()
+	{
+		return this.iThumbnail;
+	}
+
+	@Override
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.iThumbnail = IThumbnail;
+	}
+
+	@Override
+	public String getIImage()
+	{
+		return this.iImage;
+	}
+
+	@Override
+	public void setIImage(String IImage)
+	{
+		this.iImage = IImage;
+	}
+
+	@Override
+	public Double getISrp()
+	{
+		return this.iSrp;
+	}
+
+	@Override
+	public void setISrp(Double i_SRP)
+	{
+		this.iSrp = i_SRP;
+	}
+
+	@Override
+	public Double getICost()
+	{
+		return this.iCost;
+	}
+
+	@Override
+	public void setICost(Double i_COST)
+	{
+		this.iCost = i_COST;
+	}
+
+	@Override
+	public Date getIAvail()
+	{
+		return this.iAvail;
+	}
+
+	@Override
+	public void setIAvail(Date IAvail)
+	{
+		this.iAvail = IAvail;
+	}
+
+	@Override
+	public Integer getIStock()
+	{
+		return this.iStock;
+	}
+
+	@Override
+	public void setIStock(Integer IStock)
+	{
+		this.iStock = IStock;
+	}
+
+	@Override
+	public String getIIsbn()
+	{
+		return this.iIsbn;
+	}
+
+	@Override
+	public void setIIsbn(String IIsbn)
+	{
+		this.iIsbn = IIsbn;
+	}
+
+	@Override
+	public String getIPage()
+	{
+		return this.iPage;
+	}
+
+	@Override
+	public void setIPage(String IPage)
+	{
+		this.iPage = IPage;
+	}
+
+	@Override
+	public String getIBacking()
+	{
+		return this.iBacking;
+	}
+
+	@Override
+	public void setIBacking(String IBacking)
+	{
+		this.iBacking = IBacking;
+	}
+
+	@Override
+	public String getIDimension()
+	{
+		return this.iDimension;
+	}
+
+	@Override
+	public void setIDimension(String IDimension)
+	{
+		this.iDimension = IDimension;
+	}
+
+	@Override
+	public double getIRandom()
+	{
+		return iRandom;
+	}
+
+	@Override
+	public void setIRandom(double iRandom)
+	{
+		this.iRandom = iRandom;
+	}
+
+	public Integer getAuthId()
+	{
+		return authId;
+	}
+
+	public void setAuthId(Integer authId)
+	{
+		this.authId = authId;
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
new file mode 100644
index 0000000..7714eac
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
@@ -0,0 +1,131 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orderLine")
+public class OrderLine implements IOrderLine, Serializable
+{
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = -6695288937139715783L;
+
+	@Id
+	private ObjectId id;
+	
+	private Integer    olId;
+
+	private Integer orderId;
+
+	private Integer itemId;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+	
+
+	public OrderLine()
+	{
+		
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOlId()
+	{
+		return this.olId;
+	}
+
+	@Override
+	public void setOlId(Integer olId)
+	{
+		this.olId = olId;
+	}
+	
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().getOrdersDaoImpl().findById( orderId );
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orderId = orders.getOId();
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		return DatabaseHelper.getDatabase().getItemDaoImpl().findById( this.itemId );
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.itemId = item.getIId();
+	}
+
+	@Override
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	@Override
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Override
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	@Override
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Override
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	@Override
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
new file mode 100644
index 0000000..0ecd8ed
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
@@ -0,0 +1,213 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orders")
+public class Orders implements IOrders, Serializable
+{
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = -4867580403414098274L;
+
+	@Id
+	private ObjectId id;
+	
+	private Integer        oId;
+
+	private Integer addressByOShipAddrId;
+	
+	private Integer       customer;
+
+	private Integer addressByOBillAddrId;
+
+	private Date           ODate;
+
+	private Double        OSubTotal;
+
+	private Double        OTax;
+
+	private Double 		OTotal;
+
+	private String         OShipType;
+
+	private Date           OShipDate;
+
+	private String         OStatus;
+	
+	public Orders()
+	{
+
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOId()
+	{
+		return this.oId;
+	}
+	
+	@Override
+	public void setOId(Integer OId)
+	{
+		this.oId = OId;
+	}
+
+	@Override
+	public IAddress getAddressByOShipAddrId()
+	{
+		return DatabaseHelper.getDatabase().getAddressDaoImpl().findById( this.addressByOShipAddrId );
+	}
+	
+	@Override
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId.getAddrId();
+	}
+
+	@Override
+	public ICustomer getCustomer()
+	{
+		return DatabaseHelper.getDatabase().getCustomerDaoImpl().findById( this.customer );
+	}
+
+	@Override
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer.getCId();
+	}
+
+	@Override
+	public IAddress getAddressByOBillAddrId()
+	{
+		return DatabaseHelper.getDatabase().getAddressDaoImpl().findById( this.addressByOBillAddrId );
+	}
+
+	@Override
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId.getAddrId();
+	}
+
+	@Override
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	@Override
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+	
+	@Override
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	@Override
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Override
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+	
+	@Override
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Override
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	@Override
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Override
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	@Override
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Override
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	@Override
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+	
+	@Override
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	@Override
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@Override
+    public Set<IOrderLine> getOrderLines()
+    {
+		List ordersList = DatabaseHelper.getDatabase().getOrderLineDaoImpl().findAllByOrder( this );
+	    return new HashSet<IOrderLine>();
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
new file mode 100644
index 0000000..d86ceee
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
@@ -0,0 +1,94 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "shoppingCart" )
+public class ShoppingCart implements IShoppingCart, Serializable
+{
+
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = -235081098185134853L;
+
+	@Id
+	private ObjectId               id;
+
+	private Integer                scId;
+
+	private Date                   scTime;
+	
+	
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@Override
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+		List  res = DatabaseHelper.getDatabase().getShoppingCartDaoImpl().findAllBySC( this );
+		if( res.isEmpty() )
+			return null;
+		
+		return new HashSet<IShoppingCartLine>(res);
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
new file mode 100644
index 0000000..dc20938
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
@@ -0,0 +1,103 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "shoppingCartLine" )
+public class ShoppingCartLine implements IShoppingCartLine, Serializable
+{
+	@Autowired
+	@Qualifier("service")
+	private IService service;
+	
+    private static final long serialVersionUID = 767045854888711002L;
+
+	@Id
+	private ObjectId id;
+	
+	private Integer sclId;
+
+	private Integer item;
+
+	private Integer sclQty;
+	
+	private Integer shoppingCart;
+	
+	public ShoppingCartLine()
+	{
+	}
+
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public IShoppingCart getShoppingCart()
+    {
+    	return DatabaseHelper.getDatabase().getShoppingCartDaoImpl().findById( shoppingCart );
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart.getScId();
+    }
+
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId(Integer sclScId)
+	{
+		this.sclId = sclScId;
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		IItem item = DatabaseHelper.getDatabase().getItemDaoImpl().findById( this.item );
+		return item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item.getIId();
+	}
+
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
new file mode 100644
index 0000000..6a93070
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
@@ -0,0 +1,147 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.AService;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IItem;
+
+@SuppressWarnings( "unchecked" )
+@Service
+@Transactional(readOnly=true)
+public class HibernateService extends AService
+{
+	@Autowired
+	private IAddressDao addressDao;
+	
+	@Autowired
+	private IAuthorDao authorDao;
+	
+	@Autowired
+	private ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	private ICountryDao countryDao;
+	
+	@Autowired
+	private ICustomerDao customerDao;
+	
+	@Autowired
+	private IItemDao itemDao;
+	
+	@Autowired
+	private IOrderLineDao orderLineDao;
+	
+	@Autowired
+	private IOrdersDao ordersDao;
+	
+	@Autowired
+	private IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	private IShoppingCartLineDao shoppingCartLineDao;
+	
+	@Override
+	public IAddressDao getAddressDaoImpl()
+	{
+		return addressDao;
+	}
+
+	@Override
+	public IAuthorDao getAuthorDaoImpl()
+	{
+		return authorDao;
+	}
+
+	@Override
+	public ICcXactsDao getCcXactsDaoImpl()
+	{
+		return ccXactsDao;
+	}
+
+	@Override
+	public ICountryDao getCountryDaoImpl()
+	{
+		return countryDao;
+	}
+
+	@Override
+	public ICustomerDao getCustomerDaoImpl()
+	{
+		return customerDao;
+	}
+
+	@Override
+	public IItemDao getItemDaoImpl()
+	{
+		return itemDao;
+	}
+
+	@Override
+	public IOrderLineDao getOrderLineDaoImpl()
+	{
+		return orderLineDao;
+	}
+
+	@Override
+	public IOrdersDao getOrdersDaoImpl()
+	{
+		return ordersDao;
+	}
+
+	@Override
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl()
+	{
+		return shoppingCartLineDao;
+	}
+
+	@Override
+	public IShoppingCartDao getShoppingCartDaoImpl()
+	{
+		return shoppingCartDao;
+	}
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchByTitle(String keyword)
+    {
+		IItemDao itemDao = getItemDaoImpl();
+		List<IItem> items = itemDao.findAllByTitle(keyword);
+		
+		return items;
+    }
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchBySubject(String keyword)
+    {
+		IItemDao itemDao = getItemDaoImpl();
+		List<IItem> items = itemDao.findAllBySubject(keyword);
+		
+		return items;
+    }
+	
+	@Override
+	@Cacheable( "bestSellers" )
+	public List<Object[]> getBestSellers(String category)
+	{
+		IItemDao itemDao = getItemDaoImpl();
+		
+		List<Object[]> res = itemDao.getBestSellers( category );
+		return res;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
new file mode 100644
index 0000000..d8f34ed
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
@@ -0,0 +1,209 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import eu.cloudscale.showcase.db.AService;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+
+@Service
+public class MongoService extends AService
+{
+	@Autowired
+	private IAddressDao addressDao;
+	
+	@Autowired
+	private IAuthorDao authorDao;
+	
+	@Autowired
+	private ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	private ICountryDao countryDao;
+	
+	@Autowired
+	private ICustomerDao customerDao;
+	
+	@Autowired
+	private IItemDao itemDao;
+	
+	@Autowired
+	private IOrderLineDao orderLineDao;
+	
+	@Autowired
+	private IOrdersDao ordersDao;
+	
+	@Autowired
+	private IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	private IShoppingCartLineDao shoppingCartLineDao;
+	
+	@Override
+	public IAddressDao getAddressDaoImpl()
+	{
+		return addressDao;
+	}
+
+	@Override
+	public IAuthorDao getAuthorDaoImpl()
+	{
+		return authorDao;
+	}
+
+	@Override
+	public ICcXactsDao getCcXactsDaoImpl()
+	{
+		return ccXactsDao;
+	}
+
+	@Override
+	public ICountryDao getCountryDaoImpl()
+	{
+		return countryDao;
+	}
+
+	@Override
+	public ICustomerDao getCustomerDaoImpl()
+	{
+		return customerDao;
+	}
+
+	@Override
+	public IItemDao getItemDaoImpl()
+	{
+		return itemDao;
+	}
+
+	@Override
+	public IOrderLineDao getOrderLineDaoImpl()
+	{
+		return orderLineDao;
+	}
+
+	@Override
+	public IOrdersDao getOrdersDaoImpl()
+	{
+		return ordersDao;
+	}
+
+	@Override
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl()
+	{
+		return shoppingCartLineDao;
+	}
+
+	@Override
+	public IShoppingCartDao getShoppingCartDaoImpl()
+	{
+		return shoppingCartDao;
+	}
+	
+	@Override
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+		IItemDao itemDao = getItemDaoImpl();
+		IOrdersDao ordersDao = getOrdersDaoImpl();
+		IOrderLineDao orderLineDao = getOrderLineDaoImpl();
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		IOrders order = ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		ordersDao.shrani( order );
+		
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			order.getOrderLines().add( ol );
+    			orderLineDao.shrani( ol );
+    			
+    			Item item = (Item) itemDao.findById( scl.getItem().getIId() );
+    			Integer olQty = item.getOlQty();
+    			item.setOlQty( (olQty == null ? 0 : olQty ) + 1 );
+    			itemDao.shrani( item );
+    
+    			// TODO: Update item IStock property
+    		}
+		}
+
+		ordersDao.shrani( order );
+
+		return order;
+	}
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchByTitle(String keyword)
+    {
+	    IItemDao itemDao = getItemDaoImpl();
+	    List<IItem> items = itemDao.findAllByTitle( keyword );
+	    
+	    return items;
+    }
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchBySubject(String keyword)
+    {
+	    IItemDao itemDao = getItemDaoImpl();
+	    List<IItem> items = itemDao.findAllBySubject( keyword );
+	    
+	    return items;
+    }
+	
+	@Override
+	@Cacheable("bestSellers")
+	public List<Object[]> getBestSellers(String category)
+	{
+		IItemDao itemDao = getItemDaoImpl();
+	    return itemDao.getBestSellers( category );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
new file mode 100644
index 0000000..4802499
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
@@ -0,0 +1,607 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Random;
+
+import org.springframework.context.support.GenericXmlApplicationContext;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+
+public abstract class AGenerate implements IGenerate
+{
+
+	// TODO: Move this to properties file
+	protected static final int    NUM_EBS       = 100;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ITEMS     = 10000;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_CUSTOMERS = NUM_EBS * 2880;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ADDRESSES = 2 * NUM_CUSTOMERS;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_AUTHORS   = (int) ( .25 * NUM_ITEMS );
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ORDERS    = (int) ( .9 * NUM_CUSTOMERS );
+
+	// TODO: Move this to properties file
+	protected static String[][]   tables        = {
+	        {"address", "addr_co_id", "addr_zip" }, {"author", "a_lname" },
+	        {"cc_xacts" }, {"country", "co_name" },
+	        {"customer", "c_addr_id", "c_uname" },
+	        {"item", "i_title", "i_subject", "i_a_id" },
+	        {"order_line", "ol_i_id", "ol_o_id" }, {"orders", "o_c_id" },
+	        {"shopping_cart" }, {"shopping_cart_line", "scl_i_id" } };
+
+	protected Random       rand          = new Random();
+	
+	protected GenericXmlApplicationContext ctx = null;
+	
+	protected IService db = null;
+	
+	public AGenerate()
+	{
+		ctx = ContextHelper.getApplicationContext();
+		db = DatabaseHelper.getDatabase();
+	}
+	
+	
+	protected String getRandomAString(int min, int max)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  String getRandomAString(int length)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		for ( i = 0; i < length; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  int getRandomNString(int num_digits)
+	{
+		int return_num = 0;
+		for ( int i = 0; i < num_digits; i++ )
+		{
+			return_num += getRandomInt( 0, 9 )
+			        * (int) java.lang.Math.pow( 10.0, (double) i );
+		}
+		return return_num;
+	}
+
+	protected  int getRandomNString(int min, int max)
+	{
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) ) + min;
+		return getRandomNString( strlen );
+	}
+
+	protected  int getRandomInt(int lower, int upper)
+	{
+
+		int num = (int) Math.floor( rand.nextDouble()
+		        * ( ( upper + 1 ) - lower ) );
+		if ( num + lower > upper || num + lower < lower )
+		{
+			System.out.println( "ERROR: Random returned value of of range!" );
+			System.exit( 1 );
+		}
+		return num + lower;
+	}
+
+	protected  String DigSyl(int D, int N)
+	{
+		int i;
+		String resultString = new String();
+		String Dstr = Integer.toString( D );
+
+		if ( N > Dstr.length() )
+		{
+			int padding = N - Dstr.length();
+			for ( i = 0; i < padding; i++ )
+				resultString = resultString.concat( "BA" );
+		}
+
+		for ( i = 0; i < Dstr.length(); i++ )
+		{
+			if ( Dstr.charAt( i ) == '0' )
+				resultString = resultString.concat( "BA" );
+			else if ( Dstr.charAt( i ) == '1' )
+				resultString = resultString.concat( "OG" );
+			else if ( Dstr.charAt( i ) == '2' )
+				resultString = resultString.concat( "AL" );
+			else if ( Dstr.charAt( i ) == '3' )
+				resultString = resultString.concat( "RI" );
+			else if ( Dstr.charAt( i ) == '4' )
+				resultString = resultString.concat( "RE" );
+			else if ( Dstr.charAt( i ) == '5' )
+				resultString = resultString.concat( "SE" );
+			else if ( Dstr.charAt( i ) == '6' )
+				resultString = resultString.concat( "AT" );
+			else if ( Dstr.charAt( i ) == '7' )
+				resultString = resultString.concat( "UL" );
+			else if ( Dstr.charAt( i ) == '8' )
+				resultString = resultString.concat( "IN" );
+			else if ( Dstr.charAt( i ) == '9' )
+				resultString = resultString.concat( "NG" );
+		}
+
+		return resultString;
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+    public void populateCountryTable()
+	{
+		String[] countries = {"United States", "United Kingdom", "Canada",
+		        "Germany", "France", "Japan", "Netherlands", "Italy",
+		        "Switzerland", "Australia", "Algeria", "Argentina", "Armenia",
+		        "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangla Desh",
+		        "Barbados", "Belarus", "Belgium", "Bermuda", "Bolivia",
+		        "Botswana", "Brazil", "Bulgaria", "Cayman Islands", "Chad",
+		        "Chile", "China", "Christmas Island", "Colombia", "Croatia",
+		        "Cuba", "Cyprus", "Czech Republic", "Denmark",
+		        "Dominican Republic", "Eastern Caribbean", "Ecuador", "Egypt",
+		        "El Salvador", "Estonia", "Ethiopia", "Falkland Island",
+		        "Faroe Island", "Fiji", "Finland", "Gabon", "Gibraltar",
+		        "Greece", "Guam", "Hong Kong", "Hungary", "Iceland", "India",
+		        "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Jamaica",
+		        "Jordan", "Kazakhstan", "Kuwait", "Lebanon", "Luxembourg",
+		        "Malaysia", "Mexico", "Mauritius", "New Zealand", "Norway",
+		        "Pakistan", "Philippines", "Poland", "Portugal", "Romania",
+		        "Russia", "Saudi Arabia", "Singapore", "Slovakia",
+		        "South Africa", "South Korea", "Spain", "Sudan", "Sweden",
+		        "Taiwan", "Thailand", "Trinidad", "Turkey", "Venezuela",
+		        "Zambia" };
+
+		double[] exchanges = {1, .625461, 1.46712, 1.86125, 6.24238, 121.907,
+		        2.09715, 1842.64, 1.51645, 1.54208, 65.3851, 0.998, 540.92,
+		        13.0949, 3977, 1, .3757, 48.65, 2, 248000, 38.3892, 1, 5.74,
+		        4.7304, 1.71, 1846, .8282, 627.1999, 494.2, 8.278, 1.5391,
+		        1677, 7.3044, 23, .543, 36.0127, 7.0707, 15.8, 2.7, 9600,
+		        3.33771, 8.7, 14.9912, 7.7, .6255, 7.124, 1.9724, 5.65822,
+		        627.1999, .6255, 309.214, 1, 7.75473, 237.23, 74.147, 42.75,
+		        8100, 3000, .3083, .749481, 4.12, 37.4, 0.708, 150, .3062,
+		        1502, 38.3892, 3.8, 9.6287, 25.245, 1.87539, 7.83101, 52,
+		        37.8501, 3.9525, 190.788, 15180.2, 24.43, 3.7501, 1.72929,
+		        43.9642, 6.25845, 1190.15, 158.34, 5.282, 8.54477, 32.77,
+		        37.1414, 6.1764, 401500, 596, 2447.7 };
+
+		String[] currencies = {"Dollars", "Pounds", "Dollars",
+		        "Deutsche Marks", "Francs", "Yen", "Guilders", "Lira",
+		        "Francs", "Dollars", "Dinars", "Pesos", "Dram", "Schillings",
+		        "Manat", "Dollars", "Dinar", "Taka", "Dollars", "Rouble",
+		        "Francs", "Dollars", "Boliviano", "Pula", "Real", "Lev",
+		        "Dollars", "Franc", "Pesos", "Yuan Renmimbi", "Dollars",
+		        "Pesos", "Kuna", "Pesos", "Pounds", "Koruna", "Kroner",
+		        "Pesos", "Dollars", "Sucre", "Pounds", "Colon", "Kroon",
+		        "Birr", "Pound", "Krone", "Dollars", "Markka", "Franc",
+		        "Pound", "Drachmas", "Dollars", "Dollars", "Forint", "Krona",
+		        "Rupees", "Rupiah", "Rial", "Dinar", "Punt", "Shekels",
+		        "Dollars", "Dinar", "Tenge", "Dinar", "Pounds", "Francs",
+		        "Ringgit", "Pesos", "Rupees", "Dollars", "Kroner", "Rupees",
+		        "Pesos", "Zloty", "Escudo", "Leu", "Rubles", "Riyal",
+		        "Dollars", "Koruna", "Rand", "Won", "Pesetas", "Dinar",
+		        "Krona", "Dollars", "Baht", "Dollars", "Lira", "Bolivar",
+		        "Kwacha" };
+
+		int NUM_COUNTRIES = 92;
+
+		System.out.println( "Populating COUNTRY with " + NUM_COUNTRIES
+		        + " countries" );
+		
+		ICountryDao countryDao = db.getCountryDaoImpl();
+		countryDao.createTable();
+		
+		for ( int i = 1; i <= NUM_COUNTRIES; i++ )
+		{
+			ICountry c = countryDao.getObject();
+			
+			if( db instanceof MongoService)
+			{
+				c.setCoId( i );
+			}
+			c.setCoName( countries[i - 1] );
+			c.setCoExchange( exchanges[i - 1] );
+			c.setCoCurrency( currencies[i - 1] );
+
+			countryDao.shrani( c );
+		}
+
+		countryDao.finish();
+
+		//System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateAuthorTable()
+    {
+		String A_FNAME, A_MNAME, A_LNAME, A_BIO;
+		java.sql.Date A_DOB;
+		GregorianCalendar cal;
+
+		System.out.println( "Populating AUTHOR Table with " + NUM_AUTHORS
+		        + " authors" );
+		
+		IAuthorDao authorDao = db.getAuthorDaoImpl();
+		
+		for ( int i = 1; i <= NUM_AUTHORS; i++ )
+		{
+			IAuthor a = authorDao.getObject();
+
+			int month, day, year, maxday;
+			A_FNAME = getRandomAString( 3, 20 );
+			A_MNAME = getRandomAString( 1, 20 );
+			A_LNAME = getRandomAString( 1, 20 );
+			year = getRandomInt( 1800, 1990 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			A_DOB = new java.sql.Date( cal.getTime().getTime() );
+			A_BIO = getRandomAString( 125, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAId( i );
+			}
+			a.setAFname( A_FNAME );
+			a.setALname( A_LNAME );
+			a.setAMname( A_MNAME );
+			a.setADob( A_DOB );
+			a.setABio( A_BIO );
+
+			authorDao.shrani( a );
+		}
+
+		authorDao.finish();
+
+		System.out.println( "" );    
+    }
+
+
+	@Override
+    public void populateAddressTable()
+    {
+		System.out.println( "Populating ADDRESS Table with " + NUM_ADDRESSES
+		        + " addresses" );
+		System.out.print( "Complete (in 10,000's): " );
+		String ADDR_STREET1, ADDR_STREET2, ADDR_CITY, ADDR_STATE;
+		String ADDR_ZIP;
+		int ADDR_CO_ID;
+		
+		IAddressDao addressDao = db.getAddressDaoImpl();
+		ICountryDao countryDao = db.getCountryDaoImpl();
+
+		for ( int i = 1; i <= NUM_ADDRESSES; i++ )
+		{
+			IAddress a = addressDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			ADDR_STREET1 = getRandomAString( 15, 40 );
+			ADDR_STREET2 = getRandomAString( 15, 40 );
+			ADDR_CITY = getRandomAString( 4, 30 );
+			ADDR_STATE = getRandomAString( 2, 20 );
+			ADDR_ZIP = getRandomAString( 5, 10 );
+			ADDR_CO_ID = getRandomInt( 1, 92 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAddrId( i );
+			}
+			a.setAddrStreet1( ADDR_STREET1 );
+			a.setAddrStreet2( ADDR_STREET2 );
+			a.setAddrCity( ADDR_CITY );
+			a.setAddrState( ADDR_STATE );
+			a.setAddrZip( ADDR_ZIP );
+			a.setCountry( countryDao.findById( ADDR_CO_ID ) );
+
+			addressDao.shrani( a );
+		}
+
+		addressDao.finish();
+
+		System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateCustomerTable()
+    {
+		String C_UNAME, C_PASSWD, C_LNAME, C_FNAME;
+		int C_ADDR_ID, C_PHONE;
+		String C_EMAIL;
+		java.sql.Date C_SINCE, C_LAST_LOGIN;
+		java.sql.Timestamp C_LOGIN, C_EXPIRATION;
+		double C_DISCOUNT, C_BALANCE, C_YTD_PMT;
+		java.sql.Date C_BIRTHDATE;
+		String C_DATA;
+		int i;
+
+		System.out.println( "Populating CUSTOMER Table with " + NUM_CUSTOMERS
+		        + " customers" );
+		System.out.print( "Complete (in 10,000's): " );
+		
+		ICustomerDao customerDao = db.getCustomerDaoImpl();
+		IAddressDao addressDao = db.getAddressDaoImpl();
+
+		for ( i = 1; i <= NUM_CUSTOMERS; i++ )
+		{
+			ICustomer c = customerDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+			
+			C_UNAME = DigSyl( i, 0 ).toLowerCase();
+			C_PASSWD = C_UNAME.toLowerCase();
+			C_LNAME = getRandomAString( 8, 15 );
+			C_FNAME = getRandomAString( 8, 15 );
+			C_ADDR_ID = getRandomInt( 1, NUM_ADDRESSES );
+			C_PHONE = getRandomNString( 9, 16 );
+			C_EMAIL = C_UNAME + "@" + getRandomAString( 2, 9 ) + ".com";
+
+			GregorianCalendar cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 730 ) );
+			C_SINCE = new java.sql.Date( cal.getTime().getTime() );
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 60 ) );
+			if ( cal.after( new GregorianCalendar() ) )
+				cal = new GregorianCalendar();
+
+			C_LAST_LOGIN = new java.sql.Date( cal.getTime().getTime() );
+			C_LOGIN = new java.sql.Timestamp( System.currentTimeMillis() );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.HOUR, 2 );
+			C_EXPIRATION = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			C_DISCOUNT = (double) getRandomInt( 0, 50 ) / 100.0;
+			C_BALANCE = 0.00;
+			C_YTD_PMT = (double) getRandomInt( 0, 99999 ) / 100.0;
+			int year = getRandomInt( 1880, 2000 );
+			int month = getRandomInt( 0, 11 );
+			int maxday = 31;
+			int day;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			C_BIRTHDATE = new java.sql.Date( cal.getTime().getTime() );
+
+			C_DATA = getRandomAString( 100, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+    		if( db instanceof MongoService)
+    		{
+    			c.setCId( i );
+    		}
+			c.setCUname( C_UNAME );
+			c.setCPasswd( C_PASSWD );
+			c.setCFname( C_FNAME );
+			c.setCLname( C_LNAME );
+			IAddress addr = addressDao.findById( C_ADDR_ID );
+			c.setAddress( addr );
+			c.setCPhone( String.valueOf( C_PHONE ) );
+			c.setCEmail( C_EMAIL );
+			c.setCSince( C_SINCE );
+			c.setCLastVisit( C_LAST_LOGIN );
+			c.setCLogin( C_LOGIN );
+			c.setCExpiration( C_EXPIRATION );
+			c.setCDiscount( C_DISCOUNT );
+			c.setCBalance( C_BALANCE );
+			c.setCYtdPmt( C_YTD_PMT );
+			c.setCBirthdate( C_BIRTHDATE );
+			c.setCData( C_DATA );
+
+			customerDao.shrani( c );
+		}
+
+		customerDao.finish();
+
+		//System.out.print( "\n" );
+    }
+
+
+	@Override
+    public void populateItemTable()
+    {
+		String I_TITLE;
+		GregorianCalendar cal;
+		int I_A_ID;
+		java.sql.Date I_PUB_DATE;
+		String I_PUBLISHER, I_SUBJECT, I_DESC;
+		int I_RELATED1, I_RELATED2, I_RELATED3, I_RELATED4, I_RELATED5;
+		String I_THUMBNAIL, I_IMAGE;
+		double I_SRP, I_COST, I_RANDOM;
+		java.sql.Date I_AVAIL;
+		int I_STOCK;
+		String I_ISBN;
+		int I_PAGE;
+		String I_BACKING;
+		String I_DIMENSIONS;
+
+		String[] SUBJECTS = {"ARTS", "BIOGRAPHIES", "BUSINESS", "CHILDREN",
+		        "COMPUTERS", "COOKING", "HEALTH", "HISTORY", "HOME", "HUMOR",
+		        "LITERATURE", "MYSTERY", "NON-FICTION", "PARENTING",
+		        "POLITICS", "REFERENCE", "RELIGION", "ROMANCE", "SELF-HELP",
+		        "SCIENCE-NATURE", "SCIENCE-FICTION", "SPORTS", "YOUTH",
+		        "TRAVEL" };
+		int NUM_SUBJECTS = 24;
+
+		String[] BACKINGS = {"HARDBACK", "PAPERBACK", "USED", "AUDIO",
+		        "LIMITED-EDITION" };
+		int NUM_BACKINGS = 5;
+
+		System.out.println( "Populating ITEM table with " + NUM_ITEMS
+		        + " items" );
+		
+		IItemDao itemDao = db.getItemDaoImpl();
+		IAuthorDao authorDao = db.getAuthorDaoImpl();
+		
+		Random rand = new Random();
+		
+		for ( int i = 1; i <= NUM_ITEMS; i++ )
+		{
+			I_RANDOM = rand.nextDouble();
+			int month, day, year, maxday;
+			I_TITLE = getRandomAString( 14, 60 );
+			if ( i <= ( NUM_ITEMS / 4 ) )
+				I_A_ID = i;
+			else
+				I_A_ID = getRandomInt( 1, NUM_ITEMS / 4 );
+
+			year = getRandomInt( 1930, 2000 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			I_PUB_DATE = new java.sql.Date( cal.getTime().getTime() );
+
+			I_PUBLISHER = getRandomAString( 14, 60 );
+			I_SUBJECT = SUBJECTS[getRandomInt( 0, NUM_SUBJECTS - 1 )];
+			I_DESC = getRandomAString( 100, 500 );
+
+			I_RELATED1 = getRandomInt( 1, NUM_ITEMS );
+			do
+			{
+				I_RELATED2 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED2 == I_RELATED1 );
+			do
+			{
+				I_RELATED3 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED3 == I_RELATED1 || I_RELATED3 == I_RELATED2 );
+			do
+			{
+				I_RELATED4 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED4 == I_RELATED1 || I_RELATED4 == I_RELATED2
+			        || I_RELATED4 == I_RELATED3 );
+			do
+			{
+				I_RELATED5 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED5 == I_RELATED1 || I_RELATED5 == I_RELATED2
+			        || I_RELATED5 == I_RELATED3 || I_RELATED5 == I_RELATED4 );
+
+			I_THUMBNAIL = new String( "img" + i % 100 + "/thumb_" + i + ".gif" );
+			I_IMAGE = new String( "img" + i % 100 + "/image_" + i + ".gif" );
+			I_SRP = (double) getRandomInt( 100, 99999 );
+			I_SRP /= 100.0;
+
+			I_COST = I_SRP
+			        - ( ( ( (double) getRandomInt( 0, 50 ) / 100.0 ) ) * I_SRP );
+
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 1, 30 ) );
+			I_AVAIL = new java.sql.Date( cal.getTime().getTime() );
+			I_STOCK = getRandomInt( 10, 30 );
+			I_ISBN = getRandomAString( 13 );
+			I_PAGE = getRandomInt( 20, 9999 );
+			I_BACKING = BACKINGS[getRandomInt( 0, NUM_BACKINGS - 1 )];
+			I_DIMENSIONS = ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 );
+
+			IItem item = itemDao.getObject();
+			// Set parameter
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				item.setIId( i );
+			}
+			item.setIRandom( I_RANDOM );
+			item.setITitle( I_TITLE );
+			item.setIPubDate( I_PUB_DATE );
+			item.setIPublisher( I_PUBLISHER );
+			item.setISubject( I_SUBJECT );
+			item.setIDesc( I_DESC );
+			item.setIRelated1( I_RELATED1 );
+			item.setIRelated2( I_RELATED2 );
+			item.setIRelated3( I_RELATED3 );
+			item.setIRelated4( I_RELATED4 );
+			item.setIRelated5( I_RELATED5 );
+			item.setIThumbnail( I_THUMBNAIL );
+			item.setIImage( I_IMAGE );
+			item.setISrp( I_SRP );
+			item.setICost( I_COST );
+			item.setIAvail( I_AVAIL );
+			item.setIStock( I_STOCK );
+			item.setIIsbn( I_ISBN );
+			item.setIPage( String.valueOf( I_PAGE ) );
+			item.setIBacking( I_BACKING );
+			item.setIDimension( I_DIMENSIONS );
+			item.setAuthor( authorDao.findById( I_A_ID ) );
+
+			itemDao.shrani( item );
+			
+			itemDao.findById( item.getIId() );
+		}
+
+		itemDao.finish();
+		//System.out.println( "" );
+    }
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/Generate.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/Generate.java
new file mode 100644
index 0000000..5b173d0
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/Generate.java
@@ -0,0 +1,71 @@
+package eu.cloudscale.showcase.generate;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+public class Generate
+{
+
+	private IGenerate db;
+
+	public Generate(String dbType)
+	{
+
+//		Resource resource = new ClassPathResource( "database.properties" );
+//		Properties prop = null;
+//		try
+//		{
+//			prop = PropertiesLoaderUtils.loadProperties( resource );
+//		}
+//		catch ( IOException e )
+//		{
+//			e.printStackTrace();
+//		}
+//
+//		String dbType = prop.getProperty( "jdbc.dbtype" );
+
+		if ( dbType.equalsIgnoreCase( "mongo" )
+		        || dbType.equalsIgnoreCase( "mongodb" ) )
+		{
+			db = new GenerateMongo();
+		}
+		else
+		{
+			DatabaseHelper.loadMySQLDriver();
+			db = new GenerateHibernate();
+		}
+
+	}
+
+	public void generate()
+	{
+
+		//db.dropTables( tables );
+		db.populateCountryTable();
+		db.populateAuthorTable();
+		db.populateAddressTable();
+		db.populateCustomerTable();
+		db.populateItemTable();
+		db.populateOrdersAndCC_XACTSTable();
+		// db.createIndexes(tables);
+
+		System.out.println( "FINISHED!" );
+	}
+
+	public static void main(String[] args)
+	{
+		if( args.length < 1 )
+		{
+			System.out.println("Usage: $ java Generate <mysql|mongodb>");
+			System.exit(0);			
+		}
+		Generate generate = new Generate(args[0]);
+		generate.generate();
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
new file mode 100644
index 0000000..82b1110
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
@@ -0,0 +1,169 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.hibernate.impl.AuthorDaoImpl;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+
+public class GenerateHibernate extends AGenerate
+{
+	
+	public GenerateHibernate()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		int CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+
+		ICustomerDao customerDao = super.db.getCustomerDaoImpl();
+		IAddressDao addressDao = super.db.getAddressDaoImpl();
+		IItemDao itemDao = super.db.getItemDaoImpl();
+		ICountryDao countryDao = super.db.getCountryDaoImpl();
+		IOrdersDao ordersDao = super.db.getOrdersDaoImpl();
+		IOrderLineDao orderLineDao = super.db.getOrderLineDaoImpl();
+		ICcXactsDao ccXactsDao = super.db.getCcXactsDaoImpl();
+		IAuthorDao authorDao = super.db.getAuthorDaoImpl();
+
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			Orders order = new Orders();
+
+			// Set parameter
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+			order.setCcXactses( new HashSet<ICcXacts>() );
+			order.setOrderLines( new HashSet<IOrderLine>() );
+			ordersDao.shrani( order );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				
+				OrderLine orderLine = new OrderLine();
+				orderLine.setItem( itemDao.findById( OL_I_ID ) );
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+
+				orderLineDao.shrani( orderLine );
+				order.getOrderLines().add( orderLine );
+
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomInt( 1, NUM_AUTHORS );
+			CX_CO_ID = getRandomInt( 1, 92 );
+
+			CcXacts ccXacts = new CcXacts();
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setOrders( order );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( authorDao.findById( CX_AUTH_ID ));
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+
+			ccXacts.setOrders( order );
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+
+			order.getCcXactses().add( ccXacts );
+
+			ccXactsDao.shrani( ccXacts );
+
+		}
+
+		System.out.println( "" );
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
new file mode 100644
index 0000000..e882b38
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
@@ -0,0 +1,175 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.omg.CosNaming._BindingIteratorImplBase;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+
+public class GenerateMongo extends AGenerate
+{
+	
+	public GenerateMongo()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		Integer CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+		
+		ICustomerDao customerDao = super.db.getCustomerDaoImpl();
+		IAuthorDao authorDao = super.db.getAuthorDaoImpl();
+		IAddressDao addressDao = super.db.getAddressDaoImpl();
+		IItemDao itemDao = super.db.getItemDaoImpl();
+		ICountryDao countryDao = super.db.getCountryDaoImpl();
+		IOrdersDao ordersDao = super.db.getOrdersDaoImpl();
+		IOrderLineDao orderLineDao = super.db.getOrderLineDaoImpl();
+		ICcXactsDao ccXactsDao = super.db.getCcXactsDaoImpl();
+		
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			IOrders order = ordersDao.getObject();
+			
+			// Set parameter
+			order.setOId( i );
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+//			order.setCcXactses( new HashSet<ICcXacts>() );
+//			order.setOrderLines( new HashSet<IOrderLine>() );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				IOrderLine orderLine = orderLineDao.getObject();				
+				orderLine.setOlId( OL_ID );
+				
+				Item item = (Item) itemDao.findById( OL_I_ID );
+				Integer olQty = item.getOlQty();
+				item.setOlQty( (olQty == null ? 0 : olQty) + 1 );
+				itemDao.shrani( item );
+				
+				orderLine.setItem( item );
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+				
+				ordersDao.shrani( order );
+				orderLineDao.shrani( orderLine );
+//				order.getOrderLines().add(orderLine);
+				ordersDao.shrani( order );
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomInt( 1, NUM_AUTHORS );
+			CX_CO_ID = getRandomInt( 1, 92 );
+					
+			ICcXacts ccXacts = ccXactsDao.getObject();
+			ccXacts.setId( i );
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setId( order.getOId() );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( authorDao.findById( CX_AUTH_ID ) );
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+			
+			ccXacts.setOrders(order);
+			ccXactsDao.shrani( ccXacts );
+			
+//			order.getCcXactses().add( ccXacts );
+			
+			ordersDao.shrani( order );
+			
+		}
+
+		System.out.println( "" );
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
new file mode 100644
index 0000000..3d2b207
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
@@ -0,0 +1,17 @@
+package eu.cloudscale.showcase.generate;
+
+public interface IGenerate
+{
+	
+	public void populateCountryTable();
+	
+	public void populateAuthorTable();
+	
+	public void populateAddressTable();
+	
+	public void populateCustomerTable();
+	
+	public void populateItemTable();
+	
+	public void populateOrdersAndCC_XACTSTable();
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/AController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/AController.java
new file mode 100644
index 0000000..beb2cee
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/AController.java
@@ -0,0 +1,123 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.ui.Model;
+import org.springframework.util.PropertyPlaceholderHelper;
+
+import eu.cloudscale.showcase.db.IService;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IItem;
+
+public abstract class AController 
+{
+	@Autowired
+	@Qualifier("service")
+    protected IService service;
+
+	public List<IItem> getPromotional() 
+	{
+		IItemDao itemDao = service.getItemDaoImpl();
+		List<IItem> promotional = itemDao.getPromotional();
+
+		return promotional;
+	}
+	
+	protected String getUrl2(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null)
+	    {
+	    	url += "?SHOPPING_ID=" + shoppingId;
+	    	if( customerId != null )
+	    	{
+	    		url += "&C_ID=" + customerId;
+	    	}
+	    }
+	    else if ( customerId != null )
+	    {
+	    	url += "?C_ID=" + customerId;
+	    }
+		
+		return url;
+    }
+
+	protected String getUrl1(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null )
+		{
+			url += "&SHOPPING_ID=" + shoppingId;
+		}
+		
+		if( customerId != null )
+		{
+			url += "&C_ID=" + customerId;
+		}
+		
+		return url;
+    }	
+	
+	protected String getShoppingCartUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/shopping-cart" );
+	}
+
+	protected String getHomeUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/" );
+	}
+
+	protected String getSearchRequestUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/search" );
+	}
+	
+	protected String getOrderInquiryUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2( shoppingId, customerId, "/order-inquiry" );
+    }
+	
+	protected void setupFrontend(Model model, Integer shoppingId, Integer customerId)
+	{
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+		
+		String orderInquiryUrl = getOrderInquiryUrl(shoppingId, customerId);
+		model.addAttribute( "orderInquiryUrl", orderInquiryUrl );
+		
+		model.addAttribute( "cssResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.css" ));
+		model.addAttribute( "imgResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.img" ));
+		model.addAttribute( "jsResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.js" ));
+	}
+
+	protected Properties getApplicationProperties()
+	{
+		Resource resource = new ClassPathResource("app.properties");
+		Properties props = null;
+		try
+        {
+	        props = PropertiesLoaderUtils.loadProperties(resource);
+        }
+        catch ( IOException e )
+        {
+	        e.printStackTrace();
+        }
+		
+		return props;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
new file mode 100644
index 0000000..9f28d8f
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
@@ -0,0 +1,41 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping("/best-sellers")
+public class BestSellersController extends AController
+{
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String bestSellers(@RequestParam( value="SUBJECT", required=false) String category, 
+							  @RequestParam( value="C_ID", required=false) Integer customerId,
+							  @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+							  HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession(false);	
+
+		List<Object[]> res = service.getBestSellers( category );
+		model.addAttribute( "products", res );
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		model.addAttribute( "promotional", getPromotional() );	
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "best-sellers";
+	}
+	
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
new file mode 100644
index 0000000..e25e6e8
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
@@ -0,0 +1,143 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+
+@Controller
+@RequestMapping("/buy-confirm")
+public class BuyConfirmController extends AController
+{
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request,
+						Model model)
+	{
+		HttpSession session = request.getSession(false);
+				
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		String shoppingIdString = request.getParameter( "SHOPPING_ID" );
+		Integer shoppingId = null;
+		if( shoppingIdString != null && !shoppingIdString.isEmpty() )
+		{
+			shoppingId = Integer.parseInt(  shoppingIdString );
+		}
+		
+		String customerIdString = request.getParameter( "C_ID" );
+		Integer customerId = null;
+		if( customerIdString != null && !customerIdString.isEmpty() )
+		{
+			customerId = Integer.parseInt(  customerIdString );
+		}
+		
+		String ccType = request.getParameter( "CC_TYPE" );
+		String ccNumber_str = request.getParameter( "CC_NUMBER" );
+		Long ccNumber = null;
+		if( !ccNumber_str.isEmpty() )
+			ccNumber = Long.parseLong( ccNumber_str );
+		
+		SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
+		String ccName = request.getParameter( "CC_NAME" );
+		Date ccExpiry = null;
+        try
+        {
+	        ccExpiry = sdf.parse(request.getParameter( "CC_EXPIRY" ));
+        }
+        catch ( ParseException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+		String shipping = request.getParameter( "SHIPPING" );
+		String street1 = request.getParameter( "street1" );
+		
+		
+		BuyConfirmResult res = null;
+		if( street1 != null && street1.equals( "" ))
+		{
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+			if( errors.isEmpty() )
+				res = service.doBuyConfirm( shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+		}
+		else
+		{
+			String street2 = request.getParameter("street2");
+			String city = request.getParameter("city");
+			String state = request.getParameter( "state" );
+			String zip = request.getParameter("zip");
+			String country = request.getParameter("country");
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, country, city, state, zip);
+			if( errors.isEmpty() )
+				res = service.doBuyConfirm(shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, street2, city, state, zip, country);
+		}
+		
+		model.addAttribute("errors", errors);
+		model.addAttribute("results", res);
+		setupFrontend( model, shoppingId, customerId );
+		return "buy-confirm";
+	}
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping)
+    {
+		if(shoppingId == null)
+	    	errors.add( "Shipping id is null!" );
+	    if( customerId == null)
+	    	errors.add( "Customer id is null" );
+	    if( ccType == null || ccType.isEmpty() )
+	    	errors.add( "ccType is null" );
+	    if( ccNumber == null)
+	    	errors.add("ccNumber is null");
+	    if( ccName == null || ccName.isEmpty() )
+	    	errors.add( "ccName is null" );
+	    if( ccExpiry == null)
+	    	errors.add( "ccExpiry is null" );
+	    if( shipping == null || shipping.isEmpty() )
+	    	errors.add( "Shipping is null" );
+    }
+
+	private boolean countryExist( String country)
+    {
+		ICountryDao countryDao = service.getCountryDaoImpl();
+		
+		ICountry country1 = countryDao.getByName( country );
+		return country1 == null;
+    }
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping, String street, String country, String city, String state, String zip)
+    {
+	    checkEmptiness( errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping );
+	    
+	    if( city == null )
+	    	errors.add( "City is null" );
+	    
+	    if( state == null )
+	    	errors.add( "State is null" );
+	    
+	    if( zip == null )
+	    	errors.add( "Zip is null" );
+	    
+	    if( street == null )
+	    	errors.add( "Street1 or street2 is null" );
+	    
+	    if( !countryExist(country) )
+	    	errors.add( "That country doesn't exist!" );
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
new file mode 100644
index 0000000..0f38231
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
@@ -0,0 +1,227 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Controller
+@RequestMapping( "/buy" )
+public class BuyController extends AController
+{
+	
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	@Transactional
+	public String get(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "RETURNING_FLAG", required = false ) String returningFlag,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession(false);
+		
+		
+		
+		ArrayList<String> errors = new ArrayList<String>();
+
+		ICustomerDao customerDao = service.getCustomerDaoImpl();
+		ICountryDao countryDao = service.getCountryDaoImpl();
+		IShoppingCartDao scDao = service.getShoppingCartDaoImpl();
+		IAddressDao addrDao = service.getAddressDaoImpl();
+
+		ICustomer customer = null;
+		if ( returningFlag.equals( "Y" ) )
+		{
+			String uname = request.getParameter( "username" );
+			String passwd = request.getParameter( "password" );
+
+			if ( uname.length() == 0 || passwd.length() == 0 )
+			{
+				errors.add( "Username and password cannot be empty!" );
+			}
+			else
+			{
+				customer = customerDao.getUserBy( uname, passwd );
+				if ( customer == null )
+				{
+					errors.add( "Invalid username or password!" );
+				}
+
+//				if ( errors.isEmpty() )
+//				{
+//					session.setAttribute( "customer", customer );
+//				}
+			}
+		}
+		else if ( returningFlag.equals( "N" ) )
+		{
+			String fname = request.getParameter( "fname" );
+			checkEmptiness( fname, "First name", errors );
+			String lname = request.getParameter( "lname" );
+			checkEmptiness( lname, "Last name", errors );
+			String city = request.getParameter( "city" );
+			String state = request.getParameter( "state" );
+			String street1 = request.getParameter( "street1" );
+			String street2 = request.getParameter( "street2" );
+			String zip = request.getParameter( "zip" );
+			String country = request.getParameter( "country" );
+			checkEmptiness( country, "Country", errors );
+			String phone = request.getParameter( "phone" );
+			String email = request.getParameter( "email" );
+			String birthdate = request.getParameter( "birthdate" );
+			String data = request.getParameter( "data" );
+
+			if ( errors.isEmpty() )
+			{
+				customer = customerDao.getObject();
+				customer.setCFname( fname );
+				customer.setCLname( lname );
+
+				IAddress address = addrDao.getObject();
+				address.setAddrCity( city );
+				address.setAddrState( state );
+				address.setAddrStreet1( street1 );
+				address.setAddrStreet2( street2 );
+				address.setAddrZip( zip );
+				
+
+
+				ICountry countryObj = countryDao.getByName( country );
+				if ( countryObj == null )
+				{
+					errors.add( "Country " + country + " doesn't exist" );
+				}
+				else
+				{
+					address.setCountry( countryObj );
+				}
+				
+				address.getCustomers().add( customer );
+				addrDao.shrani( address );
+				
+				customer.setAddress( address );
+				customer.setCPhone( phone );
+				SimpleDateFormat sdf = new SimpleDateFormat( "dd/mm/yyyy" );
+
+				try
+				{
+					customer.setCBirthdate( sdf.parse( birthdate ) );
+				}
+				catch ( ParseException e )
+				{
+					e.printStackTrace();
+				}
+				customer.setCData( data );
+				customer.setCEmail( email );
+				customer.setCBalance( 0.0 );
+				customer.setCDiscount( (int) ( java.lang.Math.random() * 51 ) );
+				customer.setCExpiration( new Date(
+				        System.currentTimeMillis() + 7200000 ) );
+				customer.setCLastVisit( new Date( System.currentTimeMillis() ) );
+				customer.setCLogin( new Date( System.currentTimeMillis() ) );
+				customer.setCSince( new Date( System.currentTimeMillis() ) );
+				customer.setCYtdPmt( 0.0 );
+				customer.setCUname( "" );
+				customer.setCPasswd( "" );
+				customerDao.shrani( customer );
+				customer.setCUname( DigSyl( customer.getCId(), 0 ).toLowerCase() );
+				customer.setCPasswd( customer.getCUname().toLowerCase() );
+				customerDao.shrani( customer ); // update it with username and
+												// password
+			}
+		}
+		else
+		{
+			errors.add( "RETURNING_FLAG not set to Y or N!" );
+		}
+
+		if ( shoppingId == null )
+		{
+			errors.add( "Shopping cart ID not set!" );
+		}
+		
+		IShoppingCart cart = scDao.findById( shoppingId );
+		model.addAttribute( "errors", errors );
+		model.addAttribute( "cart", cart );
+		model.addAttribute( "customer", customer );
+		
+//		if( cart != null )
+//			model.addAttribute( "subTotal", getSubTotal( cart.getShoppingCartLines() ) );
+
+		setupFrontend(model, shoppingId, customerId);
+		return "buy";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		double total = 0;
+		for ( IShoppingCartLine scl : shoppingCartLines )
+		{
+			total += scl.getItem().getICost();
+		}
+
+		return total;
+	}
+
+	private void checkEmptiness(String obj, String desc,
+	        ArrayList<String> errors)
+	{
+		if ( obj == null || obj.isEmpty() )
+		{
+			errors.add( desc + " is empty!" );
+		}
+	}
+
+	private static final String[] digS = {"BA", "OG", "AL", "RI", "RE", "SE",
+	        "AT", "UL", "IN", "NG"    };
+
+	public String DigSyl(int d, int n)
+	{
+		String s = "";
+
+		if ( n == 0 )
+			return ( DigSyl( d ) );
+		for ( ; n > 0; n-- )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+			d = d / 10;
+		}
+
+		return ( s );
+	}
+
+	private String DigSyl(int d)
+	{
+		String s = "";
+
+		for ( ; d != 0; d = d / 10 )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+		}
+
+		return ( s );
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
new file mode 100644
index 0000000..c3a9dd8
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
@@ -0,0 +1,53 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+@Controller
+@RequestMapping( "/customer-registration" )
+public class CustomerRegistrationController extends AController
+{
+
+	@RequestMapping( "" )
+	public String get(
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession( false );
+
+		if ( session == null )
+			session = request.getSession( true );
+
+		ICustomer customer = null;
+		if ( customerId != null )
+		{
+			customer = service.getCustomerDaoImpl().findById( customerId );
+		}
+
+		model.addAttribute( "shoppingId", shoppingId );
+		model.addAttribute( "customerId", customerId );
+
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+
+		model.addAttribute( "sessionId", session.getId() );
+
+		setupFrontend( model, shoppingId, customerId );
+		return "customer-registration";
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
new file mode 100644
index 0000000..f4225e1
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
@@ -0,0 +1,102 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+@Controller
+@RequestMapping( "/" )
+public class HomeController extends AController
+{
+
+	private String[]            categories = {"ARTS", "NON-FICTION",
+	        "BIOGRAPHIES", "PARENTING", "BUSINESS", "POLITICS", "CHILDREN",
+	        "REFERENCE", "COMPUTERS", "RELIGION", "COOKING", "ROMANCE",
+	        "HEALTH", "SELF-HELP", "HISTORY", "SCIENCE-NATURE", "HOME",
+	        "SCIENCE-FICTION", "HUMOR", "SPORTS", "LITERATURE", "MYSTERY" };
+
+
+	private class Split
+	{
+
+		public String left, right, leftUrl, rightUrl;
+
+		public Split(String l, String lUrl, String r, String rUrl)
+		{
+			left = l;
+			leftUrl = lUrl;
+			rightUrl = rUrl;
+			right = r;
+		}
+	}
+
+	/**
+	 * Simply selects the home view to render by returning its name.
+	 */
+	@RequestMapping( value = "/", method = RequestMethod.GET )
+	public String home(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        Locale locale, HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession( false );
+
+		if ( session == null )
+			session = request.getSession( true );
+
+		String categoryUrl = getUrl1( shoppingId, customerId, "" );
+
+		model.addAttribute( "promotional", getPromotional() );
+		model.addAttribute( "categories", prepareCategories( categoryUrl ) );
+
+		model.addAttribute( "categoryUrl", categoryUrl );
+
+		setupFrontend( model, shoppingId, customerId );
+
+		String productUrl = getProductUrl( shoppingId, customerId );
+		model.addAttribute( "productUrl", productUrl );
+
+		return "home";
+	}
+
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl1( shoppingId, customerId, "" );
+	}
+
+	// private String getCategoryUrl(Integer shoppingId, Integer customerId)
+	// {
+	// String url = "";
+	// if( shoppingId != null)
+	// url+="&SHOPPING_ID=" + shoppingId;
+	//
+	// if( customerId != null )
+	// url += "&C_ID=" + customerId;
+	//
+	// return url;
+	// }
+
+	private List<Split> prepareCategories(String url)
+	{
+		ArrayList<Split> cats = new ArrayList<Split>();
+
+		for ( int i = 0; i < categories.length; i += 2 )
+		{
+			cats.add( new Split( categories[i], categories[i] + url,
+			        categories[i + 1], categories[i + 1] + url ) );
+		}
+		return cats;
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
new file mode 100644
index 0000000..519fc5c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
@@ -0,0 +1,65 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+@Controller
+@RequestMapping("/login")
+public class LoginController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, HttpSession session, Model model)
+	{
+		String referer = request.getParameter("next");
+		if( referer.isEmpty() )
+			referer = request.getHeader( "referer" );
+		
+		if( session.getAttribute( "customer" ) != null)
+			return "redirect:" + referer == null ? "/" : referer;
+		
+		model.addAttribute("referer", referer);
+		return "login";
+	}
+	
+	@RequestMapping(value="", method=RequestMethod.POST)
+	public String post(@RequestParam("username") String username, 
+						@RequestParam("password") String password,
+						@RequestParam("referer") String referer,
+						HttpSession session, Model model)
+	{
+		ICustomerDao customerDao = service.getCustomerDaoImpl();
+		ICustomer customer = null;
+		
+		if( (customer = customerDao.getUserBy(username, password)) != null )
+		{
+			Date currDate = new Date(); 
+			
+			
+			Calendar c = Calendar.getInstance();
+			c.setTime( currDate );
+			c.add( Calendar.HOUR, -1 );
+			
+			customer.setCLogin( currDate );
+			customer.setCExpiration( c.getTime() );
+			customerDao.shrani(customer);
+			session.setAttribute( "customer", customer );
+			return "redirect:" + referer;
+		}
+		
+		model.addAttribute("errors", "Login failed. Check username and password");
+		return "login";
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
new file mode 100644
index 0000000..b3d48d4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping( "/new-products" )
+public class NewProductsController extends AController
+{
+
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(Locale locale, Model model)
+//	{
+//		return "new-products";
+//	}
+
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	public String newProductsCategory(
+	        @RequestParam( value="SUBJECT", required=false) String category,
+	        @RequestParam( value="C_ID", required=false) Integer customerId,
+	        @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+	        Locale locale,
+	        HttpServletRequest request,
+	        Model model)
+	{
+		HttpSession session = request.getSession(false);
+		
+		return getNewProducts(category, model, customerId, shoppingId );
+	}
+	
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, null);
+//	}
+//	
+//	@RequestMapping( value = "/{category}/{customerId}/{shoppingId}", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								@PathVariable("shoppingId") Integer shoppingId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, shoppingId);
+//	}
+
+	private String getNewProducts(String category, Model model, Integer customerId, Integer shoppingId)
+	{
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		
+		model.addAttribute( "products", service.getNewProducts( category ) );
+		model.addAttribute( "promotional", getPromotional() );
+		
+		setupFrontend(model, shoppingId, customerId);
+		return "new-products";
+	}
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl1(shoppingId, customerId, "");
+    }
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
new file mode 100644
index 0000000..98a2933
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Controller
+@RequestMapping("/order-display")
+public class OrderDisplayController extends AController
+{
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @RequestMapping(method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession(false);
+		
+		if( session == null )
+			session = request.getSession(true);
+		
+		Integer customerId = null;
+		try
+		{
+			customerId = Integer.parseInt( request.getParameter("C_ID") );
+		}
+		catch(Exception e) {}
+		
+		Integer shoppingId = null;
+		try
+		{
+			shoppingId = Integer.parseInt( request.getParameter("SHOPPING_ID") );
+		}
+		catch(Exception e) {}
+		
+		String uname = request.getParameter("username");
+		String passwd = request.getParameter("password");
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		IOrders order = null;
+		List<IOrderLine> orderLines = null;
+		
+		if (uname != null && passwd != null) 
+		{
+
+			ICustomer customer = service.getCustomerDaoImpl().getUserBy( uname, passwd);
+			
+			if (customer == null) 
+			{
+				errors.add( "Error: Incorrect password or username.\n" );
+			} 
+			else 
+			{
+				order = service.getOrdersDaoImpl().getMostRecentOrder( customer );
+				if (order == null)
+				{
+					errors.add("User doesn't have orders");
+				}
+				else 
+				{
+					orderLines = service.getOrderLineDaoImpl().findAllByOrder( order );
+				}
+			}
+
+		} 
+		else
+		{
+			errors.add("Error: TPCW_order_display_servlet, uname and passwd not set!.\n");
+		}
+		
+		if( errors.isEmpty() )
+		{
+			model.addAttribute( "order", order );
+			model.addAttribute( "orderLines", orderLines );
+		}
+		
+		model.addAttribute( "errors", errors);
+		
+		setupFrontend( model, shoppingId, customerId );
+		return "order-display";
+	}
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
new file mode 100644
index 0000000..167c360
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping( "/order-inquiry" )
+public class OrderInquiryController extends AController
+{
+
+	@RequestMapping( method = RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession( false );
+
+		if ( session == null )
+			session = request.getSession( true );
+
+		Integer C_ID = null;
+		try
+		{
+			C_ID = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+		
+		Integer SHOPPING_ID = null;
+		try
+		{
+			SHOPPING_ID = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+
+		if ( C_ID != null )
+		{
+			model.addAttribute( "customerId", C_ID );
+		}
+
+		if ( SHOPPING_ID != null )
+		{
+			model.addAttribute( "shoppingId", SHOPPING_ID );
+		}
+
+		setupFrontend( model, SHOPPING_ID, C_ID );
+		return "order-inquiry";
+	}
+
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
new file mode 100644
index 0000000..546ee21
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Controller
+@RequestMapping("/product-detail")
+public class ProductDetailServlet extends AController
+{
+	private @Autowired HttpServletRequest request;
+	
+	@RequestMapping(method = RequestMethod.GET)
+	public String get(
+					@RequestParam(value= "I_ID", required=false) Integer itemId,
+					@RequestParam(value = "C_ID", required=false ) Integer customerId,
+					@RequestParam(value = "SHOPPING_ID", required=false) Integer shoppingId,
+					HttpServletRequest request,
+					Locale locale, 
+					Model model)
+	{
+		HttpSession session = request.getSession(false);
+				
+		IItemDao itemDao = service.getItemDaoImpl();
+		IItem item = itemDao.findById(itemId);
+		
+		String addToShoppingCartUrl = buildAddToShoppingCartUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "addToShoppingCartUrl", addToShoppingCartUrl);
+		
+		String adminUrl = buildAdminUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "adminUrl", adminUrl );
+		
+		model.addAttribute( "item", item);
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "product_detail";
+	}
+
+	private String buildAddToShoppingCartUrl(Integer shoppingId, Integer customerId, Integer itemId)
+    {
+		String url = getUrl2(shoppingId, customerId, "/shopping-cart");
+		if( url.equals( "/shopping-cart" ))
+			url += "?";
+		
+		url += "&I_ID=" + itemId + "&QTY=1&ADD_FLAG=Y";
+		return url;
+    }
+
+	private String buildAdminUrl(Integer shoppingId, Integer customerId, int id)
+    {
+	    return getUrl2(shoppingId, customerId, "/admin");
+    }
+
+	
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
new file mode 100644
index 0000000..6234843
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
@@ -0,0 +1,83 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+@Controller
+@RequestMapping("/search")
+public class SearchController extends AController
+{
+	
+	@RequestMapping( method=RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+	
+		HttpSession session = request.getSession(false);
+		
+		String field = request.getParameter("searchField");
+		String keyword = request.getParameter( "keyword" );
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		if( keyword == null)
+		{
+			keyword = "";
+			errors.add( "Search string is empty" );
+			model.addAttribute( "errors", errors );
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		if( field.equalsIgnoreCase( "author" ))
+    		{
+    			model.addAttribute( "results", service.searchByAuthor(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "title" ))
+    		{
+    			model.addAttribute( "results", service.searchByTitle(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "subject" ))
+    		{
+    			model.addAttribute( "results", service.searchBySubject(keyword) );
+    		}
+		}
+		
+		model.addAttribute( "searchField", field );
+		model.addAttribute( "keyword", keyword );
+		setupUrls( model, request);
+		return "search";
+	}
+	
+	private void setupUrls(Model model, HttpServletRequest request)
+	{
+		Integer shoppingId = null;
+		if( request.getParameter( "SHOPPING_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+		Integer customerId = null;
+		if( request.getParameter( "C_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "C_ID" ));
+		}
+		setupFrontend( model, shoppingId, customerId);
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+	}
+	
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
new file mode 100644
index 0000000..e0208f1
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
@@ -0,0 +1,114 @@
+package eu.cloudscale.showcase.servlets;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Controller
+@RequestMapping("/shopping-cart")
+public class ShoppingCartController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = request.getSession(false);
+				
+		IShoppingCartDao scDao = service.getShoppingCartDaoImpl();
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		Integer itemId = null;
+		Integer customerId = null;
+		Integer shoppingId = null;
+		if( request.getParameter( "I_ID" ) != null )
+		{
+			itemId = Integer.parseInt(request.getParameter( "I_ID" ));
+		}
+		
+		if( request.getParameter( "C_ID" ) != null )
+		{
+			customerId = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		
+		if( request.getParameter( "SHOPPING_ID" ) != null )
+		{
+			shoppingId = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+		String addFlag = request.getParameter("ADD_FLAG");
+		
+		if( shoppingId == null || scDao.findById( shoppingId ) == null )
+		{
+			shoppingId = scDao.createEmptyCart();
+		}
+		
+		if( addFlag != null && addFlag.equals( "Y" ) )
+		{
+			if(itemId == null)
+				errors.add("No item id!");
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		List<Integer> quantities = new ArrayList<Integer>();
+    		List<Integer> ids = new ArrayList<Integer>();
+    		int i = 0;
+    		String curr_QTYstr = request.getParameter( "QTY_" + i ) ;
+    		String curr_I_IDstr = request.getParameter( "I_ID_" + i );
+    		
+    		while (curr_I_IDstr != null) 
+    		{
+    			ids.add(Integer.parseInt(curr_I_IDstr));
+    			quantities.add(Integer.parseInt((curr_QTYstr)));
+    			i++;
+    			curr_QTYstr = request.getParameter("QTY_" + i);
+    			curr_I_IDstr = request.getParameter("I_ID_" + i);
+    		}
+    		
+    		IShoppingCart cart = service.doCart(shoppingId, itemId, ids, quantities);
+    		model.addAttribute( "cart", cart);
+//    		model.addAttribute( "subTotal", getSubTotal(cart.getShoppingCartLines()));
+		
+    		String customerRegistration = getCustomerRegistrationURL(customerId, shoppingId);
+    		model.addAttribute( "checkoutUrl", customerRegistration);
+		
+    		if( customerId != null )
+    			model.addAttribute("customerId", customerId);
+		}
+		
+		model.addAttribute("errors", errors);
+		setupFrontend(model, shoppingId, customerId);
+		return "shopping-cart";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+    {
+		double subtotal = 0;
+		for(IShoppingCartLine scl : shoppingCartLines)
+		{
+			subtotal += scl.getItem().getICost();
+		}
+		
+		return subtotal;
+    }
+
+
+	private String getCustomerRegistrationURL(Integer customerId, Integer shoppingId)
+    {
+		return getUrl2(shoppingId, customerId, "/customer-registration");
+    }	
+	
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/app.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/app.properties
new file mode 100644
index 0000000..2a8dd22
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/app.properties
@@ -0,0 +1,3 @@
+eu.cloudscale.files.url.css=https\://url-to/css
+eu.cloudscale.files.url.img=https\://url-to/img
+eu.cloudscale.files.url.js=https\://url-to/js
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/app-context.xml b/deployment-scripts/scripts/platform/generator/src/main/resources/app-context.xml
new file mode 100644
index 0000000..8ce75c3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/app-context.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd">
+	
+	<!-- These variables are replaced with ones defined in pom.xml -->
+	<import resource="classpath:cache.xml" />
+	<import resource="classpath:${eu.cloudscale.datasource}.xml" />
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/cache.xml b/deployment-scripts/scripts/platform/generator/src/main/resources/cache.xml
new file mode 100644
index 0000000..1709a98
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/cache.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+
+	<cache:annotation-driven />
+				
+	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
+		p:cache-manager-ref="ehcache" />
+	<bean id="ehcache"
+		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
+		p:cacheManagerName="myCacheManager" p:shared="true" p:config-location="classpath:ehcache.xml" />
+		
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.hibernate.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.hibernate.properties
new file mode 100644
index 0000000..81be84a
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://master/databasename
+jdbc.username=<user>
+jdbc.password=<pass>
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.mongodb.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.mongodb.properties
new file mode 100644
index 0000000..b3d04a5
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/database/database.aws.mongodb.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mongodb
+mongodb.dbname=tpcw
+mongodb.host=ip
+mongodb.port=27017
+mongodb.username=<user>
+mongodb.password=<pass>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/ehcache.xml b/deployment-scripts/scripts/platform/generator/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..58ecc72
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/ehcache.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">    
+    <diskStore path="java.io.tmpdir/Cloudscale-cache"/>
+    <defaultCache 
+    	eternal="false" 
+    	maxElementsInMemory="100000"
+        overflowToDisk="false" 
+        diskPersistent="false" 
+        timeToIdleSeconds="0"
+        timeToLiveSeconds="600" 
+        memoryStoreEvictionPolicy="LRU"
+    />
+    
+    <cache 
+     	name="bestSellers"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="newProducts"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="search"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+    
+    <cache 
+     	name="org.hibernate.cache.spi.UpdateTimestampsCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+   
+ 	<cache 
+ 		name="org.hibernate.cache.internal.StandardQueryCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/> 
+</ehcache>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.aws.hibernate.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.aws.hibernate.properties
new file mode 100644
index 0000000..ab0a963
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://master/tpcw
+jdbc.username=<user>
+jdbc.password=<pass>
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.properties
new file mode 100644
index 0000000..ab0a963
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/generate/database.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://master/tpcw
+jdbc.username=<user>
+jdbc.password=<pass>
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/hibernate.xml b/deployment-scripts/scripts/platform/generator/src/main/resources/hibernate.xml
new file mode 100644
index 0000000..19a73c3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/hibernate.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xsi:schemaLocation="http://www.springframework.org/schema/jdbc 
+			http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/tx 
+			http://www.springframework.org/schema/tx/spring-tx.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+	
+	<context:property-placeholder
+		location="${eu.cloudscale.showcase.generate.properties}" />
+		
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.hibernate" />
+
+	<bean id="service" class="eu.cloudscale.showcase.db.services.HibernateService" />
+	
+	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
+		destroy-method="close">
+
+		<property name="driverClass" value="${jdbc.driverClassName}" />
+		<property name="jdbcUrl" value="${jdbc.url}" />
+		<property name="user" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<!-- these are C3P0 properties -->
+		<property name="acquireIncrement" value="1" />
+		<property name="minPoolSize" value="4" />
+		<property name="maxPoolSize" value="32" />
+		<property name="maxIdleTime" value="60" />
+<!-- 		<property name="maxConnectionAge" value="180" /> -->
+		<!-- <property name="debugUnreturnedConnectionStackTraces" value="true" 
+			/> -->
+		<property name="initialPoolSize" value="4" />
+		<property name="idleConnectionTestPeriod" value="10" />
+		<property name="checkoutTimeout" value="3000" />
+<!-- 		<property name="maxIdleTimeExcessConnections" value="30" /> -->
+		<property name="unreturnedConnectionTimeout" value="30" />
+		<property name="debugUnreturnedConnectionStackTraces" value="true" />
+		<!-- <property name="automaticTestTable" value="conTest" /> -->
+<!-- 		<property name="testConnectionOnCheckin" value="true" /> -->
+<!-- 		<property name="testConnectionOnCheckout" value="true" /> -->
+	</bean>
+
+	<tx:annotation-driven transaction-manager="transactionManager" />
+
+	<bean id="sessionFactory"
+		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		
+		<property name="packagesToScan" value="eu.cloudscale.showcase.db.dao" />
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.hbm2ddl.auto">create</prop>
+				<prop key="hibernate.jdbc.batch_size">50</prop>
+				<prop key="hibernate.show_sql">false</prop>
+				<prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
+				<prop key="hibernate.max_fetch_depth">4</prop>
+				<!-- <prop key="hibernate.connection.release_mode">after_statement</prop> -->
+				<prop key="hibernate.cache.use_second_level_cache">true</prop>
+				<prop key="hibernate.cache.use_query_cache">true</prop>
+				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
+				</prop>
+				<prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:ehcache.xml</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+		<property name="annotatedClasses">
+			<list>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Address</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Author</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.CcXacts</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Country</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Customer</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Item</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.OrderLine</value>
+				<!-- <value>eu.cloudscale.showcase.db.model.rbms.CcXactsId</value> -->
+				<value>eu.cloudscale.showcase.db.model.hibernate.Orders</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCart
+				</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine
+				</value>
+			</list>
+		</property>
+	</bean>
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/log4j.properties b/deployment-scripts/scripts/platform/generator/src/main/resources/log4j.properties
new file mode 100644
index 0000000..a098bf1
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/log4j.properties
@@ -0,0 +1,7 @@
+log4j.rootCategory=ERROR, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
+log4j.category.org.springframework.beans.factory=ERROR
+log4j.logger.com.mchange=INFO
+log4j.category.org.springframework.data.document.mongodb=DEBUG
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/mongodb.xml b/deployment-scripts/scripts/platform/generator/src/main/resources/mongodb.xml
new file mode 100644
index 0000000..deb185c
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/mongodb.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/data/mongo
+			http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
+
+	<!-- More information: http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/mongo.core.html -->
+	<context:property-placeholder
+		location="classpath:database/database.aws.mongodb.properties" />
+	
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.mongo.impl" />
+	
+	<mongo:mongo host="${mongodb.host}" port="${mongodb.port}" >
+		<mongo:options connections-per-host="100"
+                   threads-allowed-to-block-for-connection-multiplier="50"
+                   connect-timeout="1000"
+                   max-wait-time="2000"
+                   auto-connect-retry="true"
+                   socket-keep-alive="true"
+                   socket-timeout="2000"/>
+	</mongo:mongo>
+
+	<mongo:db-factory host="${mongodb.host}" port="${mongodb.port}"
+		dbname="${mongodb.dbname}" username="${mongodb.username}" password="${mongodb.password}" />
+
+	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
+		
+	</bean>
+	<bean id="service" class="eu.cloudscale.showcase.db.services.MongoService">
+	</bean>
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/resources/schema.sql b/deployment-scripts/scripts/platform/generator/src/main/resources/schema.sql
new file mode 100644
index 0000000..ca29ee9
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/resources/schema.sql
@@ -0,0 +1,264 @@
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
+
+DROP SCHEMA IF EXISTS `tpcw` ;
+CREATE SCHEMA IF NOT EXISTS `tpcw` DEFAULT CHARACTER SET utf8 COLLATE utf8_slovenian_ci ;
+USE `tpcw` ;
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`author`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`author` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`author` (
+  `A_ID` INT NOT NULL AUTO_INCREMENT ,
+  `A_FNAME` VARCHAR(20) NULL ,
+  `A_LNAME` VARCHAR(20) NULL ,
+  `A_MNAME` VARCHAR(20) NULL ,
+  `A_DOB` DATETIME NULL ,
+  `A_BIO` TEXT NULL ,
+  PRIMARY KEY (`A_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`item` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`item` (
+  `I_ID` INT NOT NULL AUTO_INCREMENT ,
+  `I_TITLE` VARCHAR(60) NULL ,
+  `I_A_ID` INT NOT NULL ,
+  `I_PUB_DATE` DATETIME NULL ,
+  `I_PUBLISHER` VARCHAR(60) NULL ,
+  `I_SUBJECT` VARCHAR(60) NULL ,
+  `I_DESC` TEXT NULL ,
+  `I_RELATED1` INT NULL ,
+  `I_RELATED2` INT NULL ,
+  `I_RELATED3` INT NULL ,
+  `I_RELATED4` INT NULL ,
+  `I_RELATED5` INT NULL ,
+  `I_THUMBNAIL` VARCHAR(60) NULL ,
+  `I_IMAGE` VARCHAR(60) NULL ,
+  `I_SRP` INT NULL ,
+  `I_COST` INT NULL ,
+  `I_AVAIL` DATETIME NULL ,
+  `I_STOCK` INT NULL ,
+  `I_ISBN` VARCHAR(13) NULL ,
+  `I_PAGE` VARCHAR(4) NULL ,
+  `I_BACKING` VARCHAR(15) NULL ,
+  `I_DIMENSION` VARCHAR(25) NULL ,
+  INDEX `fk_ITEM_AUTHOR` (`I_A_ID` ASC) ,
+  PRIMARY KEY (`I_ID`) ,
+  CONSTRAINT `fk_ITEM_AUTHOR`
+    FOREIGN KEY (`I_A_ID` )
+    REFERENCES `tpcw`.`author` (`A_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`country`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`country` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`country` (
+  `CO_ID` INT NOT NULL AUTO_INCREMENT ,
+  `CO_NAME` VARCHAR(50) NULL ,
+  `CO_EXCHANGE` DOUBLE NULL ,
+  `CO_CURRENCY` VARCHAR(18) NULL ,
+  PRIMARY KEY (`CO_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`address`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`address` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`address` (
+  `ADDR_ID` INT NOT NULL AUTO_INCREMENT ,
+  `ADDR_STREET1` VARCHAR(40) NULL ,
+  `ADDR_STREET2` VARCHAR(40) NULL ,
+  `ADDR_CITY` VARCHAR(30) NULL ,
+  `ADDR_STATE` VARCHAR(20) NULL ,
+  `ADDR_ZIP` VARCHAR(10) NULL ,
+  `ADDR_CO_ID` INT NOT NULL ,
+  PRIMARY KEY (`ADDR_ID`) ,
+  INDEX `fk_ADDRESS_COUNTRY1` (`ADDR_CO_ID` ASC) ,
+  CONSTRAINT `fk_ADDRESS_COUNTRY1`
+    FOREIGN KEY (`ADDR_CO_ID` )
+    REFERENCES `tpcw`.`country` (`CO_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`customer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`customer` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`customer` (
+  `C_ID` INT NOT NULL AUTO_INCREMENT ,
+  `C_UNAME` VARCHAR(20) NULL ,
+  `C_PASSWD` VARCHAR(20) NULL ,
+  `C_FNAME` VARCHAR(15) NULL ,
+  `C_LNAME` VARCHAR(15) NULL ,
+  `C_ADDR_ID` INT NOT NULL ,
+  `C_PHONE` VARCHAR(16) NULL ,
+  `C_EMAIL` VARCHAR(50) NULL ,
+  `C_SINCE` DATE NULL ,
+  `C_LAST_VISIT` DATE NULL ,
+  `C_LOGIN` DATETIME NULL ,
+  `C_EXPIRATION` DATETIME NULL COMMENT '	' ,
+  `C_DISCOUNT` INT NULL ,
+  `C_BALANCE` INT NULL ,
+  `C_YTD_PMT` INT NULL ,
+  `C_BIRTHDATE` DATE NULL ,
+  `C_DATA` TEXT NULL ,
+  PRIMARY KEY (`C_ID`) ,
+  INDEX `fk_CUSTOMER_ADDRESS1` (`C_ADDR_ID` ASC) ,
+  CONSTRAINT `fk_CUSTOMER_ADDRESS1`
+    FOREIGN KEY (`C_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`orders`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`orders` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`orders` (
+  `O_ID` INT NOT NULL AUTO_INCREMENT ,
+  `O_C_ID` INT NOT NULL ,
+  `O_DATE` DATETIME NULL ,
+  `O_SUB_TOTAL` INT NULL ,
+  `O_TAX` INT NULL ,
+  `O_TOTAL` INT NULL ,
+  `O_SHIP_TYPE` VARCHAR(10) NULL ,
+  `O_SHIP_DATE` DATETIME NULL ,
+  `O_BILL_ADDR_ID` INT NOT NULL ,
+  `O_SHIP_ADDR_ID` INT NOT NULL ,
+  `O_STATUS` VARCHAR(15) NULL ,
+  PRIMARY KEY (`O_ID`) ,
+  INDEX `fk_ORDERS_CUSTOMER1` (`O_C_ID` ASC) ,
+  INDEX `fk_ORDERS_ADDRESS1` (`O_BILL_ADDR_ID` ASC) ,
+  INDEX `fk_ORDERS_ADDRESS2` (`O_SHIP_ADDR_ID` ASC) ,
+  CONSTRAINT `fk_ORDERS_CUSTOMER1`
+    FOREIGN KEY (`O_C_ID` )
+    REFERENCES `tpcw`.`customer` (`C_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDERS_ADDRESS1`
+    FOREIGN KEY (`O_BILL_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDERS_ADDRESS2`
+    FOREIGN KEY (`O_SHIP_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`order_line`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`order_line` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`order_line` (
+  `OL_ID` INT NOT NULL ,
+  `OL_O_ID` INT NOT NULL ,
+  `OL_I_ID` INT NOT NULL ,
+  `OL_QTY` INT NULL ,
+  `OL_DISCOUNT` INT NULL ,
+  `OL_COMMENT` VARCHAR(100) NULL ,
+  PRIMARY KEY (`OL_ID`) ,
+  INDEX `fk_ORDER_LINE_ITEM1` (`OL_I_ID` ASC) ,
+  INDEX `fk_ORDER_LINE_ORDERS1` (`OL_O_ID` ASC) ,
+  CONSTRAINT `fk_ORDER_LINE_ITEM1`
+    FOREIGN KEY (`OL_I_ID` )
+    REFERENCES `tpcw`.`item` (`I_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDER_LINE_ORDERS1`
+    FOREIGN KEY (`OL_O_ID` )
+    REFERENCES `tpcw`.`orders` (`O_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`cc_xacts`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`cc_xacts` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`cc_xacts` (
+  `CX_O_ID` INT NOT NULL AUTO_INCREMENT ,
+  `CX_TYPE` VARCHAR(10) NULL ,
+  `CX_NUM` INT NULL ,
+  `CX_NAME` VARCHAR(31) NULL ,
+  `CX_EXPIRY` DATE NULL ,
+  `CX_AUTH_ID` VARCHAR(15) NULL ,
+  `CX_XACT_AMT` DECIMAL(15,2) NULL ,
+  `CX_XACT_DATE` DATETIME NULL ,
+  `CX_CO_ID` INT NOT NULL ,
+  INDEX `fk_CC_XACTS_ORDERS` (`CX_O_ID` ASC) ,
+  INDEX `fk_CC_XACTS_COUNTRY` (`CX_CO_ID` ASC) ,
+  CONSTRAINT `fk_CC_XACTS_ORDERS`
+    FOREIGN KEY (`CX_O_ID` )
+    REFERENCES `tpcw`.`orders` (`O_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_CC_XACTS_COUNTRY`
+    FOREIGN KEY (`CX_CO_ID` )
+    REFERENCES `tpcw`.`country` (`CO_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`shopping_cart`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`shopping_cart` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`shopping_cart` (
+  `SC_ID` INT NOT NULL AUTO_INCREMENT ,
+  `SC_TIME` TIMESTAMP NULL ,
+  PRIMARY KEY (`SC_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`shopping_cart_line`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`shopping_cart_line` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`shopping_cart_line` (
+  `SCL_SC_ID` INT NOT NULL AUTO_INCREMENT ,
+  `SCL_QTY` INT NULL ,
+  `SCL_I_ID` INT NOT NULL ,
+  PRIMARY KEY (`SCL_SC_ID`) ,
+  INDEX `fk_shopping_cart_line_item1` (`SCL_I_ID` ASC) ,
+  CONSTRAINT `fk_shopping_cart_line_item1`
+    FOREIGN KEY (`SCL_I_ID` )
+    REFERENCES `tpcw`.`item` (`I_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.css b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.css
new file mode 100644
index 0000000..2f56af3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.css
@@ -0,0 +1,6158 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  width: auto\9;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img,
+.google-maps img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+  cursor: pointer;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+@media print {
+  * {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !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: 0.5cm;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover,
+a:focus {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+  margin-left: 2.127659574468085%;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 21px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+a.muted:hover,
+a.muted:focus {
+  color: #808080;
+}
+
+.text-warning {
+  color: #c09853;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #a47e3c;
+}
+
+.text-error {
+  color: #b94a48;
+}
+
+a.text-error:hover,
+a.text-error:focus {
+  color: #953b39;
+}
+
+.text-info {
+  color: #3a87ad;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+  color: #2d6987;
+}
+
+.text-success {
+  color: #468847;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+  color: #356635;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 20px;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1,
+h2,
+h3 {
+  line-height: 40px;
+}
+
+h1 {
+  font-size: 38.5px;
+}
+
+h2 {
+  font-size: 31.5px;
+}
+
+h3 {
+  font-size: 24.5px;
+}
+
+h4 {
+  font-size: 17.5px;
+}
+
+h5 {
+  font-size: 14px;
+}
+
+h6 {
+  font-size: 11.9px;
+}
+
+h1 small {
+  font-size: 24.5px;
+}
+
+h2 small {
+  font-size: 17.5px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+  display: inline-block;
+  *display: inline;
+  padding-right: 5px;
+  padding-left: 5px;
+  *zoom: 1;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal {
+  *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.dl-horizontal:after {
+  clear: both;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 160px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 180px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 17.5px;
+  font-weight: 300;
+  line-height: 1.25;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  white-space: nowrap;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 10px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  vertical-align: middle;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+input,
+textarea,
+.uneditable-input {
+  width: 206px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 20px;
+  padding-left: 20px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -20px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"],
+.row-fluid .controls-row [class*="span"] {
+  float: left;
+}
+
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+  padding-top: 5px;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning .control-label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error .control-label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success .control-label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+.control-group.info .control-label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+  color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  border-color: #3a87ad;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+  border-color: #2d6987;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #3a87ad;
+}
+
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:invalid:focus,
+textarea:focus:invalid:focus,
+select:focus:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  display: inline-block;
+  margin-bottom: 10px;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input,
+.input-append .dropdown-menu,
+.input-prepend .dropdown-menu,
+.input-append .popover,
+.input-prepend .popover {
+  font-size: 14px;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  vertical-align: top;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn,
+.input-append .btn-group > .dropdown-toggle,
+.input-prepend .btn-group > .dropdown-toggle {
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input + .btn-group .btn:last-child,
+.input-append select + .btn-group .btn:last-child,
+.input-append .uneditable-input + .btn-group .btn:last-child {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append .add-on,
+.input-append .btn,
+.input-append .btn-group {
+  margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child,
+.input-append .btn-group:last-child > .dropdown-toggle {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append input + .btn-group .btn,
+.input-prepend.input-append select + .btn-group .btn,
+.input-prepend.input-append .uneditable-input + .btn-group .btn {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .btn-group:first-child {
+  margin-left: 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 160px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 180px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+  margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block,
+.form-horizontal .uneditable-input + .help-block,
+.form-horizontal .input-prepend + .help-block,
+.form-horizontal .input-append + .help-block {
+  margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 180px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table .table {
+  background-color: #ffffff;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child > th:first-child,
+.table-bordered tbody:first-child tr:first-child > td:first-child,
+.table-bordered tbody:first-child tr:first-child > th:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child > th:last-child,
+.table-bordered tbody:first-child tr:first-child > td:last-child,
+.table-bordered tbody:first-child tr:first-child > th:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:first-child,
+.table-bordered tbody:last-child tr:last-child > td:first-child,
+.table-bordered tbody:last-child tr:last-child > th:first-child,
+.table-bordered tfoot:last-child tr:last-child > td:first-child,
+.table-bordered tfoot:last-child tr:last-child > th:first-child {
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:last-child,
+.table-bordered tbody:last-child tr:last-child > td:last-child,
+.table-bordered tbody:last-child tr:last-child > th:last-child,
+.table-bordered tfoot:last-child tr:last-child > td:last-child,
+.table-bordered tfoot:last-child tr:last-child > th:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
+  -webkit-border-bottom-left-radius: 0;
+          border-bottom-left-radius: 0;
+  -moz-border-radius-bottomleft: 0;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 0;
+          border-bottom-right-radius: 0;
+  -moz-border-radius-bottomright: 0;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-striped tbody > tr:nth-child(odd) > td,
+.table-striped tbody > tr:nth-child(odd) > th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover > td,
+.table-hover tbody tr:hover > th {
+  background-color: #f5f5f5;
+}
+
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+.table td.span1,
+.table th.span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+.table td.span2,
+.table th.span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+.table td.span3,
+.table th.span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+.table td.span4,
+.table th.span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+.table td.span5,
+.table th.span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+.table td.span6,
+.table th.span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+.table td.span7,
+.table th.span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+.table td.span8,
+.table th.span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+.table td.span9,
+.table th.span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+.table td.span10,
+.table th.span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+.table td.span11,
+.table th.span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+.table td.span12,
+.table th.span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+.table tbody tr.success > td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error > td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.warning > td {
+  background-color: #fcf8e3;
+}
+
+.table tbody tr.info > td {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover > td {
+  background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover > td {
+  background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover > td {
+  background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover > td {
+  background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  width: 16px;
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+
+.dropup .dropdown-submenu > .dropdown-menu {
+  top: auto;
+  bottom: 0;
+  margin-top: 0;
+  margin-bottom: -2px;
+  -webkit-border-radius: 5px 5px 5px 0;
+     -moz-border-radius: 5px 5px 5px 0;
+          border-radius: 5px 5px 5px 0;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown-submenu.pull-left {
+  float: none;
+}
+
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  z-index: 1051;
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #cccccc;
+  *border: 0;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:focus,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover,
+.btn:focus {
+  color: #333333;
+  text-decoration: none;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 11px 19px;
+  font-size: 17.5px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+  margin-top: 4px;
+}
+
+.btn-small {
+  padding: 2px 10px;
+  font-size: 11.9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+  margin-top: -1px;
+}
+
+.btn-mini {
+  padding: 0 6px;
+  font-size: 10.5px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:focus,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+  color: #333333;
+  text-decoration: none;
+}
+
+.btn-group {
+  position: relative;
+  display: inline-block;
+  *display: inline;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 10.5px;
+}
+
+.btn-group > .btn-small {
+  font-size: 11.9px;
+}
+
+.btn-group > .btn-large {
+  font-size: 17.5px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.btn-mini .caret,
+.btn-small .caret {
+  margin-top: 8px;
+}
+
+.dropup .btn-large .caret {
+  border-bottom-width: 5px;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical > .btn {
+  display: block;
+  float: none;
+  max-width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical > .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical > .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical > .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical > .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical > .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert,
+.alert h4 {
+  color: #c09853;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-success h4 {
+  color: #468847;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-danger h4,
+.alert-error h4 {
+  color: #b94a48;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-info h4 {
+  color: #3a87ad;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > li > a > img {
+  max-width: none;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover,
+.tabs-below > .nav-tabs > li > a:focus {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-inner:after {
+  clear: both;
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+  overflow: visible;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #777777;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover,
+.navbar .brand:focus {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #777777;
+}
+
+.navbar-link {
+  color: #777777;
+}
+
+.navbar-link:hover,
+.navbar-link:focus {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+  margin-top: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 5px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+  margin-right: 0;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #777777;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:focus,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+  border-top-color: #333333;
+  border-bottom-color: #333333;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #777777;
+  border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover,
+.navbar-inverse .brand:focus,
+.navbar-inverse .nav > li > a:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .brand {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-text {
+  color: #999999;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover,
+.navbar-inverse .navbar-link:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > a:hover .caret,
+.navbar-inverse .nav li.dropdown > a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:focus,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb > li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb > li > .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb > .active {
+  color: #999999;
+}
+
+.pagination {
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+  display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+  float: left;
+  padding: 4px 12px;
+  line-height: 20px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+  border-left-width: 1px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pagination-large ul > li > a,
+.pagination-large ul > li > span {
+  padding: 11px 19px;
+  font-size: 17.5px;
+}
+
+.pagination-large ul > li:first-child > a,
+.pagination-large ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.pagination-large ul > li:last-child > a,
+.pagination-large ul > li:last-child > span {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.pagination-mini ul > li:first-child > a,
+.pagination-small ul > li:first-child > a,
+.pagination-mini ul > li:first-child > span,
+.pagination-small ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 3px;
+          border-bottom-left-radius: 3px;
+  -webkit-border-top-left-radius: 3px;
+          border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -moz-border-radius-topleft: 3px;
+}
+
+.pagination-mini ul > li:last-child > a,
+.pagination-small ul > li:last-child > a,
+.pagination-mini ul > li:last-child > span,
+.pagination-small ul > li:last-child > span {
+  -webkit-border-top-right-radius: 3px;
+          border-top-right-radius: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+          border-bottom-right-radius: 3px;
+  -moz-border-radius-topright: 3px;
+  -moz-border-radius-bottomright: 3px;
+}
+
+.pagination-small ul > li > a,
+.pagination-small ul > li > span {
+  padding: 2px 10px;
+  font-size: 11.9px;
+}
+
+.pagination-mini ul > li > a,
+.pagination-mini ul > li > span {
+  padding: 0 6px;
+  font-size: 10.5px;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 10%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin-left: -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  outline: none;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 10%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  position: relative;
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  font-size: 11px;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  text-align: left;
+  white-space: normal;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-top: -10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-left: -10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-title:empty {
+  display: none;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow {
+  border-width: 11px;
+}
+
+.popover .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-bottom-width: 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  border-right-color: #ffffff;
+  border-left-width: 0;
+}
+
+.popover.bottom .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-top-width: 0;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  border-left-color: #ffffff;
+  border-right-width: 0;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.media,
+.media-body {
+  overflow: hidden;
+  *overflow: visible;
+  zoom: 1;
+}
+
+.media,
+.media .media {
+  margin-top: 15px;
+}
+
+.media:first-child {
+  margin-top: 0;
+}
+
+.media-object {
+  display: block;
+}
+
+.media-heading {
+  margin: 0 0 5px;
+}
+
+.media > .pull-left {
+  margin-right: 10px;
+}
+
+.media > .pull-right {
+  margin-left: 10px;
+}
+
+.media-list {
+  margin-left: 0;
+  list-style: none;
+}
+
+.label,
+.badge {
+  display: inline-block;
+  padding: 2px 4px;
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding-right: 9px;
+  padding-left: 9px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+.label:empty,
+.badge:empty {
+  display: none;
+}
+
+a.label:hover,
+a.label:focus,
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+
+.carousel-inner > .active {
+  left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel-inner > .next {
+  left: 100%;
+}
+
+.carousel-inner > .prev {
+  left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+
+.carousel-inner > .active.left {
+  left: -100%;
+}
+
+.carousel-inner > .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-indicators {
+  position: absolute;
+  top: 15px;
+  right: 15px;
+  z-index: 5;
+  margin: 0;
+  list-style: none;
+}
+
+.carousel-indicators li {
+  display: block;
+  float: left;
+  width: 10px;
+  height: 10px;
+  margin-left: 5px;
+  text-indent: -999px;
+  background-color: #ccc;
+  background-color: rgba(255, 255, 255, 0.25);
+  border-radius: 5px;
+}
+
+.carousel-indicators .active {
+  background-color: #fff;
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit li {
+  line-height: 30px;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.min.css b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.min.css
new file mode 100644
index 0000000..c10c7f4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.css b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.css
new file mode 100644
index 0000000..fcd72f7
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+@-ms-viewport {
+  width: device-width;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+.visible-print {
+  display: none !important;
+}
+
+@media print {
+  .visible-print {
+    display: inherit !important;
+  }
+  .hidden-print {
+    display: none !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.564102564102564%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.7624309392265194%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .uneditable-input[class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="offset"]:first-child {
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade {
+    top: -100px;
+  }
+  .modal.fade.in {
+    top: 20px;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .media .pull-left,
+  .media .pull-right {
+    display: block;
+    float: none;
+    margin-bottom: 10px;
+  }
+  .media-object {
+    margin-right: 0;
+    margin-left: 0;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .nav > li > a:focus,
+  .nav-collapse .dropdown-menu a:hover,
+  .nav-collapse .dropdown-menu a:focus {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a,
+  .navbar-inverse .nav-collapse .dropdown-menu a {
+    color: #999999;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .nav > li > a:focus,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: none;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .open > .dropdown-menu {
+    display: block;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.min.css b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..d1b7f4b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/add_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/add_B.gif
new file mode 100644
index 0000000..b8aed96
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/add_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/best_sellers.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/best_sellers.gif
new file mode 100644
index 0000000..25dc936
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/best_sellers.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/checkout_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/checkout_B.gif
new file mode 100644
index 0000000..fd793e6
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/checkout_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/display_last_order_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/display_last_order_B.gif
new file mode 100644
index 0000000..569cb83
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/display_last_order_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings.png b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings.png differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings-white.png b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/glyphicons-halflings-white.png differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/home_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/home_B.gif
new file mode 100644
index 0000000..972c356
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/home_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale.png b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale.png
new file mode 100644
index 0000000..3500f6c
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale.png differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale-aws.png b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale-aws.png
new file mode 100644
index 0000000..069cadd
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/logo-CloudScale-aws.png differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/order_status_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/order_status_B.gif
new file mode 100644
index 0000000..91c3ffc
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/order_status_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/refresh_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/refresh_B.gif
new file mode 100644
index 0000000..944aab6
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/refresh_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/search_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/search_B.gif
new file mode 100644
index 0000000..b2f115e
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/search_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/shopping_cart_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/shopping_cart_B.gif
new file mode 100644
index 0000000..d68076f
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/shopping_cart_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/submit_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/submit_B.gif
new file mode 100644
index 0000000..a3e3b71
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/submit_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/tpclogo.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/tpclogo.gif
new file mode 100644
index 0000000..f0fde9d
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/tpclogo.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/update_B.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/update_B.gif
new file mode 100644
index 0000000..584a852
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/update_B.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/whats_new.gif b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/whats_new.gif
new file mode 100644
index 0000000..892c02a
Binary files /dev/null and b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/img/whats_new.gif differ
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.js b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.js
new file mode 100644
index 0000000..c298ee4
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.js
@@ -0,0 +1,2276 @@
+/* ===================================================
+ * bootstrap-transition.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+   * ======================================================= */
+
+  $(function () {
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-alert.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.alert
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT NO CONFLICT
+  * ================= */
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-button.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.button
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON NO CONFLICT
+  * ================== */
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    $btn.button('toggle')
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-carousel.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options = options
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      if (this.interval) clearInterval(this.interval);
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , getActiveIndex: function () {
+      this.$active = this.$element.find('.item.active')
+      this.$items = this.$active.parent().children()
+      return this.$items.index(this.$active)
+    }
+
+  , to: function (pos) {
+      var activeIndex = this.getActiveIndex()
+        , that = this
+
+      if (pos > (this.$items.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activeIndex == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle(true)
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      e = $.Event('slide', {
+        relatedTarget: $next[0]
+      , direction: direction
+      })
+
+      if ($next.hasClass('active')) return
+
+      if (this.$indicators.length) {
+        this.$indicators.find('.active').removeClass('active')
+        this.$element.one('slid', function () {
+          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+          $nextIndicator && $nextIndicator.addClass('active')
+        })
+      }
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.carousel
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL NO CONFLICT
+  * ==================== */
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var $this = $(this), href
+      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      , options = $.extend({}, $target.data(), $this.data())
+      , slideIndex
+
+    $target.carousel(options)
+
+    if (slideIndex = $this.attr('data-slide-to')) {
+      $target.data('carousel').pause().to(slideIndex).cycle()
+    }
+
+    e.preventDefault()
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-collapse.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning || this.$element.hasClass('in')) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning || !this.$element.hasClass('in')) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSE PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.collapse
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSE NO CONFLICT
+  * ==================== */
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+ /* COLLAPSE DATA-API
+  * ================= */
+
+  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+    var $this = $(this), href
+      , target = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+      , option = $(target).data('collapse') ? 'toggle' : $this.data()
+    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    $(target).collapse(option)
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-dropdown.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+      }
+
+      $this.focus()
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) {
+        if (e.which == 27) $parent.find(toggle).focus()
+        return $this.click()
+      }
+
+      $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    $(toggle).each(function () {
+      getParent($(this)).removeClass('open')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = selector && $(selector)
+
+    if (!$parent || !$parent.length) $parent = $this.parent()
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+  * ==================== */
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(document)
+    .on('click.dropdown.data-api', clearMenus)
+    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.dropdown-menu', function (e) { e.stopPropagation() })
+    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
+/* =========================================================
+ * bootstrap-modal.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element.show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
+            that.$element.focus().trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function () {
+        var that = this
+        this.$element.hide()
+        this.backdrop(function () {
+          that.removeBackdrop()
+          that.$element.trigger('hidden')
+        })
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop && this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          this.$backdrop.click(
+            this.options.backdrop == 'static' ?
+              $.proxy(this.$element[0].focus, this.$element[0])
+            : $.proxy(this.hide, this)
+          )
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          if (!callback) return
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.modal
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL NO CONFLICT
+  * ================= */
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+      , href = $this.attr('href')
+      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
+
+    e.preventDefault()
+
+    $target
+      .modal(option)
+      .one('hide', function () {
+        $this.focus()
+      })
+  })
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-tooltip.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+        , triggers
+        , trigger
+        , i
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      triggers = this.options.trigger.split(' ')
+
+      for (i = triggers.length; i--;) {
+        trigger = triggers[i]
+        if (trigger == 'click') {
+          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+        } else if (trigger != 'manual') {
+          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+        }
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var defaults = $.fn[this.type].defaults
+        , options = {}
+        , self
+
+      this._options && $.each(this._options, function (key, value) {
+        if (defaults[key] != value) options[key] = value
+      }, this)
+
+      self = $(e.currentTarget)[this.type](options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+        , e = $.Event('show')
+
+      if (this.hasContent() && this.enabled) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        $tip
+          .detach()
+          .css({ top: 0, left: 0, display: 'block' })
+
+        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+        pos = this.getPosition()
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        this.applyPlacement(tp, placement)
+        this.$element.trigger('shown')
+      }
+    }
+
+  , applyPlacement: function(offset, placement){
+      var $tip = this.tip()
+        , width = $tip[0].offsetWidth
+        , height = $tip[0].offsetHeight
+        , actualWidth
+        , actualHeight
+        , delta
+        , replace
+
+      $tip
+        .offset(offset)
+        .addClass(placement)
+        .addClass('in')
+
+      actualWidth = $tip[0].offsetWidth
+      actualHeight = $tip[0].offsetHeight
+
+      if (placement == 'top' && actualHeight != height) {
+        offset.top = offset.top + height - actualHeight
+        replace = true
+      }
+
+      if (placement == 'bottom' || placement == 'top') {
+        delta = 0
+
+        if (offset.left < 0){
+          delta = offset.left * -2
+          offset.left = 0
+          $tip.offset(offset)
+          actualWidth = $tip[0].offsetWidth
+          actualHeight = $tip[0].offsetHeight
+        }
+
+        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+      } else {
+        this.replaceArrow(actualHeight - height, actualHeight, 'top')
+      }
+
+      if (replace) $tip.offset(offset)
+    }
+
+  , replaceArrow: function(delta, dimension, position){
+      this
+        .arrow()
+        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+        , e = $.Event('hide')
+
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).detach()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.detach()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.detach()
+
+      this.$element.trigger('hidden')
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function () {
+      var el = this.$element[0]
+      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+        width: el.offsetWidth
+      , height: el.offsetHeight
+      }, this.$element.offset())
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , arrow: function(){
+      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function (e) {
+      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
+      self.tip().hasClass('in') ? self.hide() : self.show()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover focus'
+  , title: ''
+  , delay: 0
+  , html: false
+  , container: false
+  }
+
+
+ /* TOOLTIP NO CONFLICT
+  * =================== */
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-popover.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+        || $e.attr('data-content')
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.popover
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+ /* POPOVER NO CONFLICT
+  * =================== */
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-scrollspy.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY NO CONFLICT
+  * ===================== */
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);/* ========================================================
+ * bootstrap-tab.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active:last a')[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+  * =============== */
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-typeahead.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.source = this.options.source
+    this.$menu = $(this.options.menu)
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.position(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu
+        .insertAfter(this.$element)
+        .css({
+          top: pos.top + pos.height
+        , left: pos.left
+        })
+        .show()
+
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('focus',    $.proxy(this.focus, this))
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if (this.eventSupported('keydown')) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
+    }
+
+  , eventSupported: function(eventName) {
+      var isSupported = eventName in this.$element
+      if (!isSupported) {
+        this.$element.setAttribute(eventName, 'return;')
+        isSupported = typeof this.$element[eventName] === 'function'
+      }
+      return isSupported
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+        case 16: // shift
+        case 17: // ctrl
+        case 18: // alt
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , focus: function (e) {
+      this.focused = true
+    }
+
+  , blur: function (e) {
+      this.focused = false
+      if (!this.mousedover && this.shown) this.hide()
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+      this.$element.focus()
+    }
+
+  , mouseenter: function (e) {
+      this.mousedover = true
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  , mouseleave: function (e) {
+      this.mousedover = false
+      if (!this.focused && this.shown) this.hide()
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  var old = $.fn.typeahead
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /* TYPEAHEAD NO CONFLICT
+  * =================== */
+
+  $.fn.typeahead.noConflict = function () {
+    $.fn.typeahead = old
+    return this
+  }
+
+
+ /* TYPEAHEAD DATA-API
+  * ================== */
+
+  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+    var $this = $(this)
+    if ($this.data('typeahead')) return
+    $this.typeahead($this.data())
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window)
+      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.affix
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX NO CONFLICT
+  * ================= */
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.min.js b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.min.js
new file mode 100644
index 0000000..95c5ac5
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/resources/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
new file mode 100644
index 0000000..7e780e1
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<!-- DispatcherServlet Context: defines this servlet's request-processing 
+		infrastructure -->
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<annotation-driven />
+
+	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
+		up static resources in the ${webappRoot}/resources directory -->
+	<resources mapping="/resources/**" location="/resources/" />
+
+	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
+		in the /WEB-INF/views directory -->
+	<beans:bean id="templateResolver"
+		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="suffix" value=".html" />
+		<beans:property name="templateMode" value="HTML5" />
+	</beans:bean>
+
+	<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+		<beans:property name="templateResolver" ref="templateResolver" />
+		<beans:property name="additionalDialects">
+			<beans:set>
+				<beans:bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
+			</beans:set>
+		</beans:property>
+	</beans:bean>
+
+	<beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+		<beans:property name="templateEngine" ref="templateEngine" />
+		<beans:property name="order" value="1" />
+	</beans:bean>
+
+	<beans:bean
+		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="order" value="2" />
+		<beans:property name="suffix" value=".html" />
+	</beans:bean>
+
+	<beans:bean name="main" class="org.thymeleaf.spring3.view.ThymeleafView">
+		<beans:property name="staticVariables">
+			<beans:map>
+				<beans:entry key="footer" value="Some company: &lt;b&gt;ACME&lt;/b&gt;" />
+			</beans:map>
+		</beans:property>
+	</beans:bean>
+
+	<context:component-scan base-package="eu.cloudscale.showcase.servlets" />
+
+</beans:beans>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/root-context.xml b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/root-context.xml
new file mode 100644
index 0000000..9cbb4aa
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/spring/root-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<!-- Root Context: defines shared resources visible to all other web components -->
+	<import resource="classpath:app-context.xml" />
+</beans>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/best-sellers.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/best-sellers.html
new file mode 100644
index 0000000..09896ec
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/best-sellers.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Best sellers</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+<!-- 					<td th:text="${item}"></td> -->
+					<td th:text="${item[2] + ' ' + item[3]}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item[0]} + '' + ${productUrl}}" th:text="${item[1]}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy.html
new file mode 100644
index 0000000..e98eca9
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="container-narrow">
+		<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="${error}"></div>
+		</div>
+		<div th:unless="${!errors.isEmpty()}">
+			<form th:action="@{/buy-confirm(C_ID=${customer.CId})}" method="get">
+				<div class="billing-info">
+					<h2>Billing information:</h2>
+					<table>
+						<tr>
+							<td>Firstname:</td>
+							<td th:text="${customer.CFname}"></td>
+						</tr>
+						<tr>
+							<td>Lastname:</td>
+							<td th:text="${customer.CLname}"></td>
+						</tr>
+					</table>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street2:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet2}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrCity}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrState}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrZip}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.country.coName}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Email</div>
+					<div class="pull-left content" th:text="${customer.CEmail}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Phone:</div>
+					<div class="pull-left content" th:text="${customer.CPhone}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+				</div>
+				<hr />
+				<div class="shipping-info">
+					<h2>Shipping information:</h2>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content">
+						<input type="text" name="street1" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street 2:</div>
+					<div class="pull-left content">
+						<input type="text" name="street2" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content">
+						<input type="text" name="city" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content">
+						<input type="text" name="state" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content">
+						<input type="text" name="zip" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content">
+						<input type="text" name="country" />
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<div class="clearfix"></div>
+				<hr />
+				<h2>Order information:</h2>
+				<div>
+					<table class="table">
+						<thead>
+							<tr>
+								<th>OTY</th>
+								<th>Product</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr th:each="line, i : ${cart.shoppingCartLines}">
+								<td th:text="${line.sclQty}"></td>
+								<td>Title: <i th:text="${line.item.ITitle}"></i> - Backing:
+									<span th:text="${line.item.IBacking}"></span><br /> SRP. $<span
+									th:text="${line.item.ISrp}"></span> <span style="color: red;"><strong>Your
+											Price: <span th:text="${line.item.ICost}"></span>
+									</strong></span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+				<div>
+					Subtotal width discount (0.0%): $<span th:text="${subTotal}"></span><br />
+					Tax:<br /> Shipping and Handling: <br /> Total: $<span
+						th:text="${subTotal}"></span><br />
+				</div>
+				<hr />
+				<div class="payment">
+					<div class="pull-left myLabel">CreditCartType</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Visa" checked="checked" />Visa&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="MasterCard" />MasterCard&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Discover" />Discover&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Amex" />American Express&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Diners" />Diners&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Name on Credit Card</div>
+					<div class="pull-left content">
+						<input name="CC_NAME" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Number</div>
+					<div class="pull-left content">
+						<input name="CC_NUMBER" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Expiration Date
+						(mm/dd/yyyy)</div>
+					<div class="pull-left content">
+						<input name="CC_EXPIRY" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Shipping method</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="AIR" checked="checked" />AIR&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="UPS" />UPS&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="FEDEX" />FEDEX&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="SHIP" />SHIP&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="COURIER" />COURIER&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="MAIL" />MAIL&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<input th:if="${cart}" th:value="${cart.scId}" type="hidden"
+					name="SHOPPING_ID" /> <input th:if="${customer}"
+					th:value="${customer.CId}" type="hidden" name="C_ID" /> <input
+					class="btn btn-primary" type="submit" value="Submit" />
+			</form>
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy-confirm.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy-confirm.html
new file mode 100644
index 0000000..680b1d3
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/buy-confirm.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy confirm</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}">
+		</div>
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<h2 align="center">Buy confirm</h2>
+		<h2>Order information:</h2>
+		<table class="table">
+			<thead>
+				<tr>
+					<th>
+						QTY
+					</th>
+					<th>
+						Product
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="line : ${results.cart.shoppingCartLines}">
+					<td th:text="${line.sclQty}">
+					</td>
+					<td>
+						Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+						<span th:text="${line.item.IBacking}"></span><br />
+						SRP. $<span th:text="${line.item.ISrp}"></span>
+						<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+		<h2>Your order has been processed</h2>
+		<div class="pull-left myLabel">
+			Subtotal with discount:
+		</div>
+		<div class="pull-left content" th:text="${scSubTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Tax (8.25%):
+		</div>
+		<div class="pull-left content" th:text="${scTax}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Shipping and Handling:
+		</div>
+		<div class="pull-left content" th:text="${scShipCost}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Total:
+		</div>
+		<div class="pull-left content" th:text="${scTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<h2>Order Number: <span th:text="${results.order.OId}"></span></h2>
+		<h1>Thank you for shopping at TPC-W</h1>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/customer-registration.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/customer-registration.html
new file mode 100644
index 0000000..d15b5ee
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/customer-registration.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Customer registration</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<h2 align="center">Customer registration</h2>
+	<form th:action="@{'/buy;jsessionid=' + ${sessionId}}" method="get">
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="Y" checked="checked" />I am existing user
+			</label>
+		</div>
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="N" />I am a first time customer
+			</label>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are an existing customer, enter your username and password:</strong><br/>
+			<br />
+			<fieldset>
+				<label>
+					Username:
+				</label>
+				<input name="username" type="text" />
+				<label>
+					Password:
+				</label>
+				<input name="password" type="password" />
+			</fieldset>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are a first time customer, enter the details below:</strong><br />
+			<br />
+			<fieldset>
+				<label>Enter your birth date (mm/dd/yyyy):</label>
+				<input name="birthdate" />
+				<label>Enter your first name: </label>
+				<input name="fname" />
+				<label>Enter your last name: </label>
+				<input name="lname" />
+				<label>
+					Enter your address 1:
+				</label>
+				<input name="street1" />
+				<label>
+					Enter your address 2:
+				</label>
+				<input name="street2" />
+				<label>
+					Enter your City, State, Zip:
+				</label> 
+				<input name="city" placeholder="City" /> 
+				<input name="state" placeholder="State" /> 
+				<input name="zip" placeholder="Zip" />
+				<label>
+					Enter your Country: 
+				</label>
+				<input name="country" />
+				<label>
+					Enter your Phone: 
+				</label>
+				<input name="phone" />
+				<label>
+				Enter your Email: 
+				</label>
+				<input name="email" />
+				<label>
+					Special Instructions: 
+				</label>
+				<textarea name="data" rows="4" cols="65"></textarea>
+				<input th:if="${customerId}" type="hidden" th:value="${customerId}" name="C_ID" />
+				<input th:if="${shoppingId}" type="hidden" th:value="${shoppingId}" name="SHOPPING_ID" />
+			</fieldset>
+		</div>
+		<center><input type="submit" value="Submit" class="btn" /></center>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/home.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/home.html
new file mode 100644
index 0000000..607ae5b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/home.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>TPC-W</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+<!-- 	<div th:text="${welcomeMessage}"> -->
+<!-- 	</div> -->
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<div class="categories">
+		<div>
+			<div class="pull-left" style="width: 340px; text-align: center;">
+				<h3>What's new</h3>
+			</div>
+			<div class="pull-right" style="width: 260px; text-align: center;">
+				<h3>Best sellers</h3>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		<div>
+			<div class="pull-left left-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/new-products?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/new-products?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="pull-right right-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/best-sellers?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/best-sellers?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="clearfix"></div>
+		</div>		
+	</div>
+</div>
+
+</body>
+</html>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/login.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/login.html
new file mode 100644
index 0000000..f43ff9a
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/login.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>Order inquiry</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap.min.css}"/>
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap-responsive.min.css}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a href="#">Search</a></li>
+		  <li><a href="#">Shopping cart</a></li>
+		  <li><a href="#">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{/resources/img/logo-CloudScale.png}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div th:if="${errors}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}"></div>
+	</div>
+	<form action="#"  th:action="@{/login}" method="post">
+		<input type="hidden" th:value="${referer}" name="referer" />
+		<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<input class="btn" type="submit" value="Submit" />
+		</fieldset>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/new-products.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/new-products.html
new file mode 100644
index 0000000..cad7890
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/new-products.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>New products</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+				<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-display.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-display.html
new file mode 100644
index 0000000..816aa1b
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-display.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order display</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="alert alert-error" th:if="${!errors.isEmpty()}" th:each="erro : ${errors}">
+		<div th:text="${err}"></div>		
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<div th:if="${order}">
+			<p>
+				<strong>Order ID:</strong><span th:text="${order.OId}"></span>
+			</p>
+			<p>
+				<strong>Order Placed on:</strong>
+				<span th:text="${order.ODate}"></span>
+			</p>
+			<p>
+				<strong>Shipping Type:</strong>
+				<span th:text="${order.OShipType}"></span>
+			</p>
+			<p>
+				<strong>Ship date:</strong>
+				<span th:text="${order.OShipDate}"></span>
+			</p>
+			<p>
+				<strong>Order subtotal:</strong>
+				<span th:text="${order.OSubTotal}"></span>
+			</p>
+			<p>
+				<strong>Order Tax:</strong>
+				<span th:text="${order.OTax}"></span>
+			</p>
+			<p>
+				<strong>Order Total:</strong>
+				<span th:text="${order.OTotal}"></span>
+			</p>
+			
+			<div class="pull-left" style="width: 400px">
+				<strong>
+					Bill To:<br/>
+					<span th:text="${order.customer.CFname} + ' ' + ${order.customer.CLname}"></span><br />
+				</strong>
+				<br />
+				<address>
+					<span th:text="${order.addressByOShipAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrState} + ' ' + ${order.addressByOShipAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.country.coName}"></span>
+				</address>
+				<br />
+				Email: <span th:text="${order.customer.CEmail}"></span><br/>
+				Phone: <span th:text=" ${order.customer.CPhone}"></span><br/>
+				<br />
+				Order status: <span th:text="${order.OStatus}"></span><br />
+			</div>
+			<div class="pull-left">
+				<strong>
+					Ship to: 
+				</strong><br />
+				<br />
+				<address>
+					<span th:text="${order.addressByOBillAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrState} + ' ' + ${order.addressByOBillAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.country.coName}"></span><br />
+				</address>
+			</div>
+			
+			<table class="table">
+				<thead>
+					<tr>
+						<th>
+							Item #
+						</th>
+						<th>
+							Title
+						</th>
+						<th>
+							Cost
+						</th>
+						<th>
+							QTY
+						</th>
+						<th>
+							Discount
+						</th>
+						<th>
+							Comment
+						</th>
+					</tr>	
+				</thead>
+				<tbody>
+					<tr th:each="o : ${orderLines}">
+						<td th:text="${o.olId}"></td>
+						<td th:text="${o.item.ITitle}"></td>
+						<td th:text="${o.item.ICost}"></td>
+						<td th:text="${o.olQty}"></td>
+						<td th:text="${o.olDiscount}"></td>
+						<td th:text="${o.olComment}"></td>
+					</tr>
+				</tbody>
+			</table> 
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-inquiry.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-inquiry.html
new file mode 100644
index 0000000..92c91cf
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/order-inquiry.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order inquiry</title>
+  </head>
+<body>
+<div layout:fragment="content">	
+	<div>
+		<form th:action="@{/order-display}" method="get" >
+			<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<div th:if="${shoppingId}" >
+				<input type="hidden" name="SHOPPING_ID" th:value="${shoppingId}" />
+			</div>
+			<div th:if="${customerId}">
+				<input type="hidden" name="C_ID" th:value="${customerId}" />
+			</div>
+			<input class="btn" type="submit" value="Display last order" />
+		</fieldset>
+		</form>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/product_detail.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/product_detail.html
new file mode 100644
index 0000000..dfc38fb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/product_detail.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Product detail page</title>
+  </head>
+<body>
+<div layout:fragment="content">
+
+		<div class="row-fluid marketing">
+			<dl class="dl-horizontal">
+				<dt>Title</dt>
+				<dd th:text="${item.ITitle}">Title</dd>
+
+				<dt>Author</dt>
+				<dd th:text="${item.author.AFname + ' ' + item.author.ALname}">FirstName LastName</dd>
+
+				<dt>Subject</dt>
+				<dd th:text="${item.ISubject}">Subject</dd>
+				
+				<dt>Description</dt>
+				<dd th:text="${item.IDesc}">Description</dd>
+			    
+			    <dt>Suggested Retail Price</dt>
+			    <dd th:text="${item.ISrp}">Suggested Retail Price</dd>
+			    
+			    <dt>Our Price</dt>
+			    <dd th:text="${item.ICost}">Our Price</dd>
+			    
+			    <dt>You save</dt>
+			    <dd th:with="savings=(${item.ISrp} - ${item.ICost})" 
+			         th:text="${#strings.indexOf(savings, '.') == -1} ? ${savings} : ${#strings.substring(savings, 0, #strings.indexOf(savings, '.')+3)}">You save</dd>
+			    
+			    <dt>Backing</dt>
+			    <dd><span th:text="${item.IBacking}">Item Backing</span><span th:text="${item.IPage}">Item page</span></dd>
+			    
+			    <dt>Published by</dt>
+			    <dd th:text="${item.IPublisher}">Publisher</dd>
+			    
+			    <dt>Publication date</dt>
+			    <dd th:text="${item.IPubDate}">Pub date</dd>
+			    
+			    <dt>Avail date</dt>
+			    <dd th:text="${item.IAvail}">Avail date</dd>
+			    
+			    <dt>Dimensions</dt>
+			    <dd th:text="${item.IDimension}">Dimensions</dd>
+			    
+			    <dt>ISBN</dt>
+			    <dd th:text="${item.IIsbn}">ISBN</dd>
+			</dl>
+		</div>
+		<div>
+			<a class="btn" th:href="@{${addToShoppingCartUrl}}">Add to cart</a>
+			&nbsp;<a class="btn" href="#">Update</a>
+			
+		</div>
+	</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/search.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/search.html
new file mode 100644
index 0000000..b412687
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/search.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Search</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<form method="get">
+	Search by: 
+	<select name="searchField">
+		<option value="author">
+			Author
+		</option>
+		<option value="title">
+			Title
+		</option>
+		<option value="subject">
+			Subject
+		</option>
+	</select>
+	<input type="text" name="keyword" th:value="${keyword}"/>
+	<input type="submit" value="Submit"/>
+	</form>
+	<div th:if="${results != null and not results.isEmpty()}" class="search-results">
+		<table>
+			<thead>
+				<tr>
+					<th style="width: 50px; font-weight: bold;">
+						#
+					</th>
+					<th>
+						Author
+					</th>
+					<th>
+						Title
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="item, count : ${results}">
+					<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+					<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+					</td>
+					<td>
+						<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+	<div th:unless="${ results != null and not results.isEmpty()}">
+		No results!
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/shopping-cart.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/shopping-cart.html
new file mode 100644
index 0000000..751cae9
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/shopping-cart.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Shopping cart</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${errors.isEmpty()}">
+		<div class="jumbotron">
+			<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+		</div>
+		<div class="promotional">
+			<div class="pull-left" th:each="item : ${promotional}">
+				<a th:href="@{'/product-detail?I_ID=' + ${item.IId}}">
+					<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+				</a>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		
+		<hr />
+		<div th:if="${cart.shoppingCartLines != null}">
+			<form action="" method="get">
+				<table class="table">
+					<thead>
+						<tr>
+							<th>
+								QTY
+							</th>
+							<th>
+								Product
+							</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr th:each="line, i : ${cart.shoppingCartLines}">
+							<td>
+								<input type="hidden" th:name="'I_ID_' + ${i.index}" th:value="${line.item.IId}" />
+								<input th:name="'QTY_' + ${i.index}" size="3" th:value="${line.sclQty}" />
+							</td>
+							<td>
+								Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+								<span th:text="${line.item.IBacking}"></span><br />
+								SRP. $<span th:text="${line.item.ISrp}"></span>
+								<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<strong>Subtotal: <span th:text="${subTotal}"></span></strong>
+				<div style="text-align: center">
+					<a class="btn" th:href="@{${checkoutUrl}}">Checkout</a>
+					<a class="btn" th:href="@{${homeUrl}}">Home</a>
+				</div>
+				<p style="text-align:center">
+					If you have changed the quantities and/or taken anything out<br />
+					of your shopping cart, click here to refresh your shopping cart:
+				</p>
+				<input type="hidden" name="ADD_FLAG" value="N" />
+				<input type="hidden" name="SHOPPING_ID" th:value="${cart.scId}" />
+				<input th:if="${customerId}" type="hidden" name="C_ID" th:value="${customerId}"/>
+				<input type="submit" value="Update" class="btn" />
+			</form>
+		</div>
+		<div th:unless="${cart.shoppingCartLines != null}">
+			Empty cart!
+		</div>
+		
+	</div>
+	<div th:unless="${errors.isEmpty()}">
+		<div class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="error"></div>
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/templates/layout.html b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/templates/layout.html
new file mode 100644
index 0000000..6f0319e
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/views/templates/layout.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>TPC-W</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap.min.css' }"/>
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap-responsive.min.css'}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+        
+        .footer{
+        	padding: 6px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a th:href="@{${searchUrl}}">Search</a></li>
+		  <li><a th:href="@{${shoppingCartUrl}}">Shopping cart</a></li>
+		  <li><a th:href="@{${orderInquiryUrl}}">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{${imgResourceUrl} + '/logo-CloudScale-aws.png'}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div layout:fragment="content"></div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/web.xml b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..9a82c6e
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+  <context-param>
+    <param-name>contextConfigLocation</param-name>
+    <param-value>/WEB-INF/spring/root-context.xml</param-value>
+  </context-param>
+  <listener>
+    <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class>
+  </listener>
+  <listener>
+    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+  </listener>
+  <servlet>
+    <servlet-name>appServlet</servlet-name>
+    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+    <init-param>
+      <param-name>contextConfigLocation</param-name>
+      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
+    </init-param>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>appServlet</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
+  <filter>
+    <filter-name>log4jServletFilter</filter-name>
+    <filter-class>org.apache.logging.log4j.core.web.Log4jServletFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>log4jServletFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+    <dispatcher>REQUEST</dispatcher>
+    <dispatcher>FORWARD</dispatcher>
+    <dispatcher>INCLUDE</dispatcher>
+    <dispatcher>ERROR</dispatcher>
+  </filter-mapping>
+</web-app>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/platform/generator/src/test/resources/log4j.xml b/deployment-scripts/scripts/platform/generator/src/test/resources/log4j.xml
new file mode 100644
index 0000000..b424beb
--- /dev/null
+++ b/deployment-scripts/scripts/platform/generator/src/test/resources/log4j.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appenders -->
+	<appender name="console" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
+		</layout>
+	</appender>
+	
+	<!-- Application Loggers -->
+	<logger name="eu.cloudscale.showcase">
+		<level value="info" />
+	</logger>
+	
+	<!-- 3rdparty Loggers -->
+	<logger name="org.springframework.core">
+		<level value="info" />
+	</logger>	
+	
+	<logger name="org.springframework.beans">
+		<level value="info" />
+	</logger>
+	
+	<logger name="org.springframework.context">
+		<level value="info" />
+	</logger>
+
+	<logger name="org.springframework.web">
+		<level value="info" />
+	</logger>
+
+	<!-- Root Logger -->
+	<root>
+		<priority value="info" />
+		<appender-ref ref="console" />
+	</root>
+	
+</log4j:configuration>
diff --git a/deployment-scripts/scripts/platform/mpm_worker.conf b/deployment-scripts/scripts/platform/mpm_worker.conf
new file mode 100644
index 0000000..4404ae0
--- /dev/null
+++ b/deployment-scripts/scripts/platform/mpm_worker.conf
@@ -0,0 +1,34 @@
+# worker MPM
+# StartServers: initial number of server processes to start
+# MinSpareThreads: minimum number of worker threads which are kept spare
+# MaxSpareThreads: maximum number of worker threads which are kept spare
+# ThreadLimit: ThreadsPerChild can be changed to this maximum value during a
+#			  graceful restart. ThreadLimit can only be changed by stopping
+#			  and starting Apache.
+# ThreadsPerChild: constant number of worker threads in each server process
+# MaxRequestWorkers: maximum number of threads
+# MaxConnectionsPerChild: maximum number of requests a server process serves
+
+# 8000 concurrent users
+<IfModule mpm_worker_module>
+    ServerLimit             250
+    StartServers             2
+    MinSpareThreads          25
+    MaxSpareThreads         100 
+    ThreadLimit             50 
+    ThreadsPerChild          50
+    MaxClients             1000
+    MaxRequestsPerChild   1000
+</IfModule>
+
+#<IfModule mpm_worker_module>
+#	StartServers			 2
+#	MinSpareThreads		 25
+#	MaxSpareThreads		 75
+#	ThreadLimit			 64
+#	ThreadsPerChild		 25
+#	MaxRequestWorkers	  150
+#	MaxConnectionsPerChild   0
+#</IfModule>
+
+# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
diff --git a/deployment-scripts/scripts/platform/rds-tpcw-dump-15.1.2014.sql b/deployment-scripts/scripts/platform/rds-tpcw-dump-15.1.2014.sql
new file mode 100644
index 0000000..e298304
--- /dev/null
+++ b/deployment-scripts/scripts/platform/rds-tpcw-dump-15.1.2014.sql
@@ -0,0 +1 @@
+Get it on http://cloudscale.xlab.si/github/rds-tcpw-dump-latest.sql
diff --git a/deployment-scripts/scripts/platform/server.xml b/deployment-scripts/scripts/platform/server.xml
new file mode 100644
index 0000000..f531931
--- /dev/null
+++ b/deployment-scripts/scripts/platform/server.xml
@@ -0,0 +1,149 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- Note:  A "Server" is not itself a "Container", so you may not
+     define subcomponents such as "Valves" at this level.
+     Documentation at /docs/config/server.html
+ -->
+<Server port="8005" shutdown="SHUTDOWN">
+  <!-- Security listener. Documentation at /docs/config/listeners.html
+  <Listener className="org.apache.catalina.security.SecurityListener" />
+  -->
+  <!--APR library loader. Documentation at /docs/apr.html -->
+  <!--
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  -->
+  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
+  <Listener className="org.apache.catalina.core.JasperListener" />
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+
+  <!-- Global JNDI resources
+       Documentation at /docs/jndi-resources-howto.html
+  -->
+  <GlobalNamingResources>
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users
+    -->
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+              description="User database that can be updated and saved"
+              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+              pathname="conf/tomcat-users.xml" />
+  </GlobalNamingResources>
+
+  <!-- A "Service" is a collection of one or more "Connectors" that share
+       a single "Container" Note:  A "Service" is not itself a "Container",
+       so you may not define subcomponents such as "Valves" at this level.
+       Documentation at /docs/config/service.html
+   -->
+  <Service name="Catalina">
+
+    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
+    <!--
+    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
+        maxThreads="150" minSpareThreads="4"/>
+    -->
+
+
+    <!-- A "Connector" represents an endpoint by which requests are received
+         and responses are returned. Documentation at :
+         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
+         Java AJP  Connector: /docs/config/ajp.html
+         APR (HTTP/AJP) Connector: /docs/apr.html
+         Define a non-SSL HTTP/1.1 Connector on port 8080
+    -->
+    <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               URIEncoding="UTF-8"
+		maxThreads="2000"
+		acceptCount="1000"
+               redirectPort="8443" />
+    <!-- A "Connector" using the shared thread pool-->
+    <!--
+    <Connector executor="tomcatThreadPool"
+               port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443" />
+    -->
+    <!-- Define a SSL HTTP/1.1 Connector on port 8443
+         This connector uses the JSSE configuration, when using APR, the
+         connector should be using the OpenSSL style configuration
+         described in the APR documentation -->
+    <!--
+    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
+               maxThreads="150" scheme="https" secure="true"
+               clientAuth="false" sslProtocol="TLS" />
+    -->
+
+    <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <!--
+    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
+    -->
+
+
+    <!-- An Engine represents the entry point (within Catalina) that processes
+         every request.  The Engine implementation for Tomcat stand alone
+         analyzes the HTTP headers included with the request, and passes them
+         on to the appropriate Host (virtual host).
+         Documentation at /docs/config/engine.html -->
+
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
+    -->
+    <Engine name="Catalina" defaultHost="localhost">
+
+      <!--For clustering, please take a look at documentation at:
+          /docs/cluster-howto.html  (simple how to)
+          /docs/config/cluster.html (reference documentation) -->
+      <!--
+      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
+      -->
+
+      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
+           via a brute-force attack -->
+      <Realm className="org.apache.catalina.realm.LockOutRealm">
+        <!-- This Realm uses the UserDatabase configured in the global JNDI
+             resources under the key "UserDatabase".  Any edits
+             that are performed against this UserDatabase are immediately
+             available for use by the Realm.  -->
+        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+               resourceName="UserDatabase"/>
+      </Realm>
+
+      <Host name="localhost"  appBase="webapps"
+            unpackWARs="true" autoDeploy="true">
+
+        <!-- SingleSignOn valve, share authentication between web applications
+             Documentation at: /docs/config/valve.html -->
+        <!--
+        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
+        -->
+
+        <!-- Access log processes all example.
+             Documentation at: /docs/config/valve.html
+             Note: The pattern used is equivalent to using pattern="common" -->
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+               prefix="localhost_access_log." suffix=".txt"
+               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
+
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/deployment-scripts/scripts/software/__init__.py b/deployment-scripts/scripts/software/__init__.py
new file mode 100644
index 0000000..8f76346
--- /dev/null
+++ b/deployment-scripts/scripts/software/__init__.py
@@ -0,0 +1 @@
+__author__ = 'ivansek'
diff --git a/deployment-scripts/scripts/software/check-running-showcase_instances.py b/deployment-scripts/scripts/software/check-running-showcase_instances.py
new file mode 100644
index 0000000..231d6c0
--- /dev/null
+++ b/deployment-scripts/scripts/software/check-running-showcase_instances.py
@@ -0,0 +1,78 @@
+import subprocess
+from novaclient.v1_1 import client as novaclient
+import time
+import boto
+
+
+def read_config(config_file):
+    cfg = boto.Config()
+    cfg.load_from_path(config_file)
+    return cfg
+
+
+class Checker:
+    def __init__(self):
+        self.cfg = read_config('config.ini')
+
+        self.user = self.cfg.get('OPENSTACK', 'username')
+        self.pwd = self.cfg.get('OPENSTACK', 'password')
+        self.url = self.cfg.get('OPENSTACK', 'auth_url')
+        self.tenant = self.cfg.get('OPENSTACK', 'tenant_name')
+
+        self.nc = novaclient.Client(self.user, self.pwd, self.tenant, auth_url=self.url)
+
+        self.showcase_server_ips = []
+
+        while True:
+            self.check()
+            time.sleep(5)
+
+    def get_ip(self, server):
+        for address in server.addresses['private']:
+            if address['OS-EXT-IPS:type'] == 'fixed':
+                server_ip = address['addr']
+                break
+        else:
+            server_ip = None
+            print "Error: can not get IP address of this server"
+        return server_ip
+
+    def check(self):
+        running_server_ips = []
+        new_server_ips = []
+
+        servers = self.nc.servers.findall(name='cloudscale-sc')
+        ps = {}
+        for server in servers:
+            if server.status == 'ACTIVE':
+                server_ip = self.get_ip(server)
+                if server_ip in self.showcase_server_ips:
+                    running_server_ips.append(server_ip)
+                else:
+                    new_server_ips.append(server_ip)
+                    ps[server_ip] = subprocess.Popen('curl -I --silent %s > /dev/null' % server_ip, shell=True)
+        for server_ip in new_server_ips:
+            ps[server_ip].wait()
+            if ps[server_ip].returncode == 0:
+                running_server_ips.append(server_ip)
+
+        if not set(self.showcase_server_ips) == set(running_server_ips):
+            self.showcase_server_ips = running_server_ips
+            self.update_config()
+            self.reload_haproxy()
+
+    def update_config(self):
+        ha_proxy_config = open('/etc/haproxy/haproxy.cfg_NO_SERVERS', 'r').read()
+        for server_ip in self.showcase_server_ips:
+            ha_proxy_config += """
+    server %s %s:80 check""" % (server_ip, server_ip)
+        open('/etc/haproxy/haproxy.cfg', 'w').write(ha_proxy_config)
+
+    def reload_haproxy(self):
+        print "config changed... reloading haproxy"
+        ps = subprocess.Popen('service haproxy reload', shell=True)
+        ps.wait()
+
+
+if __name__ == '__main__':
+    checker = Checker()
diff --git a/deployment-scripts/scripts/software/cloudscale-apache-virtualhost.conf b/deployment-scripts/scripts/software/cloudscale-apache-virtualhost.conf
new file mode 100644
index 0000000..f099cfd
--- /dev/null
+++ b/deployment-scripts/scripts/software/cloudscale-apache-virtualhost.conf
@@ -0,0 +1,14 @@
+<VirtualHost *:80>
+    ProxyPreserveHost On
+    # showcase-1-a (MySQL)
+    ProxyPass /showcase-1-a http://localhost:8080/showcase-1-a
+    ProxyPassReverse /showcase-1-a http://localhost:8080/showcase-1-a
+
+    # showcase-1-b (noSQL)
+    ProxyPass /showcase-1-b http://localhost:8080/showcase-1-b
+    ProxyPassReverse /showcase-1-b http://localhost:8080/showcase-1-b
+
+    # showcase-0
+    ProxyPass /showcase-0 http://localhost:8080/showcase-0
+    ProxyPassReverse /showcase-0 http://localhost:8080/showcase-0
+</VirtualHost>
diff --git a/deployment-scripts/scripts/software/cloudscale-vm-setup.sh b/deployment-scripts/scripts/software/cloudscale-vm-setup.sh
new file mode 100644
index 0000000..94ccee6
--- /dev/null
+++ b/deployment-scripts/scripts/software/cloudscale-vm-setup.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+sudo apt-get install -y zip tomcat7 apache2 openjdk-7-jdk
+echo deb http://apt.newrelic.com/debian/ newrelic non-free >> /etc/apt/sources.list.d/newrelic.list > /tmp/newrelic.list
+sudo cp /tmp/newrelic.list /etc/apt/sources.list.d/
+wget -O- https://download.newrelic.com/548C16BF.gpg
+sudo apt-key add 548C16BF.gpg
+sudo apt-get update
+sudo apt-get install newrelic-sysmond
+nrsysmond-config --set license_key=b71feb62bff6540111597c79259d1f28051af3be
+sudo /etc/init.d/newrelic-sysmond start
+sudo a2enmod proxy
+sudo cp cloudscale.conf /etc/apache2/sites-available/
+sudo a2ensite cloudscale
+sudo /etc/init.d/apache2 restart
+sudo /etc/init.d/tomcat7 restart
diff --git a/deployment-scripts/scripts/software/deploy_showcase.py b/deployment-scripts/scripts/software/deploy_showcase.py
new file mode 100644
index 0000000..a51d47c
--- /dev/null
+++ b/deployment-scripts/scripts/software/deploy_showcase.py
@@ -0,0 +1,139 @@
+import logging
+import time
+import paramiko
+import ConfigParser
+import sys, os
+import subprocess
+import requests
+import select
+from scripts.common.Cloudscale import *
+from webservice.settings import BASE_DIR
+
+
+class DeploySoftware:
+
+    def __init__(self, config, logger):
+        self.logger=logger
+        self.cfg = config.cfg
+        self.config = config
+        self.file_path = "/".join(os.path.abspath(__file__).split('/')[:-1])
+        self.ip_addresses = self.cfg.get('infrastructure', 'ip_address').split(",")
+        self.mysql_version = '%s/showcase/target/showcase-1.0.0-BUILD-SNAPSHOT.war' % str(os.path.sep).join(os.path.abspath(__file__).split(os.path.sep)[:-1])
+        self.nosql_version = self.cfg.get('sofware', 'nosql_war_path')
+        self.remote_user = self.cfg.get('infrastructure', 'remote_user')
+        self.key_pair = self.cfg.get('EC2', 'key_pair')
+        self.remote_deploy_path = self.cfg.get('software', 'remote_deploy_path')
+        self.write_db_config()
+        self.compile()
+        self.deploy_software()
+
+    def write_db_config(self):
+        path = os.path.abspath(self.file_path + '/showcase/src/main/resources/database/database.aws.hibernate.properties')
+        f = open(path, 'w')
+        f.write('jdbc.dbtype=mysql\n')
+
+        if int(self.cfg.get('RDS', 'num_replicas')) > 0:
+            f.write('jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver\n')
+            f.write('jdbc.url=jdbc:mysql:replication://%s/%s\n' % (self.cfg.get('platform', 'urls'), self.cfg.get('RDS', 'database_name')))
+        else:
+            f.write('jdbc.driverClassName=com.mysql.jdbc.Driver\n')
+            f.write('jdbc.url=jdbc:mysql://%s/%s\n' % (self.cfg.get('platform', 'urls'), self.cfg.get('RDS', 'database_name')))
+
+        f.write('jdbc.username=%s\n' % self.cfg.get('RDS', 'database_user'))
+        f.write('jdbc.password=%s\n' % self.cfg.get('RDS', 'database_pass'))
+        f.write('jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect\n')
+        f.close()
+
+    def compile(self):
+        self.logger.log('Compiling showcase ...')
+        cmd = 'cd ' + self.file_path + '/showcase;/usr/bin/mvn -Pamazon-hibernate -Dconnection_pool_size=' + self.config.db.get('connection_pool_size') + ' install '
+        self.logger.log(msg=cmd, level=logging.DEBUG)
+        #subprocess.check_output(cmd)
+        ps = subprocess.Popen(cmd, shell=True)
+        ps.wait()
+        self.logger.log('Compiled')
+
+
+    def deploy_software(self):
+        for ip_address in self.ip_addresses:
+            if sys.platform == 'win32':
+                self.windows_shell(ip_address);
+            else:
+                self.unix_shell(ip_address)
+
+    def windows_shell(self,ip_address):
+        raise Exception('Not implemented for Windows platform!')
+
+    def unix_shell(self, ip_address):
+        try:
+            self.logger.log("Deploying showcase on " + ip_address)
+            self.logger.log("This may take a while. Please wait ...")
+            time.sleep(60)
+            paramiko.util.log_to_file('paramiko.log')
+            ssh = paramiko.SSHClient()
+            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+            if self.key_pair:
+                ssh.connect(ip_address, username=self.remote_user, key_filename=self.key_pair)
+            else:
+                ssh.connect(ip_address, username=self.remote_user)
+
+            scp = paramiko.SFTPClient.from_transport(ssh.get_transport())
+            scp.put(self.mysql_version, 'showcase-1-a.war')
+            #scp.put(self.nosql_version, 'showcase-1-b.jar')
+
+            _, stdout, _ = ssh.exec_command("sudo unzip -o showcase-1-a.war -d showcase-1-a")
+            while not stdout.channel.exit_status_ready():
+            # Only print data if there is data to read in the channel
+                if stdout.channel.recv_ready():
+                    rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
+                    if len(rl) > 0:
+                        # Print data from stdout
+                        self.logger.log(msg=stdout.channel.recv(1024), level=logging.DEBUG)
+
+            _, stdout, _ = ssh.exec_command("sudo cp -r showcase-1-a /var/lib/tomcat7/webapps/")
+            while not stdout.channel.exit_status_ready():
+                # Only print data if there is data to read in the channel
+                if stdout.channel.recv_ready():
+                    rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
+                    if len(rl) > 0:
+                    # Print data from stdout
+                        self.logger.log(msg=stdout.channel.recv(1024), level=logging.DEBUG)
+
+            _, stdout, _ = ssh.exec_command("sudo /etc/init.d/tomcat7 restart")
+            while not stdout.channel.exit_status_ready():
+                # Only print data if there is data to read in the channel
+                if stdout.channel.recv_ready():
+                    rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
+                    if len(rl) > 0:
+                    # Print data from stdout
+                        self.logger.log(msg=stdout.channel.recv(1024), level=logging.DEBUG)
+
+            time.sleep(60)
+
+            # if not self.check(ip_address):
+            #     ssh.exec_command("sudo /etc/init.d/tomcat7 restart")
+            ssh.close()
+            scp.close()
+            self.logger.log("Successfully finished installation")
+        except Exception as e:
+            raise e
+
+    def check(self, ip_address):
+        r = requests.get('http://%s/showcase-1-a' % ip_address)
+        return r.status_code == 200
+
+    def parse_config_file(self, config_file):
+        f = open(config_file, 'r')
+        ip_addresses = []
+        for line in f.readlines():
+            ip_addresses.append(line)
+        return ip_addresses
+
+
+
+if __name__ == '__main__':
+    check_args(1, "<config_path>")
+    config_file, cfg, key_name, key_pair = parse_args()
+
+    DeploySoftware(config_file, cfg, key_name, key_pair)
diff --git a/deployment-scripts/scripts/software/haproxy.cfg b/deployment-scripts/scripts/software/haproxy.cfg
new file mode 100644
index 0000000..5ec33bc
--- /dev/null
+++ b/deployment-scripts/scripts/software/haproxy.cfg
@@ -0,0 +1,35 @@
+global
+	log 127.0.0.1	local0
+	log 127.0.0.1	local1 notice
+	#log loghost	local0 info
+	maxconn 4096
+	user haproxy
+	group haproxy
+	daemon
+
+defaults
+	log	global
+	mode	http
+	option	httplog
+	option	dontlognull
+	option redispatch
+	maxconn	20000
+	contimeout	5000
+	clitimeout	50000
+	srvtimeout	50000
+
+	errorfile	400	/etc/haproxy/errors/400.http
+	errorfile	403	/etc/haproxy/errors/403.http
+	errorfile	408	/etc/haproxy/errors/408.http
+	errorfile	500	/etc/haproxy/errors/500.http
+	errorfile	502	/etc/haproxy/errors/502.http
+	errorfile	503	/etc/haproxy/errors/503.http
+	errorfile	504	/etc/haproxy/errors/504.http
+
+
+listen showcase *:80
+    option forwardfor
+    option httpchk
+    balance roundrobin
+
+	# --- SERVERS --- #
diff --git a/deployment-scripts/scripts/software/install-apache-tomcat.sh b/deployment-scripts/scripts/software/install-apache-tomcat.sh
new file mode 100644
index 0000000..cd47902
--- /dev/null
+++ b/deployment-scripts/scripts/software/install-apache-tomcat.sh
@@ -0,0 +1,35 @@
+
+echo "NOTE: installing apache tomcat"
+sudo apt-get update
+sudo apt-get install -y zip tomcat7 apache2 openjdk-7-jdk
+
+sudo sed -i 's/^securerandom.source=file:\/dev\/urandom$/securerandom.source=file\:\/dev\/.\/urandom/' /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/security/java.security
+sudo sed -i 's/^JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"$/JAVA_OPTS="-Djava.awt.headless=true -Xmx2024m -XX:+UseConcMarkSweepGC"/' /etc/default/tomcat7
+echo "NOTE: stopping apache and tomcat"
+sudo /etc/init.d/apache2 stop
+sudo /etc/init.d/tomcat7 stop
+
+echo '<VirtualHost *:80>
+    ProxyPreserveHost On
+    # showcase-1-a (MySQL)
+    ProxyPass /showcase-1-a http://localhost:8080/showcase-1-a
+    ProxyPassReverse /showcase-1-a http://localhost:8080/showcase-1-a
+
+    # showcase-1-b (noSQL)
+    ProxyPass /showcase-1-b http://localhost:8080/showcase-1-b
+    ProxyPassReverse /showcase-1-b http://localhost:8080/showcase-1-b
+
+    # showcase-0
+    ProxyPass /showcase-0 http://localhost:8080/showcase-0
+    ProxyPassReverse /showcase-0 http://localhost:8080/showcase-0
+</VirtualHost>' | sudo tee /etc/apache2/sites-available/cloudscale.conf
+
+echo "NOTE: enabling proxy and apache cloudscale configuration"
+sudo a2enmod proxy_http
+sudo a2dismod mpm_event
+sudo a2enmod mpm_worker
+sudo a2dissite 000-default
+sudo a2ensite cloudscale
+
+echo "" | sudo tee --append /etc/hosts
+echo "127.0.0.1 cloudscale-sc" | sudo tee --append /etc/hosts
diff --git a/deployment-scripts/scripts/software/install-load-balancer.sh b/deployment-scripts/scripts/software/install-load-balancer.sh
new file mode 100644
index 0000000..3343d3b
--- /dev/null
+++ b/deployment-scripts/scripts/software/install-load-balancer.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+# TODO: remove this
+echo "root:root"|chpasswd
+
+
+echo "NOTE: installing load balancer and pip"
+apt-get update
+apt-get install -y haproxy python-pip
+
+pip install python-novaclient
+pip install boto
+
+echo "NOTE: enabling load balancer"
+sed -i s/'ENABLED=0'/'ENABLED=1'/ /etc/default/haproxy
+
+echo "NOTE: creating HAProxy configuration"
+cat << INCLUDE_CONFIG_FILE > /etc/haproxy/haproxy.cfg_NO_SERVERS
+#####REPLACE_ME_WITH_CONFIG#####
+INCLUDE_CONFIG_FILE
+
+cp /etc/haproxy/haproxy.cfg_NO_SERVERS /etc/haproxy/haproxy.cfg
+
+echo "NOTE: starting load balancer"
+service haproxy start
+
+
+
+base64 --decode << DECODE_ME > checker.py
+###PLACEHOLDER_FOR_checker.py###
+DECODE_ME
+
+base64 --decode << DECODE_ME > config.ini
+###PLACEHOLDER_FOR_config.ini###
+DECODE_ME
+
+
+echo "NOTE: starting script that detects showcase instances and adds them to config and reloads haproxy"
+python checker.py &
+
+
+echo "NOTE: finished"
diff --git a/deployment-scripts/scripts/software/install-mongodb.sh b/deployment-scripts/scripts/software/install-mongodb.sh
new file mode 100644
index 0000000..e16ede2
--- /dev/null
+++ b/deployment-scripts/scripts/software/install-mongodb.sh
@@ -0,0 +1,32 @@
+
+# TODO: remove this
+echo "root:root"|chpasswd
+
+
+echo "NOTE: installing mongodb"
+apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
+echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
+apt-get update
+
+apt-get install -y mongodb-org
+
+service mongod stop
+
+
+
+sed -i 's/bind_ip = 127.0.0.1/bind_ip = 0.0.0.0/g' /etc/mongod.conf
+# alternative port!
+sed -i 's/#port = 27017/port = 27037/g' /etc/mongod.conf
+
+
+
+echo "NOTE: adding passwordless sudo for user $USERNAME"
+echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/we-need-passwordless-sudo
+chmod 0440 /etc/sudoers.d/we-need-passwordless-sudo
+
+
+
+echo "NOTE: finished... will poweroff automatically"
+# deploy script has to detect when installation is finished
+sleep 5
+poweroff
diff --git a/deployment-scripts/scripts/software/install-mysql-galera.sh b/deployment-scripts/scripts/software/install-mysql-galera.sh
new file mode 100644
index 0000000..c12b074
--- /dev/null
+++ b/deployment-scripts/scripts/software/install-mysql-galera.sh
@@ -0,0 +1,17 @@
+
+# TODO: remove this
+echo "root:root"|chpasswd
+
+
+echo "NOTE: installing mysql wsrep galera"
+apt-get update
+wget https://launchpad.net/codership-mysql/5.6/5.6.16-25.5/+download/mysql-server-wsrep-5.6.16-25.5-amd64.deb
+wget https://launchpad.net/galera/3.x/25.3.5/+download/galera-25.3.5-amd64.deb
+dpkg -i mysql-server-wsrep-5.6.16-25.5-amd64.deb galera-25.3.5-amd64.deb
+apt-get -f install -y
+
+
+echo "NOTE: creating directory for mysql logs"
+mkdir -p /var/log/mysql/
+
+
diff --git a/deployment-scripts/scripts/software/install-mysql-galera-import-dump.sh b/deployment-scripts/scripts/software/install-mysql-galera-import-dump.sh
new file mode 100644
index 0000000..288d8b1
--- /dev/null
+++ b/deployment-scripts/scripts/software/install-mysql-galera-import-dump.sh
@@ -0,0 +1,52 @@
+echo "NOTE: starting mysql service"
+service mysql start --wsrep-new-cluster --wsrep_cluster_address="gcomm://"
+
+# wait for mysql to start
+RETRIES=100
+COUNTER=0
+false
+while [ $? -ne 0 ]
+do
+    #service mysql start
+    let COUNTER=COUNTER+1
+    if [ $COUNTER -gt $RETRIES ]
+    then
+        echo "ERROR: Could not connect to mysql server in $RETRIES tries!"
+        exit 1
+    fi
+    sleep 3
+    echo "NOTE: $COUNTER. try to connect to mysql server."
+    mysqladmin ping --host=127.0.0.1 > /dev/null 2>&1
+done
+echo "NOTE: Connected to mysql server"
+
+echo "NOTE: waiting for dump.sql to be uploaded"
+while [ ! -f /home/$USERNAME/finished ]
+do
+  sleep 2
+done
+
+sleep 5
+
+echo "NOTE: creating user and database"
+echo "create database $DB_NAME;" | mysql --host=127.0.0.1
+echo "grant all privileges on $DB_NAME.* to $DB_USERNAME@'%' identified by '$DB_PASSWORD';" | mysql --host=127.0.0.1
+
+
+echo "NOTE: importing dump file"
+mysql --host=127.0.0.1 $DB_NAME < /home/$USERNAME/dump.sql
+if [ $? -eq 0 ]
+then
+    echo "NOTE: dump imported successfully"
+else
+    echo "ERROR: dump import failed!"
+fi
+
+rm /home/$USERNAME/dump.sql
+
+
+
+echo "NOTE: finished... will poweroff automatically"
+# deploy script has to detect when installation is finished
+sleep 5
+poweroff
diff --git a/deployment-scripts/scripts/software/my.cnf b/deployment-scripts/scripts/software/my.cnf
new file mode 100644
index 0000000..4749dce
--- /dev/null
+++ b/deployment-scripts/scripts/software/my.cnf
@@ -0,0 +1,15 @@
+[mysqld]
+innodb_buffer_pool_size=1G
+
+bind-address=0.0.0.0
+
+binlog_format=ROW
+default-storage-engine=innodb
+innodb_autoinc_lock_mode=2
+innodb_locks_unsafe_for_binlog=1
+innodb_doublewrite=1
+query_cache_size=0
+
+wsrep_provider=/usr/lib/galera/libgalera_smm.so
+wsrep_cluster_name="galera_showcase_cluster"
+wsrep_sst_method=rsync
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/pom.xml b/deployment-scripts/scripts/software/showcase/pom.xml
new file mode 100644
index 0000000..bc14474
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/pom.xml
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>eu.cloudscale</groupId>
+	<artifactId>showcase</artifactId>
+	<name>showcase</name>
+	<packaging>war</packaging>
+	<version>1.0.0-BUILD-SNAPSHOT</version>
+	<repositories>
+		<repository>
+			<id>spring-milestone</id>
+			<name>Spring Maven MILESTONE Repository</name>
+			<url>http://repo.springsource.org/libs-milestone</url>
+		</repository>
+	</repositories>
+	<properties>
+		<org.springframework.version>3.2.1.RELEASE</org.springframework.version>
+		<log4j.version>1.2.17</log4j.version>
+	</properties>
+	<dependencies>
+		<!-- Spring -->
+
+		<!-- Logging -->
+
+		<!-- <dependency> -->
+		<!-- <groupId>javax.inject</groupId> -->
+		<!-- <artifactId>javax.inject</artifactId> -->
+		<!-- <version>1</version> -->
+		<!-- </dependency> -->
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+		<!-- Servlet -->
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet.jsp</groupId>
+			<artifactId>jsp-api</artifactId>
+			<version>2.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>jstl</artifactId>
+			<version>1.2</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-mongodb</artifactId>
+			<version>1.2.0.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.thymeleaf</groupId>
+			<artifactId>thymeleaf-spring3</artifactId>
+			<version>2.0.16</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-orm</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-beans</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-dbcp</groupId>
+			<artifactId>commons-dbcp</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.mchange</groupId>
+			<artifactId>c3p0</artifactId>
+			<version>0.9.5-pre1</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.24</version>
+		</dependency>
+		<dependency>
+			<groupId>cglib</groupId>
+			<artifactId>cglib</artifactId>
+			<version>3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-c3p0</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-ehcache</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.ehcache</groupId>
+			<artifactId>ehcache</artifactId>
+			<version>2.7.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate</artifactId>
+			<version>3.6.0.Beta2</version>
+			<type>pom</type>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>nz.net.ultraq.thymeleaf</groupId>
+			<artifactId>thymeleaf-layout-dialect</artifactId>
+			<version>1.1.3</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazonaws</groupId>
+			<artifactId>aws-java-sdk</artifactId>
+			<version>1.4.7</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.cargo</groupId> -->
+			<!-- <artifactId>cargo-maven2-plugin</artifactId> -->
+			<!-- <version>1.3.3</version> -->
+			<!-- <configuration> -->
+			<!-- <container> -->
+			<!-- <containerId>tomcat7x</containerId> -->
+			<!-- <type>remote</type> -->
+
+			<!-- </container> -->
+			<!-- <configuration> -->
+			<!-- <timeout>60000</timeout> -->
+			<!-- <type>runtime</type> -->
+			<!-- <properties> -->
+			<!-- <cargo.hostname>10.10.40.23</cargo.hostname> -->
+			<!-- <cargo.servlet.port>8081</cargo.servlet.port> -->
+			<!-- <cargo.remote.uri>http://10.10.40.23:8081/manager/text</cargo.remote.uri> -->
+			<!-- <cargo.remote.username>remote-deploy</cargo.remote.username> -->
+			<!-- <cargo.remote.password>prfct42x</cargo.remote.password> -->
+			<!-- </properties> -->
+			<!-- </configuration> -->
+			<!-- <deployer> -->
+			<!-- <type>remote</type> -->
+			<!-- </deployer> -->
+			<!-- <deployables> -->
+			<!-- <deployable> -->
+			<!-- <groupId>${project.groupId}</groupId> -->
+			<!-- <artifactId>${project.artifactId}</artifactId> -->
+			<!-- <type>war</type> -->
+			<!-- <properties> -->
+			<!-- <context>${project.artifactId}</context> -->
+			<!-- </properties> -->
+			<!-- <pingURL>http://10.10.40.23:8081/showcase-1</pingURL> -->
+			<!-- </deployable> -->
+			<!-- </deployables> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.4</version>
+				<!-- Enable filtering in web.xml -->
+				<configuration>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+						</manifest>
+					</archive>
+					<webResources>
+						<resource>
+							<filtering>true</filtering>
+							<directory>src/main/webapp</directory>
+							<includes>
+								<include>**/web.xml</include>
+							</includes>
+						</resource>
+					</webResources>
+					<warSourceDirectory>src/main/webapp</warSourceDirectory>
+					<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-eclipse-plugin</artifactId> -->
+			<!-- <version>2.9</version> -->
+			<!-- <configuration> -->
+			<!-- <additionalProjectnatures> -->
+			<!-- <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> -->
+			<!-- </additionalProjectnatures> -->
+			<!-- <additionalBuildcommands> -->
+			<!-- <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> -->
+			<!-- </additionalBuildcommands> -->
+			<!-- <downloadSources>true</downloadSources> -->
+			<!-- <downloadJavadocs>true</downloadJavadocs> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.5.1</version>
+				<configuration>
+					<source>1.6</source>
+					<target>1.6</target>
+					<!-- <compilerArgument>-Xlint:all</compilerArgument> -->
+					<!-- <showWarnings>true</showWarnings> -->
+					<!-- <showDeprecation>true</showDeprecation> -->
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.mojo</groupId> -->
+			<!-- <artifactId>exec-maven-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <mainClass>org.test.int1.Main</mainClass> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-assembly-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <archive> -->
+			<!-- <manifest> -->
+			<!-- <mainClass>eu.cloudscaleproject.showcase.db.generate.Generate</mainClass> -->
+			<!-- </manifest> -->
+			<!-- </archive> -->
+			<!-- <descriptorRefs> -->
+			<!-- <descriptorRef>jar-with-dependencies</descriptorRef> -->
+			<!-- </descriptorRefs> -->
+			<!-- </configuration> -->
+			<!-- <executions> -->
+			<!-- <execution> -->
+			<!-- <id>make-assembly</id> -->
+			<!-- <phase>package</phase> -->
+			<!-- <goals> -->
+			<!-- <goal>single</goal> -->
+			<!-- </goals> -->
+			<!-- </execution> -->
+			<!-- </executions> -->
+			<!-- </plugin> -->
+
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>1.2.1</version>
+				<configuration>
+					<executable>java</executable>
+					<arguments>
+						<argument>-Djava.library.path=${project.build.directory}/lib</argument>
+						<argument>-classpath ${compile.classpath}</argument>
+						<argument>eu.cloudscale.showcase.generate.Generate</argument>
+						<argument>${dbtype}</argument>
+					</arguments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<version>2.8</version>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<overWriteReleases>false</overWriteReleases>
+							<overWriteSnapshots>false</overWriteSnapshots>
+							<overWriteIfNewer>true</overWriteIfNewer>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+				<excludes>
+					<exclude>jmeter</exclude>
+					<exclude>matlab</exclude>
+					<exclude>rbe</exclude>
+					<exclude>results</exclude>
+					<exclude>aws</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-dependency-plugin
+										</artifactId>
+										<versionRange>
+											[2.8,)
+										</versionRange>
+										<goals>
+											<goal>
+												copy-dependencies
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+	<profiles>
+		<profile>
+			<id>amazon-hibernate</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>hibernate</eu.cloudscale.datasource>
+				<eu.cloudscale.showcase.generate.properties>classpath:database/database.aws.hibernate.properties</eu.cloudscale.showcase.generate.properties>
+			</properties>
+		</profile>
+		<profile>
+			<id>amazon-mongodb</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>mongodb</eu.cloudscale.datasource>
+			</properties>
+		</profile>
+	</profiles>
+</project>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
new file mode 100644
index 0000000..7d4be6a
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
@@ -0,0 +1,42 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+
+public class BuyConfirmResult
+{
+	public IOrders order;
+	public IShoppingCart cart;
+	
+	public BuyConfirmResult(IOrders order2, IShoppingCart sc)
+    {
+        order = order2;
+        cart = sc;
+    }
+
+	
+    public IOrders getOrder()
+    {
+    	return order;
+    }
+
+	
+    public void setOrder(IOrders order)
+    {
+    	this.order = order;
+    }
+
+	
+    public IShoppingCart getCart()
+    {
+    	return cart;
+    }
+
+	
+    public void setCart(IShoppingCart cart)
+    {
+    	this.cart = cart;
+    }
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
new file mode 100644
index 0000000..461e456
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
@@ -0,0 +1,22 @@
+package eu.cloudscale.showcase.db.common;
+
+import org.springframework.context.support.GenericXmlApplicationContext;
+
+
+public class ContextHelper 
+{
+	private static GenericXmlApplicationContext ctx = null;
+	
+	public static GenericXmlApplicationContext getApplicationContext()
+	{
+		if( ctx == null)
+		{
+			ctx = new GenericXmlApplicationContext();
+			ctx.load("classpath:app-context.xml");
+			ctx.refresh();
+		}
+		
+		return ctx;
+	}
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
new file mode 100644
index 0000000..9984d66
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
@@ -0,0 +1,21 @@
+package eu.cloudscale.showcase.db.common;
+
+import eu.cloudscale.showcase.db.services.IService;
+
+
+public class DatabaseHelper
+{
+	
+    public static IService getDatabase()
+	{
+
+    	IService db = (IService) ContextHelper.getApplicationContext().getBean( "service" );
+    	if (db == null)
+    	{
+    		System.out.println("Service is null");
+    	}
+		return db;
+
+	}
+	
+}
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
new file mode 100644
index 0000000..da72e86
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.db.common;
+
+public class Soundex
+{
+
+	public static String soundex(String s)
+	{
+		char[] x = s.toUpperCase().toCharArray();
+		char firstLetter = x[0];
+
+		// convert letters to numeric code
+		for ( int i = 0; i < x.length; i++ )
+		{
+			switch ( x[i] )
+			{
+				case 'B':
+				case 'F':
+				case 'P':
+				case 'V':
+				{
+					x[i] = '1';
+					break;
+				}
+
+				case 'C':
+				case 'G':
+				case 'J':
+				case 'K':
+				case 'Q':
+				case 'S':
+				case 'X':
+				case 'Z':
+				{
+					x[i] = '2';
+					break;
+				}
+
+				case 'D':
+				case 'T':
+				{
+					x[i] = '3';
+					break;
+				}
+
+				case 'L':
+				{
+					x[i] = '4';
+					break;
+				}
+
+				case 'M':
+				case 'N':
+				{
+					x[i] = '5';
+					break;
+				}
+
+				case 'R':
+				{
+					x[i] = '6';
+					break;
+				}
+
+				default:
+				{
+					x[i] = '0';
+					break;
+				}
+			}
+		}
+
+		// remove duplicates
+		String output = "" + firstLetter;
+		for ( int i = 1; i < x.length; i++ )
+			if ( x[i] != x[i - 1] && x[i] != '0' )
+				output += x[i];
+
+		// pad with 0's or truncate
+		output = output + "0000";
+		return output.substring( 0, 4 );
+	}
+
+	public static void main(String[] args)
+	{
+		String name1 = args[0];
+		String name2 = args[1];
+		String code1 = soundex( name1 );
+		String code2 = soundex( name2 );
+		System.out.println( code1 + ": " + name1 );
+		System.out.println( code2 + ": " + name2 );
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..ab059c6
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.hibernate.Address;
+
+@Repository
+//@Transactional(readOnly=true)
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	public AddressDaoImpl()
+	{
+		System.out.println("AddressDaoImpl constructor called!");
+	}
+
+	@Autowired
+	public AddressDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+	@Override
+    public List<IAddress> findAll()
+    {
+		return null;
+    }
+
+    @Override
+    public IAddress findById(int id)
+    {
+		return (IAddress) getCurrentSession().get( Address.class, id );
+    }
+    
+    @Override
+    public IAddress getObject()
+    {
+    	return new Address();
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..36d8288
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
@@ -0,0 +1,64 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.hibernate.Author;
+
+@Repository
+//@Transactional(readOnly=true)
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+	public AuthorDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public AuthorDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IAuthor> findAll()
+    {
+		String hql = "FROM Author";
+		Query q = getCurrentSession().createQuery( hql );
+		return q.list();
+    }
+
+    @Override
+    public IAuthor findById(int id)
+    {
+		return (IAuthor) getCurrentSession().get( Author.class, id );
+    }
+
+    @Override
+	public IAuthor getObject()
+	{
+		return new Author();
+	}
+
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    String hql = "SELECT A FROM Author as A, Item as I WHERE substring(soundex(A.ALname),0,4)=substring(soundex(:keyword),0,4) AND I.author.AId=A.AId ORDER BY I.ITitle";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "keyword", keyword );
+	    query.setMaxResults( 50 );
+	    
+	    List res = (List<Author>) query.list();
+	    
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..55a0f21
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	
+	public CcXactsDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CcXactsDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+
+	@SuppressWarnings( "rawtypes" )
+    @Override
+    public int getLastCcXactsId()
+    {
+		String hql = "SELECT CX_ID FROM cc_xacts ORDER BY CX_ID DESC";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+		List res = query.list();
+		
+		return ((ICcXacts) res.get( 0 )).getId();
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		String hql = "SELECT * FROM cc_xacts WHERE CX_ID = :id";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "id", id );		
+		
+		List<CcXacts> res = query.list();
+		
+		if( res.isEmpty() )
+			return null;
+		
+		return res.get( 0 );
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..6dd815d
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
@@ -0,0 +1,72 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.hibernate.Country;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	private String tableName = "country";
+
+	public CountryDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CountryDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+//		String hql = "FROM Country C WHERE C.coId = :coId";
+//		Query q = this.session.createQuery(hql);
+//		q.setParameter("coId", id);
+//		List<Country> res = (List<Country>) q.list();
+//		return res.get(0);
+		return (ICountry) getCurrentSession().get( Country.class, id );
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public ICountry getByName(String country)
+    {
+	    String hql = "SELECT C FROM Country as C WHERE C.coName = :countryName";
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "countryName", country );
+	    
+	    List<Query> res = query.list();
+	    if( res.isEmpty() )
+	    {
+	    	return null;
+	    }
+	    
+	    return (ICountry) res.get( 0 );
+    }
+
+    @Override
+	public ICountry getObject()
+	{
+		return new Country();
+	}
+    
+    @Override
+    public void createTable()
+    {
+    	String query = "CREATE TABLE IF NOT EXISTS " + this.tableName;
+    	getCurrentSession().createSQLQuery( query );
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..9207073
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
@@ -0,0 +1,75 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.hibernate.Customer;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+
+	public CustomerDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+//		System.out.println("Normal constructor called!");
+	}
+	
+	@Autowired
+	public CustomerDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+    public ICustomer getUserBy(String username, String password)
+    {
+	    String query = "SELECT C FROM Customer as C WHERE C.CUname = :username AND C.CPasswd = :passwd";
+	    
+	    Query q = getCurrentSession().createQuery( query );
+	    q.setMaxResults( 1 );
+	    q.setParameter( "username", username );
+	    q.setParameter( "passwd", password );
+	    List res = q.list();
+	    
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (ICustomer) res.get( 0 );
+    }
+
+
+    @Override
+    public ICustomer getObject()
+    {
+	    return new Customer();
+    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return (ICustomer) getCurrentSession().get( Customer.class, id );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		String query = "SELECT C FROM Customer as C WHERE C.address = :address";
+		
+		Query q = getCurrentSession().createQuery( query );
+		q.setParameter( "address", address );
+		
+		return q.list();
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
new file mode 100644
index 0000000..b617a7a
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
@@ -0,0 +1,72 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import javax.naming.NamingException;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+
+//@Transactional(readOnly=true)
+public class DaoImpl<T> implements IDao<T>
+{
+	protected int count = 1;
+	
+	protected SessionFactory sessionFactory;
+	
+	public DaoImpl()
+    {
+    }
+	
+
+	public DaoImpl(SessionFactory sFactory)
+	{
+//		try
+//        {
+//	        System.out.println("SessionFactory = " + sFactory.getReference());
+//        }
+//        catch ( NamingException e )
+//        {
+//	        // TODO Auto-generated catch block
+//	        e.printStackTrace();
+//        }
+		sessionFactory = sFactory;
+	}
+	
+	protected final Session getCurrentSession() 
+	{
+		Session session = sessionFactory.getCurrentSession();
+		//System.out.println("SESSION = " + session.getClass().hashCode());
+        return sessionFactory.getCurrentSession();
+    }
+	
+	@Override
+//	@Transactional(readOnly=false)
+	public T shrani(T object) 
+	{	
+		sessionFactory.getCurrentSession().saveOrUpdate( object );
+    	return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+    @Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..1697b2c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
@@ -0,0 +1,288 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.hibernate.Item;
+
+@Repository
+//@Transactional(readOnly=true)
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+
+	public ItemDaoImpl()
+	{
+		// super( (SessionFactory)
+		// ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public ItemDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAll()
+	{
+		String hql = "FROM Item";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setMaxResults( 20 );
+		return (List<IItem>) q.list();
+	}
+
+	@SuppressWarnings( "unused" )
+	@Override
+	public IItem findById(int id)
+	{
+		String hql = "SELECT I, A FROM Item I, Author A WHERE I.IId = :itemId AND A.AId = I.author.AId";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setParameter( "itemId", id );
+		List res = q.list();
+		if ( res != null && res.get( 0 ) == null )
+			return null;
+
+		IItem item = (Item) ( (Object[]) res.get( 0 ) )[0];
+		// Hibernate.initialize( item.getShoppingCartLines() );
+		// Hibernate.initialize( item.getOrderLines());
+		return item;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> getPromotional()
+	{
+		String hql = "SELECT " +
+						"I2.I_THUMBNAIL as I2_THUMBNAIL," +
+						"I2.I_ID as I2_ID," +
+						"I3.I_THUMBNAIL as I3_THUMBNAIL," +
+						"I3.I_ID as I3_ID," +
+						"I4.I_THUMBNAIL as I4_THUMBNAIL," +
+						"I4.I_ID as I4_ID," +
+						"I5.I_THUMBNAIL as I5_THUMBNAIL," +
+						"I5.I_ID as I5_ID, " +
+						"I6.I_THUMBNAIL as I6_THUMBNAIL," +
+						"I6.I_ID as I6_ID " +
+					"FROM " +
+						"item as I " +
+					"LEFT JOIN " +
+						"item as I2 ON I.I_RELATED1 = I2.I_ID " +
+					"LEFT JOIN " +
+						"item as I3 ON I.I_RELATED2 = I3.I_ID " +
+					"LEFT JOIN " +
+						"item as I4 ON I.I_RELATED3 = I4.I_ID " +
+					"LEFT JOIN " +
+						"item as I5 ON I.I_RELATED4 = I5.I_ID " +
+					"LEFT JOIN " +
+						"item as I6 ON I.I_RELATED5 = I6.I_ID " +
+					"ORDER BY RAND()";
+		
+		Query q = getCurrentSession().createSQLQuery( hql );
+		q.setMaxResults( 1 );
+
+		List<Object> res = (List<Object>) q.list();
+		
+		Object[] relateds = (Object[]) res.get(0);
+		List<IItem> results = new ArrayList<IItem>();
+		
+		for(int i=0; i < relateds.length; i+=2)
+		{
+			String related = (String) relateds[i];
+			Integer id = (Integer) relateds[i+1];
+			
+			Item item = new Item();
+			item.setIThumbnail(related);
+			item.setIId(id);
+			results.add(item);
+		}
+		
+//		ArrayList<IItem> promotional = new ArrayList<IItem>();
+//
+//		promotional.add( findById( 7296 ) );
+//
+//		promotional.add( findById( 6547 ) );
+//
+//		promotional.add( findById( 446 ) );
+//
+//		promotional.add( findById( 4807 ) );
+//
+//		promotional.add( findById( 5706 ) );
+//		 promotional.add( findById( res.get( 0 ).getIRelated1() ) );
+//		
+//		 promotional.add( findById( res.get( 0 ).getIRelated2() ) );
+//		
+//		 promotional.add( findById( res.get( 0 ).getIRelated3() ) );
+//		
+//		 promotional.add( findById( res.get( 0 ).getIRelated4() ) );
+//		
+//		 promotional.add( findById( res.get( 0 ).getIRelated5() ) );
+
+		return results;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+//	@Transactional( readOnly = true )
+	public List<IItem> getNewProducts(String category)
+	{
+		Session session = getCurrentSession();
+		Query query = session
+		        .createQuery( "SELECT I, A FROM Item as I, Author as A WHERE I.author.AId = A.AId AND I.ISubject = :category "
+		                + "ORDER BY I.IPubDate DESC, I.ITitle" );
+		query.setString( "category", category );
+		query.setMaxResults( 50 );
+		ArrayList<IItem> newProducts = new ArrayList<IItem>();
+
+		List<Object[]> res = query.list();
+		for ( int i = 0; i < res.size(); i++ )
+		{
+			newProducts.add( (Item) ( res.get( i )[0] ) );
+		}
+		return newProducts;
+	}
+
+	@SuppressWarnings( "unchecked" )
+//	@Transactional( readOnly = true )
+	public List<Object[]> getBestSellers(String category)
+	{
+		Session session = getCurrentSession();
+
+		 Query query =
+		 session.createQuery("SELECT I.IId, A.AFname, A.ALname, I.ITitle, SUM(OL.olQty) AS val " +
+		 		"FROM OrderLine as OL, Item as I, Author as A " +
+		 		"WHERE " +
+		 		"I.author.AId = A.AId AND " +
+		 		"I.IId = OL.item.IId AND " +
+		 		"I.ISubject = :category " +
+		 		"GROUP BY OL.item.IId " +
+		 		"ORDER BY val DESC");
+
+//		Query query = session
+//		        .createSQLQuery(
+//		                "SELECT i_id as a, i_title as b, a_fname as c, a_lname as d, SUM(ol_qty) AS val "
+//		                        + "FROM "
+//		                        + "orders, order_line, item, author "
+//		                        + "WHERE "
+//		                        + "order_line.ol_o_id = orders.o_id AND item.i_id = order_line.ol_i_id "
+//		                        + "AND item.i_subject = :category AND item.i_a_id = author.a_id GROUP BY i_id "
+//		                        + "ORDER BY orders.o_date, val DESC" )
+//		        .addScalar( "a" ).addScalar( "b" ).addScalar( "c" )
+//		        .addScalar( "d" ).addScalar( "val" );
+
+		query.setParameter( "category", category );
+		query.setMaxResults( 50 );
+
+		long start = System.nanoTime();
+		List<Object[]> res = query.list();
+		System.out.println( "[best-sellers] Category = " + category + ", cas izvajanja = "
+		        + ( System.nanoTime() - start ) / 1E9 );
+
+		return res;
+
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public IItem getRandomItem()
+	{
+		String hql = "SELECT I FROM Item as I ORDER BY RAND()";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+
+		List<Object> res = query.list();
+		if ( res.isEmpty() )
+		{
+			return null;
+		}
+
+		return (IItem) res.get( 0 );
+	}
+
+	@Override
+	public IItem getObject()
+	{
+		return new Item();
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByAuthor(IAuthor author)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.author = :author ORDER BY I.ITitle";
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "author", author );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		ArrayList<IItem> items = new ArrayList<IItem>();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+			items.add( item );
+		}
+
+		return items;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByTitle(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I, Author as A WHERE I.author.AId = A.AId AND substring(soundex(I.ITitle), 0, 4) = substring(soundex(:title), 0, 4) ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "title", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllBySubject(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.ISubject = :subject ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "subject", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..bb7ffc7
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
@@ -0,0 +1,60 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+
+@Repository
+//@Transactional(readOnly=true)
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+
+	public OrderLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrderLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    String hql = "SELECT OL FROM OrderLine as OL WHERE OL.orders = :order";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "order", orders );
+	    
+	    return query.list();
+    }
+
+	@Override
+    public IOrderLine findById(Integer id)
+    {
+		String hql = "SELECT OL FROM OrderLine as OL WHERE OL.id = :id";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter("id", id);
+		
+		return (IOrderLine) query.uniqueResult();
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..79b41f4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
@@ -0,0 +1,173 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+@Repository
+//@Transactional(readOnly=true)
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+	public OrdersDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrdersDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@SuppressWarnings( { "rawtypes" } )
+    @Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		String hql16 = "SELECT O FROM Orders as O, Customer as C WHERE O.customer.CId = C.CId AND C.CUname = :cid ORDER BY O.ODate, O.OId DESC";
+		Query query16 = getCurrentSession().createQuery( hql16 );
+		query16.setMaxResults( 1 );
+		query16.setParameter( "cid", String.valueOf(customer.getCId() ));
+		List res16 = query16.list();
+		
+		if( res16 == null || res16.isEmpty() )
+		{
+			return null;
+		}
+		
+		IOrders order = (IOrders) res16.get( 0 );
+//		Hibernate.initialize( order.getOrderLines() );
+		
+		return order;
+////		SELECT O FROM Customer as C, Orders as O WHERE C.CId = O.OCId AND C.CUname = 'SE' ORDER BY O.ODate, O.OId DESC
+//		String hql1 = "SELECT O FROM Customer as C, Orders as O"
+//					+ " WHERE C.CId = O.customer.CId"
+//					+ " AND C.CUname = :username"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		Query query = getCurrentSession().createQuery( hql1 );
+//		query.setParameter( "username", customerUsername );
+//		query.setMaxResults( 1 );
+//		if( query.list().isEmpty() )
+//			return null;
+//		
+//		IOrders order = (IOrders) query.list().get( 0 );
+//		
+//		String hql2 = "SELECT O, C, CX, SHIP, SHIP_CO, BILL, BILL_CO FROM"
+//					+ " Orders as O, " 
+//				    + " Customer as C," 
+//				    + " CcXacts as CX, "
+//				    + " Address as SHIP, "
+//				    + " Address as BILL, "
+//				    + " Country as SHIP_CO, "
+//				    + " Country as BILL_CO "
+//				    + " WHERE O.OId = :orderId"
+//				    + " AND CX.id.cxOId = O.OId"
+//					+ " AND C.CId = O.customer.CId"
+//					+ " AND O.addressByOBillAddrId.addrId = BILL.addrId"
+//					+ " AND BILL.country.coId = BILL_CO.coId"
+//					+ " AND O.addressByOShipAddrId.addrId = SHIP.addrId"
+//					+ " AND SHIP.country.coId = SHIP_CO.coId"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		query = getCurrentSession().createQuery( hql2 );
+//		query.setMaxResults(1);
+//		query.setParameter("orderId", order.getOId());
+//		
+//		
+//		List res = query.list();
+//		if( res.isEmpty() )
+//			return null;
+//		
+//		order = new Orders((Object[]) query.list().get( 0 ));
+//		
+//	    return order;
+    }
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+		return (IOrders) getCurrentSession().get( Orders.class, cxOId );
+    }
+	
+//	  @Override
+//      public Orders getMostRecentOrder(String customerUsername, List<OrderLine> orderLines)
+//      {
+//    		String hql1 = "SELECT o_id "
+//					+ "FROM customer, orders "
+//					+ "WHERE customer.c_id = orders.o_c_id "
+//					+ "AND c_uname = ? "
+//					+ "ORDER BY o_date, orders.o_id DESC "
+//					+ "LIMIT 0,1";
+//    		Query query = getCurrentSession().createQuery( hql1 );
+//    		query.setParameter( "username", customerUsername );
+//    		query.setMaxResults( 1 );
+//    		if( query.list().isEmpty() )
+//    			return null;
+//    		
+//    		Orders order = (Orders) query.list().get( 0 );
+//    		
+//    		String hql2 = "SELECT orders.*, customer.*, "
+//					+ "  cc_xacts.cx_type, "
+//					+ "  ship.addr_street1 AS ship_addr_street1, "
+//					+ "  ship.addr_street2 AS ship_addr_street2, "
+//					+ "  ship.addr_state AS ship_addr_state, "
+//					+ "  ship.addr_zip AS ship_addr_zip, "
+//					+ "  ship_co.co_name AS ship_co_name, "
+//					+ "  bill.addr_street1 AS bill_addr_street1, "
+//					+ "  bill.addr_street2 AS bill_addr_street2, "
+//					+ "  bill.addr_state AS bill_addr_state, "
+//					+ "  bill.addr_zip AS bill_addr_zip, "
+//					+ "  bill_co.co_name AS bill_co_name "
+//					+ "FROM customer, orders, cc_xacts,"
+//					+ "  address AS ship, "
+//					+ "  country AS ship_co, "
+//					+ "  address AS bill,  "
+//					+ "  country AS bill_co "
+//					+ "WHERE orders.o_id = :orderId "
+//					+ "  AND cx_o_id = orders.o_id "
+//					+ "  AND customer.c_id = orders.o_c_id "
+//					+ "  AND orders.o_bill_addr_id = bill.addr_id "
+//					+ "  AND bill.addr_co_id = bill_co.co_id "
+//					+ "  AND orders.o_ship_addr_id = ship.addr_id "
+//					+ "  AND ship.addr_co_id = ship_co.co_id "
+//					+ "  AND orders.o_c_id = customer.c_id";
+//    		query = getCurrentSession().createQuery( hql2 );
+//    		query.setMaxResults(1);
+//    		query.setParameter("orderId", order.getOId());
+//    		
+//    		List res = query.list();
+//    		if( res.isEmpty() )
+//    			return null;
+//    		
+//    		order = new Orders((Object[]) query.list().get( 0 ));
+//    		
+//    		String hql3 = "SELECT * "
+//					+ "FROM order_line, item "
+//					+ "WHERE ol_o_id = :orderId " + "AND ol_i_id = i_id";
+//    		
+//    		query = getCurrentSession().createQuery( hql3 );
+//    		query.setParameter( "orderId", order.getOId() );
+//    		List<Object[]> res3 = query.list();
+//    		
+//    		for( Object[] obj : res3 )
+//    		{
+//    			orderLines.add( (OrderLine) obj[0] );
+//    		}
+//    		
+//    	    return order;
+//      }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..60bc0ae
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,74 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Repository
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+
+
+	@Autowired
+	public ShoppingCartDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+//    @Transactional(readOnly=true)
+    public IShoppingCart findById(Integer shoppingId)
+    {
+    	Session session = getCurrentSession();
+	    String hql = "SELECT SC FROM ShoppingCart as SC WHERE SC.scId = :scId";
+	    
+	    Query query = session.createQuery(hql);
+	    query.setParameter( "scId", shoppingId );
+	    
+	   
+    	List res = query.list();
+	    
+	    if( res.isEmpty() )
+	    {
+//	    	System.out.println("results are empty! " + query.getQueryString());
+	    	return null;
+	    }
+	    
+	    ShoppingCart sc = (ShoppingCart) res.get( 0 );
+	    Hibernate.initialize( sc.getShoppingCartLines() );
+	    return sc;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+//    @Transactional(readOnly=true)
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		String hql = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart = :shoppingCart";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "shoppingCart", shoppingCart );
+		
+		return query.list();
+    }
+	
+	@Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..220145c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,95 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine;
+
+@Repository
+//@Transactional(readOnly=true)
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+
+	
+	public ShoppingCartLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public ShoppingCartLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		String hql1 = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId AND SCL.item.IId = :itemId";
+	    Query q1 = getCurrentSession().createQuery( hql1 );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId );
+	    q1.setParameter( "itemId", itemId);
+	    
+	    List<Object> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (IShoppingCartLine) res.get( 0 );
+	    
+    }
+
+	@Override
+    public void delete(IShoppingCartLine obj)
+    {
+		Session session = getCurrentSession();
+		session.delete( obj );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public boolean isCartEmpty(int scId)
+    {
+		String hql = "SELECT COUNT(SCL) FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", scId);
+	    
+	    List<Long> res = q1.list();
+	    if( res != null && res.get(0) == 0 )
+	    	return true;
+	    
+	    return false;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+		String hql = "SELECT SCL, I FROM ShoppingCartLine as SCL, Item as I WHERE SCL.item.IId = I.IId AND SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId);
+	    
+	    List<Object[]> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return res;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+        return new ShoppingCartLine();
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
new file mode 100644
index 0000000..a66f55e
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+
+
+public interface IAddressDao extends IDao<IAddress>
+{	
+	public List<IAddress> findAll();
+
+	public IAddress findById(int id);
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
new file mode 100644
index 0000000..a45d8d4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
@@ -0,0 +1,15 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+public interface IAuthorDao extends IDao<IAuthor>
+{
+	public List<IAuthor> findAll();
+
+	public IAuthor findById(int id);
+
+	public List<IAuthor> findBySoundexLname(String keyword);
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
new file mode 100644
index 0000000..3165388
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+
+public interface ICcXactsDao extends IDao<ICcXacts> 
+{
+
+	int getLastCcXactsId();
+
+	public ICcXacts findById(Integer id);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
new file mode 100644
index 0000000..b3cb8f2
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+public interface ICountryDao extends IDao<ICountry>
+{
+
+	public ICountry findById(int id);
+
+	public ICountry getByName(String country);
+	
+	public void createTable();
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
new file mode 100644
index 0000000..ebf0fe2
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+public interface ICustomerDao extends IDao<ICustomer> 
+{
+
+	public ICustomer findById(Integer id);
+
+	public ICustomer getUserBy(String username, String password);
+
+	public List<ICustomer> findByAddress(IAddress addrId);
+
+	
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
new file mode 100644
index 0000000..91fc996
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
@@ -0,0 +1,12 @@
+package eu.cloudscale.showcase.db.dao;
+
+
+public interface IDao<T>
+{
+	public T shrani(T object);
+
+	public void finish();
+		
+	public T getObject();
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
new file mode 100644
index 0000000..9aadafb
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
@@ -0,0 +1,21 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+
+public interface IItemDao extends IDao<IItem>
+{
+	public List<IItem> findAll();
+	public IItem findById(int id);
+	public List<IItem> getPromotional();
+	public List<IItem> getNewProducts(String category);
+	public List<Object[]> getBestSellers(String category);
+	public IItem getRandomItem();
+	public IItem getObject();
+	public List<IItem> findAllByAuthor(IAuthor author);
+	public List<IItem> findAllByTitle(String keyword);
+	public List<IItem> findAllBySubject(String keyword);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
new file mode 100644
index 0000000..db4c42d
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrderLineDao extends IDao<IOrderLine> 
+{
+
+	List<IOrderLine> findAllByOrder(IOrders orders);
+	IOrderLine findById(Integer id);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
new file mode 100644
index 0000000..e397e3c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrdersDao extends IDao<IOrders> 
+{
+	public IOrders getMostRecentOrder(ICustomer customer);
+
+	public IOrders findById(Integer cxOId);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
new file mode 100644
index 0000000..db6d063
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
@@ -0,0 +1,16 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+public interface IShoppingCartDao extends IDao<IShoppingCart> 
+{
+//	public Integer createEmptyCart();
+
+	public IShoppingCart findById(Integer shoppingId);
+
+	public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
new file mode 100644
index 0000000..a24ec57
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
@@ -0,0 +1,19 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+public interface IShoppingCartLineDao extends IDao<IShoppingCartLine> 
+{
+
+	public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId);
+
+	public void delete(IShoppingCartLine bySCandItem);
+
+	public boolean isCartEmpty(int scId);
+
+	public List<Object[]> findBySCId(Integer shoppingId);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..69ff6cc
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
@@ -0,0 +1,75 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.mongo.Address;
+
+@Repository("mongoAddressDao")
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	
+//	@Autowired
+//	private MongoTemplate mongoOps;	
+	
+	public AddressDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+		System.out.println("Created AddressDao instance");
+	}
+	
+//	public AddressDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+
+    @Override
+	public List<IAddress> findAll()
+	{
+		return (List<IAddress>) mongoOps.findAll( IAddress.class, "address" );
+	}
+
+    @Override
+    public IAddress findById(int id)
+    {
+	    return (IAddress) mongoOps.findOne( Query.query( Criteria.where( "addrId" ).is( id )), Address.class );
+    }
+	
+    @Override
+	public IAddress getObject()
+	{
+	    return new Address();
+	}
+    
+    @Override
+    public IAddress shrani(IAddress object)
+    {
+        if( object.getAddrId() == null)
+        {
+        	object.setAddrId( getLastId() + 1 );
+        }
+        return super.shrani( object );
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "addrId" );
+	
+	    IAddress a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Address.class);
+	    
+	    if( a == null || a.getAddrId() == null)
+	    	return 0;
+	    
+	    return a.getAddrId(); 
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..38c9796
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
@@ -0,0 +1,86 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.mongo.Author;
+
+@Repository("mongoAuthorDao")
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+//	@Autowired
+//	MongoTemplate mongoOps;
+	
+	public AuthorDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public AuthorDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+	
+    @SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+	public List<IAuthor> findAll()
+	{
+		List authors = mongoOps.findAll( Author.class, "author" );
+		return (List<IAuthor>) authors;
+	}
+
+    @Override
+    public IAuthor findById(int id)
+    {
+	    return (IAuthor) mongoOps.findOne( Query.query( Criteria.where( "authorId" ).is( id ) ), Author.class);
+    }
+    
+    @Override
+    public IAuthor getObject()
+    {
+    	return new Author();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "authorId" );
+	
+	    Author a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Author.class);
+	    
+	    if( a == null || a.getAId() == null)
+	    	return 0;
+	    
+	    return a.getAId();
+    }
+	
+	@Override
+	public IAuthor shrani(IAuthor object)
+	{
+		if( object.getAId() == null)
+		{
+			object.setAId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "lNameSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Author.class );
+	    
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..35e5274
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
@@ -0,0 +1,78 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.mongo.CcXacts;
+
+@Repository("mongoCcXactsDao")
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	public CcXactsDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public CcXactsDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+    
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		return (ICcXacts) mongoOps.findOne( Query.query(Criteria.where( "ccXactsId" ).is( id )), CcXacts.class);
+    }
+
+
+	@Override
+    public int getLastCcXactsId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );		 
+				
+	    ICcXacts cc = mongoOps.findOne( Query.query(new Criteria()).with( sort ), CcXacts.class);
+	    
+	    
+	    if( cc == null || cc.getId() == null)
+	    	return 0;
+	    
+	    return cc.getId();    
+	}
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );
+	
+	    CcXacts o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), CcXacts.class);
+	    
+	    if( o == null || o.getId() == null)
+	    	return 0;
+	    
+	    return o.getId();
+    }
+	
+	@Override
+	public ICcXacts shrani(ICcXacts object)
+	{
+		if( object.getId() == null)
+		{
+			object.setId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..00cc255
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
@@ -0,0 +1,68 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.mongo.Country;
+
+@Repository("mongoCountryDao")
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	public CountryDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+	    return mongoOps.findOne( Query.query( Criteria.where( "coId" ).is(id) ), Country.class );
+    }
+
+	@Override
+    public ICountry getByName(String country)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "coName" ).regex(country, "i")), Country.class );
+    }
+	
+	@Override
+	public ICountry getObject()
+	{
+	    return new Country(); 
+	}
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "coId" );
+	
+	    Country o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Country.class);
+	    
+	    if( o == null || o.getCoId() == null)
+	    	return 0;
+	    
+	    return o.getCoId();
+    }
+	
+	@Override
+	public ICountry shrani(ICountry object)
+	{
+		if( object.getCoId() == null)
+		{
+			object.setCoId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@Override
+    public void createTable()
+    {
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..45e556b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
@@ -0,0 +1,78 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+
+@Repository("mongoCustomerDao")
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+	public CustomerDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public CustomerDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return mongoOps.findOne( Query.query(Criteria.where( "CId" ).is( id )), Customer.class);
+    }
+
+	@Override
+    public ICustomer getUserBy(String username, String password)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "CUname" ).is( username.toLowerCase()).and( "CPasswd" ).is(password.toLowerCase())), Customer.class );
+    }
+	
+    @Override
+	public ICustomer getObject()
+	{
+		return new Customer();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "addrId" ).is( address.getAddrId() )), Customer.class );
+		
+		return res;
+    }
+
+	@Override
+    public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "cId" );
+		
+	    Customer c = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Customer.class);
+	    
+	    if( c == null || c.getCId() == null)
+	    	return 0;
+	    
+	    return c.getCId();
+    }
+	
+	@Override
+	public ICustomer shrani(ICustomer object)
+	{
+		if( object.getCId() == null)
+		{
+			object.setCId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
new file mode 100644
index 0000000..3bffc1c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
@@ -0,0 +1,50 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.mongodb.Mongo;
+
+public abstract class DaoImpl<T> implements IDaoExt<T>
+{
+	@Autowired
+	protected MongoTemplate mongoOps;
+	
+	public DaoImpl()
+    {
+    }
+	
+//	public DaoImpl(MongoTemplate mongoOps)
+//	{
+//		this.mongoOps = mongoOps;
+//	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public T shrani(T object) 
+	{	
+		mongoOps.save( object );
+		return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+	@Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
new file mode 100644
index 0000000..24b2e4d
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
@@ -0,0 +1,10 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+
+
+public interface IDaoExt<T> extends IDao<T>
+{
+	public Integer getLastId();
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..edc9f35
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
@@ -0,0 +1,237 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+
+@Repository("mongoItemDao")
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+	public ItemDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+	public List<IItem> findAll()
+	{
+		List items = mongoOps.find( Query.query(new Criteria()).limit( 50 ), Item.class, "item");
+		return (List<IItem>) items;
+	}
+
+    @Override
+	public IItem findById(int id)
+	{
+		Item item = mongoOps.findOne( Query.query( Criteria.where( "IId" ).is( id ) ), Item.class);
+		return item;
+	}
+	
+    @Override
+	public IItem getRandomItem()
+	{
+		return (IItem) mongoOps.findOne( Query.query( Criteria.where( "IRandom" ).gt( new Random().nextDouble() )), Item.class, "item" );
+	}
+
+	@Override
+	public List<IItem> getPromotional() 
+	{
+
+		IItem item = getRandomItem();
+		if ( item == null)
+		{
+			System.out.println("Item is null");
+			item = getRandomItem();
+		}
+		ArrayList<IItem> promotional = new ArrayList<IItem>();
+		
+		promotional.add( findById( item.getIRelated1()));
+		
+		promotional.add(findById( item.getIRelated2()));
+		
+		promotional.add(findById( item.getIRelated3()));
+		
+		promotional.add(findById( item.getIRelated4()));
+		
+		promotional.add(findById( item.getIRelated5()));
+		
+		return promotional;
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> getNewProducts(String category)
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "IPubDate").and( new Sort(Sort.Direction.ASC, "ITitle") );
+		List items = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is(category) ).with( sort ).limit( 50 ), Item.class );
+		return (List<IItem>) items;
+    }
+	
+	class ValueObject
+	{
+		private String id;
+		private float value;
+		
+        public String getId()
+        {
+        	return id;
+        }
+		
+        public void setId(String id)
+        {
+        	this.id = id;
+        }
+		
+        public float getValue()
+        {
+        	return value;
+        }
+		
+        public void setValue(float value)
+        {
+        	this.value = value;
+        }
+		
+	}
+
+	@Override
+    public List<Object[]> getBestSellers(String category)
+    {
+    	Sort sort = new Sort( Sort.Direction.DESC, "olQty" );
+    	
+    	List<Item> res = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is( category )).limit( 50 ).with( sort ), Item.class);
+    	
+    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+    	for( Item item : res)
+    	{
+    		Object[] itemObj = new Object[5];
+    		itemObj[0] = item.getIId();
+    		itemObj[1] = item.getITitle();
+    		itemObj[2] = item.getAuthor().getAFname();
+    		itemObj[3] = item.getAuthor().getALname();
+    		itemObj[4] = item.getOlQty();
+    		
+    		items.add( itemObj );
+    	}
+    	
+    	return items;
+    	
+//    	BasicDBObject groupFields = new BasicDBObject("_id", "$itemId");
+//    	groupFields.put( "qty", new BasicDBObject("$sum", "$olQty") );
+//    	
+//    	BasicDBObject group = new BasicDBObject("$group", groupFields);
+//    	
+//    	BasicDBObject limit = new BasicDBObject("$limit", 3333);
+//    	
+//    	BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject("qty", -1));
+//    	
+//    	AggregationOutput output = mongoOps.getCollection( mongoOps.getCollectionName( OrderLine.class ) ).aggregate( group, sort, limit );
+//    	
+//    	IItemDao itemDao = DatabaseHelper.getDatabase().getItemDaoImpl();
+//    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+//    	
+//    	for( DBObject object : output.results() )
+//    	{
+//    		if( items.size() == 50 )
+//    		{
+//    			break;
+//    		}
+//    		
+//    		IItem item = itemDao.findById( (Integer) object.get( "_id" ) );
+//    		
+//    		if(item.getISubject().equals( category ))
+//    		{
+//        		Object[] itemObj = new Object[5];
+//        		itemObj[0] = item.getIId();
+//        		itemObj[1] = item.getITitle();
+//        		itemObj[2] = item.getAuthor().getAFname();
+//        		itemObj[3] = item.getAuthor().getALname(); 
+//        		itemObj[4] = object.get( "qty" );
+//        		items.add( itemObj );
+//    		}
+//    		   		
+//    		
+//    	}
+//    	
+//    	return items;
+//    	DELA FUL POCAS!!! - glej http://stackoverflow.com/questions/4430407/mongodb-mapreduce-is-much-slower-than-pure-java-processing
+//    	String mapFunction = "function()" +
+//    			"{" +
+//    			"	emit(this.itemId, this.olQty)" +
+//    			"}";
+//    	String reduceFunction = "function(k, v)" +
+//    			"{" +
+//    			"	return Array.sum(v)" +
+//    			"}";
+//    	MapReduceResults<ValueObject> results = mongoOps.mapReduce( "orderLine", mapFunction, reduceFunction, ValueObject.class );
+    }
+    
+    @Override
+    public IItem getObject()
+    {
+    	return new Item();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "iId" );
+	
+	    Item o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Item.class);
+	    
+	    if( o == null || o.getIId() == null)
+	    	return 0;
+	    
+	    return o.getIId();
+    }
+	
+	@Override
+	public IItem shrani(IItem object)
+	{
+		if( object.getIId() == null)
+		{
+			object.setIId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByAuthor(IAuthor author)
+    {
+    	List res = mongoOps.find( Query.query( Criteria.where( "authId" ).is( author.getAId() ) ).limit( 50 ), Item.class );
+	    return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByTitle(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iTitleSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Item.class );
+		
+		return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllBySubject(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iSubject" ).is( keyword )).limit( 50 ), Item.class );
+		
+	    return res;
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..7f3749f
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.OrderLine;
+
+@Repository("mongoOrderLineDao")
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+	
+	public OrderLineDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "orderId" ).is( orders.getOId() )), OrderLine.class );
+	    return res;
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "olId" );
+		
+	    OrderLine o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), OrderLine.class);
+
+	    if( o == null || o.getOlId() == null)
+	    	return 0;
+	    
+	    return o.getOlId();
+    }
+	
+	@Override
+	public IOrderLine shrani(IOrderLine object)
+	{
+		if( object.getOlId() == null)
+		{
+			object.setOlId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@Override
+    public IOrderLine findById(Integer id)
+    {
+		return mongoOps.findOne(Query.query( Criteria.where("olId").is(id) ), OrderLine.class);
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..93c50a5
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
@@ -0,0 +1,70 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Repository("mongoOrdersDao")
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+
+	public OrdersDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+	@Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		Sort sort = new Sort( Sort.Direction.DESC, "ODate" );
+		Orders order = mongoOps.findOne( Query.query(Criteria.where( "customer" ).is(customer.getCId())).with( sort ), Orders.class );
+		
+		return order;
+    }
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+		return mongoOps.findOne(Query.query(new Criteria().where( "oId" ).is( cxOId )), Orders.class);
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "oId" );
+	
+	    Orders o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Orders.class);
+	    
+	    if( o == null || o.getOId() == null)
+	    	return 0;
+	    
+	    return o.getOId();
+    }
+	
+	@Override
+	public IOrders shrani(IOrders object)
+	{
+		if( object.getOId() == null)
+		{
+			object.setOId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..6b364e3
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,71 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCart;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartDao")
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+	public ShoppingCartDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "scId" );
+	
+	    ShoppingCart sc = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCart.class);
+	    
+	    if( sc == null || sc.getScId() == null)
+	    	return 0;
+	    
+	    return sc.getScId();
+    }
+
+	@Override
+    public IShoppingCart findById(Integer shoppingId)
+    {
+	    return mongoOps.findOne( Query.query(Criteria.where("scId").is(shoppingId)), ShoppingCart.class );
+    }
+	
+    @Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "shoppingCart" ).is( shoppingCart.getScId() )), ShoppingCartLine.class );
+		return res;
+    }
+	
+	@Override
+	public IShoppingCart shrani(IShoppingCart object)
+	{
+	    if( object.getScId() == null )
+	    {
+	    	object.setScId( getLastId()+1 );
+	    }
+	    return super.shrani( object );
+	}
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..8a08f51
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,86 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartLineDao")
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+	public ShoppingCartLineDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public ShoppingCartLineDaoImpl(MongoTemplate mongoOps)
+//    {
+//		super(mongoOps);
+//    }
+
+	@Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		IShoppingCartLine scl = mongoOps.findOne( Query.query( Criteria.where( "shoppingCart" ).is( shoppingId ).andOperator( Criteria.where( "item" ).is( itemId ) )), ShoppingCartLine.class );
+			
+		return scl;
+    }
+
+	@Override
+    public void delete(IShoppingCartLine bySCandItem)
+    {
+	    // TODO Auto-generated method stub
+	    
+    }
+
+	@Override
+    public boolean isCartEmpty(int scId)
+    {
+		return mongoOps.count(Query.query(Criteria.where("shoppingCart").is(scId)), ShoppingCartLine.class) > 0;
+    }
+
+	@Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+	    // TODO Auto-generated method stub
+	    return null;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+    	return new ShoppingCartLine();
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "sclId" );
+	
+	    ShoppingCartLine scl = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCartLine.class);
+	    
+	    if( scl == null || scl.getSclId() == null)
+	    	return 0;
+	    
+	    return scl.getSclId();
+    }
+    
+    @Override
+    public IShoppingCartLine shrani(IShoppingCartLine object)
+    {
+    	if( object.getSclId() == null )
+    	{
+    		object.setSclId( getLastId() + 1 );
+    	}
+        return super.shrani( object );
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDao.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDao.java
new file mode 100644
index 0000000..a09a0fb
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDao.java
@@ -0,0 +1,25 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDao
+{
+	
+	public IItemDao getItemDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDao();
+
+	public IShoppingCartDao getShoppingCartDao();
+
+	public IAddressDao getAddressDao();
+
+	public ICustomerDao getCustomerDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+	 
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDaos.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDaos.java
new file mode 100644
index 0000000..7eac450
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/IDaos.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDaos
+{
+	public IAddressDao getAddressDaoImpl();
+	
+	public IAuthorDao getAuthorDaoImpl();
+	
+	public ICcXactsDao getCcXactsDaoImpl();
+	
+	public ICountryDao getCountryDaoImpl();
+	
+	public ICustomerDao getCustomerDaoImpl();
+	
+	public IItemDao getItemDaoImpl();
+
+	public IOrderLineDao getOrderLineDaoImpl();
+	
+	public IOrdersDao getOrdersDaoImpl();
+	
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+
+	public IShoppingCartDao getShoppingCartDaoImpl();
+	 
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
new file mode 100644
index 0000000..ee89c24
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
@@ -0,0 +1,187 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Address generated by hbm2java
+ */
+@Entity
+@Table( name = "address", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Address implements IAddress
+{
+
+	private Integer        addrId;
+
+	private ICountry        country;
+
+	private String         addrStreet1;
+
+	private String         addrStreet2;
+
+	private String         addrCity;
+
+	private String         addrState;
+
+	private String         addrZip;
+
+	private Set<IOrders>   ordersesForOBillAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<IOrders>   ordersesForOShipAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<ICustomer> customers              = new HashSet<ICustomer>( 0 );
+
+	public Address()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "ADDR_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAddrId()
+	{
+		return this.addrId;
+	}
+
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "ADDR_CO_ID", nullable = false )
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = (Country) country;
+	}
+
+	@Column( name = "ADDR_STREET1", length = 40 )
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Column( name = "ADDR_STREET2", length = 40 )
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Column( name = "ADDR_CITY", length = 30 )
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Column( name = "ADDR_STATE", length = 20 )
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Column( name = "ADDR_ZIP", length = 10 )
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOBillAddrId" )
+	public Set<IOrders> getOrdersesForOBillAddrId()
+	{
+		return this.ordersesForOBillAddrId;
+	}
+
+	public void setOrdersesForOBillAddrId(Set<IOrders> ordersesForOBillAddrId)
+	{
+		this.ordersesForOBillAddrId = ordersesForOBillAddrId;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOShipAddrId" )
+	public Set<IOrders> getOrdersesForOShipAddrId()
+	{
+		return this.ordersesForOShipAddrId;
+	}
+
+	public void setOrdersesForOShipAddrId(Set<IOrders> ordersesForOShipAddrId)
+	{
+		this.ordersesForOShipAddrId = ordersesForOShipAddrId;
+	}
+
+	@OneToMany( targetEntity=Customer.class, fetch = FetchType.LAZY, mappedBy = "address" )
+	public Set<ICustomer> getCustomers()
+	{
+		return this.customers;
+	}
+
+	public void setCustomers(Set<ICustomer> customers)
+	{
+		this.customers = customers;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
new file mode 100644
index 0000000..4f30f61
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
@@ -0,0 +1,160 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+/**
+ * Author generated by hbm2java
+ */
+@Entity
+@Table( name = "author", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Author implements IAuthor, Serializable
+{
+
+    private static final long serialVersionUID = 1L;
+
+	private Integer      aId;
+
+	private String      AFname;
+
+	private String      ALname;
+
+	private String      AMname;
+
+	private Date        ADob;
+
+	private String      ABio;
+
+	private Set<IItem> items = new HashSet<IItem>( 0 );
+
+	public Author()
+	{
+	}
+
+	public Author(String AFname, String ALname, String AMname, Date ADob,
+	        String ABio, Set<IItem> items)
+	{
+		this.AFname = AFname;
+		this.ALname = ALname;
+		this.AMname = AMname;
+		this.ADob = ADob;
+		this.ABio = ABio;
+		this.items = items;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "A_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAId()
+	{
+		return this.aId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.aId = AId;
+	}
+
+	@Column( name = "A_FNAME", length = 20 )
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Column( name = "A_LNAME", length = 20 )
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Column( name = "A_MNAME", length = 20 )
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "A_DOB", length = 19 )
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Column( name = "A_BIO", length = 65535 )
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	@OneToMany( targetEntity=Item.class, fetch = FetchType.LAZY, mappedBy = "author" )
+	public Set<IItem> getItems()
+	{
+		return this.items;
+	}
+
+	public void setItems(Set<IItem> items)
+	{
+		this.items = items;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
new file mode 100644
index 0000000..874defc
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
@@ -0,0 +1,191 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * CcXacts generated by hbm2java
+ */
+@Entity
+@Table( name = "cc_xacts", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class CcXacts implements ICcXacts
+{
+
+	private ICountry country;
+
+	private IOrders  orders;
+
+	private Integer  id;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private String  cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CX_ID", unique = true, nullable = false )
+	@Override
+	public Integer getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public void setId(Integer string)
+	{
+		this.id = string;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_O_ID", nullable = false )
+	@Override
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@Column( name = "CX_TYPE", length = 10 )
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Column( name = "CX_NUM" )
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Column( name = "CX_NAME", length = 31 )
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Column( name = "CX_EXPIRY", length = 10 )
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+	@Column( name = "CX_AUTH_ID", length = 15 )
+//	@OneToOne( targetEntity=Author.class, fetch=FetchType.EAGER)
+//	@JoinColumn( name="CX_AUTH_ID" )
+	@Override
+	public String getCxAuthId()
+	{
+		return this.cxAuthId;
+	}
+
+	@Override
+	public void setCxAuthId(String cxAuthId)
+	{
+		this.cxAuthId = cxAuthId;
+	}
+
+	@Column( name = "CX_XACT_AMT", precision = 15 )
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Column( name = "CX_XACT_DATE", length = 19 )
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_CO_ID", nullable = false)
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = country;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
new file mode 100644
index 0000000..0c674b1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
@@ -0,0 +1,136 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+
+/**
+ * Country generated by hbm2java
+ */
+@Entity
+@Table( name = "country", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Country implements ICountry
+{
+
+	private Integer      coId;
+
+	private String      coName;
+
+	private Double      coExchange;
+
+	private String      coCurrency;
+
+	private Set<IAddress> addresses = new HashSet<IAddress>( 0 );
+
+	private Set<ICcXacts> ccXactses = new HashSet<ICcXacts>( 0 );
+
+	public Country()
+	{
+	}
+
+	public Country(String coName, Double coExchange, String coCurrency,
+	        Set<IAddress> addresses, Set<ICcXacts> ccXactses)
+	{
+		this.coName = coName;
+		this.coExchange = coExchange;
+		this.coCurrency = coCurrency;
+		this.addresses = addresses;
+		this.ccXactses = ccXactses;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CO_ID", unique = true, nullable = false )
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Column( name = "CO_NAME", length = 50 )
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Column( name = "CO_EXCHANGE", precision = 22, scale = 0 )
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Column( name = "CO_CURRENCY", length = 18 )
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+	@OneToMany( targetEntity=Address.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<IAddress> getAddresses()
+	{
+		return this.addresses;
+	}
+
+	public void setAddresses(Set<IAddress> addresses)
+	{
+		this.addresses = addresses;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
new file mode 100644
index 0000000..5f36edf
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
@@ -0,0 +1,286 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Customer generated by hbm2java
+ */
+@Entity
+@Table( name = "customer", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Customer implements ICustomer
+{
+
+	private Integer      cId;
+
+	private IAddress    address;
+
+	private String      CUname;
+
+	private String      CPasswd;
+
+	private String      CFname;
+
+	private String      CLname;
+
+	private String      CPhone;
+
+	private String      CEmail;
+
+	private Date        CSince;
+
+	private Date        CLastVisit;
+
+	private Date        CLogin;
+
+	private Date        CExpiration;
+
+	private Double      CDiscount;
+
+	private Double      CBalance;
+
+	private Double      CYtdPmt;
+
+	private Date        CBirthdate;
+
+	private String      CData;
+
+	private Set<IOrders> orderses = new HashSet<IOrders>( 0 );
+
+	public Customer()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "C_ID", unique = true, nullable = false )
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER)
+	@JoinColumn( name = "C_ADDR_ID", nullable = false )
+	public IAddress getAddress()
+	{
+		return this.address;
+	}
+
+	public void setAddress(IAddress address)
+	{
+		this.address = address;
+	}
+
+	@Column( name = "C_UNAME", length = 20 )
+	public String getCUname()
+	{
+		return this.CUname;
+	}
+
+	public void setCUname(String CUname)
+	{
+		this.CUname = CUname;
+	}
+
+	@Column( name = "C_PASSWD", length = 20 )
+	public String getCPasswd()
+	{
+		return this.CPasswd;
+	}
+
+	public void setCPasswd(String CPasswd)
+	{
+		this.CPasswd = CPasswd;
+	}
+
+	@Column( name = "C_FNAME", length = 15 )
+	public String getCFname()
+	{
+		return this.CFname;
+	}
+
+	public void setCFname(String CFname)
+	{
+		this.CFname = CFname;
+	}
+
+	@Column( name = "C_LNAME", length = 15 )
+	public String getCLname()
+	{
+		return this.CLname;
+	}
+
+	public void setCLname(String CLname)
+	{
+		this.CLname = CLname;
+	}
+
+	@Column( name = "C_PHONE", length = 16 )
+	public String getCPhone()
+	{
+		return this.CPhone;
+	}
+
+	public void setCPhone(String CPhone)
+	{
+		this.CPhone = CPhone;
+	}
+
+	@Column( name = "C_EMAIL", length = 50 )
+	public String getCEmail()
+	{
+		return this.CEmail;
+	}
+
+	public void setCEmail(String CEmail)
+	{
+		this.CEmail = CEmail;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_SINCE", length = 10 )
+	public Date getCSince()
+	{
+		return this.CSince;
+	}
+
+	public void setCSince(Date CSince)
+	{
+		this.CSince = CSince;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_LAST_VISIT", length = 10 )
+	public Date getCLastVisit()
+	{
+		return this.CLastVisit;
+	}
+
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.CLastVisit = CLastVisit;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_LOGIN", length = 19 )
+	public Date getCLogin()
+	{
+		return this.CLogin;
+	}
+
+	public void setCLogin(Date CLogin)
+	{
+		this.CLogin = CLogin;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_EXPIRATION", length = 19 )
+	public Date getCExpiration()
+	{
+		return this.CExpiration;
+	}
+
+	public void setCExpiration(Date CExpiration)
+	{
+		this.CExpiration = CExpiration;
+	}
+
+	@Column( name = "C_DISCOUNT" )
+	public Double getCDiscount()
+	{
+		return this.CDiscount;
+	}
+
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.CDiscount = c_DISCOUNT;
+	}
+
+	@Column( name = "C_BALANCE" )
+	public Double getCBalance()
+	{
+		return this.CBalance;
+	}
+
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.CBalance = c_BALANCE;
+	}
+
+	@Column( name = "C_YTD_PMT" )
+	public Double getCYtdPmt()
+	{
+		return this.CYtdPmt;
+	}
+
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.CYtdPmt = c_YTD_PMT;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_BIRTHDATE", length = 10 )
+	public Date getCBirthdate()
+	{
+		return this.CBirthdate;
+	}
+
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.CBirthdate = CBirthdate;
+	}
+
+	@Column( name = "C_DATA", length = 65535 )
+	public String getCData()
+	{
+		return this.CData;
+	}
+
+	public void setCData(String CData)
+	{
+		this.CData = CData;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "customer" )
+	public Set<IOrders> getOrderses()
+	{
+		return this.orderses;
+	}
+
+	public void setOrderses(Set<IOrders> orderses)
+	{
+		this.orderses = orderses;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
new file mode 100644
index 0000000..edb455b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
@@ -0,0 +1,380 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.hibernate.annotations.Index;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * Item generated by hbm2java
+ */
+@Entity
+@Table( name = "item", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Item implements java.io.Serializable, IItem
+{
+
+	private static final long serialVersionUID  = 8806932749710043085L;
+
+	private Integer           IId;
+
+	private IAuthor           author;
+
+	private String            ITitle;
+
+	private Date              IPubDate;
+
+	private String            IPublisher;
+
+	private String            ISubject;
+
+	private String            IDesc;
+
+	private Integer           IRelated1;
+
+	private Integer           IRelated2;
+
+	private Integer           IRelated3;
+
+	private Integer           IRelated4;
+
+	private Integer           IRelated5;
+
+	private String            IThumbnail;
+
+	private String            IImage;
+
+	private Double            ISrp;
+
+	private Double            ICost;
+
+	private Date              IAvail;
+
+	private Integer           IStock;
+
+	private String            IIsbn;
+
+	private String            IPage;
+
+	private String            IBacking;
+
+	private String            IDimension;
+	
+	private double			  IRandom;
+
+	private Set<IOrderLine>       orderLines        = new HashSet<IOrderLine>( 0 );
+
+	private Set<IShoppingCartLine>       shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public Item()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "I_ID", unique = true, nullable = false )
+	public Integer getIId()
+	{
+		return this.IId;
+	}
+
+	public void setIId(Integer IId)
+	{
+		this.IId = IId;
+	}
+
+	@ManyToOne( targetEntity=Author.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "I_A_ID", nullable = false )
+	public IAuthor getAuthor()
+	{
+		return this.author;
+	}
+
+	public void setAuthor(IAuthor author)
+	{
+		this.author = author;
+	}
+
+	@Column( name = "I_TITLE", length = 60 )
+	public String getITitle()
+	{
+		return this.ITitle;
+	}
+
+	public void setITitle(String ITitle)
+	{
+		this.ITitle = ITitle;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_PUB_DATE", length = 19 )
+	public Date getIPubDate()
+	{
+		return this.IPubDate;
+	}
+
+	public void setIPubDate(Date IPubDate)
+	{
+		this.IPubDate = IPubDate;
+	}
+
+	@Column( name = "I_PUBLISHER", length = 60 )
+	public String getIPublisher()
+	{
+		return this.IPublisher;
+	}
+
+	public void setIPublisher(String IPublisher)
+	{
+		this.IPublisher = IPublisher;
+	}
+
+	@Column( name = "I_SUBJECT", length = 60 )
+	public String getISubject()
+	{
+		return this.ISubject;
+	}
+
+	public void setISubject(String ISubject)
+	{
+		this.ISubject = ISubject;
+	}
+
+	@Column( name = "I_DESC", length = 65535 )
+	public String getIDesc()
+	{
+		return this.IDesc;
+	}
+
+	public void setIDesc(String IDesc)
+	{
+		this.IDesc = IDesc;
+	}
+
+	@Column( name = "I_RELATED1" )
+	public Integer getIRelated1()
+	{
+		return this.IRelated1;
+	}
+
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.IRelated1 = IRelated1;
+	}
+
+	@Column( name = "I_RELATED2" )
+	public Integer getIRelated2()
+	{
+		return this.IRelated2;
+	}
+
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.IRelated2 = IRelated2;
+	}
+
+	@Column( name = "I_RELATED3" )
+	public Integer getIRelated3()
+	{
+		return this.IRelated3;
+	}
+
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.IRelated3 = IRelated3;
+	}
+
+	@Column( name = "I_RELATED4" )
+	public Integer getIRelated4()
+	{
+		return this.IRelated4;
+	}
+
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.IRelated4 = IRelated4;
+	}
+
+	@Column( name = "I_RELATED5" )
+	public Integer getIRelated5()
+	{
+		return this.IRelated5;
+	}
+
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.IRelated5 = IRelated5;
+	}
+
+	@Column( name = "I_THUMBNAIL", length = 60 )
+	public String getIThumbnail()
+	{
+		return this.IThumbnail;
+	}
+
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.IThumbnail = IThumbnail;
+	}
+
+	@Column( name = "I_IMAGE", length = 60 )
+	public String getIImage()
+	{
+		return this.IImage;
+	}
+
+	public void setIImage(String IImage)
+	{
+		this.IImage = IImage;
+	}
+
+	@Column( name = "I_SRP" )
+	public Double getISrp()
+	{
+		return this.ISrp;
+	}
+
+	public void setISrp(Double i_SRP)
+	{
+		this.ISrp = i_SRP;
+	}
+
+	@Column( name = "I_COST" )
+	public Double getICost()
+	{
+		return this.ICost;
+	}
+
+	public void setICost(Double i_COST)
+	{
+		this.ICost = i_COST;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_AVAIL", length = 19 )
+	public Date getIAvail()
+	{
+		return this.IAvail;
+	}
+
+	public void setIAvail(Date IAvail)
+	{
+		this.IAvail = IAvail;
+	}
+
+	@Column( name = "I_STOCK" )
+	public Integer getIStock()
+	{
+		return this.IStock;
+	}
+
+	public void setIStock(Integer IStock)
+	{
+		this.IStock = IStock;
+	}
+
+	@Column( name = "I_ISBN", length = 13 )
+	public String getIIsbn()
+	{
+		return this.IIsbn;
+	}
+
+	public void setIIsbn(String IIsbn)
+	{
+		this.IIsbn = IIsbn;
+	}
+
+	@Column( name = "I_PAGE", length = 4 )
+	public String getIPage()
+	{
+		return this.IPage;
+	}
+
+	public void setIPage(String IPage)
+	{
+		this.IPage = IPage;
+	}
+
+	@Column( name = "I_BACKING", length = 15 )
+	public String getIBacking()
+	{
+		return this.IBacking;
+	}
+
+	public void setIBacking(String IBacking)
+	{
+		this.IBacking = IBacking;
+	}
+
+	@Column( name = "I_DIMENSION", length = 25 )
+	public String getIDimension()
+	{
+		return this.IDimension;
+	}
+
+	public void setIDimension(String IDimension)
+	{
+		this.IDimension = IDimension;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IShoppingCartLine> getShoppingCartLines()
+	{
+		return this.shoppingCartLines;
+	}
+
+	public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		this.shoppingCartLines = shoppingCartLines;
+	}
+
+	@Override
+	@Column( name="I_RANDOM")
+    public double getIRandom()
+    {
+	    return IRandom;
+    }
+
+	@Override
+    public void setIRandom(double num)
+    {
+	    IRandom = num;	    
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
new file mode 100644
index 0000000..581a16a
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
@@ -0,0 +1,118 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * OrderLine generated by hbm2java
+ */
+@Entity
+@Table( name = "order_line", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class OrderLine implements IOrderLine
+{
+	private Integer     id;
+
+	private IOrders  orders;
+
+	private IItem    item;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+
+	public OrderLine()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "OL_ID", unique = true, nullable = false )
+	public Integer getOlId()
+	{
+		return this.id;
+	}
+
+	public void setOlId(Integer olId)
+	{
+		this.id = olId;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_O_ID", nullable = false )
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_I_ID", nullable = false )
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "OL_QTY" )
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Column( name = "OL_DISCOUNT" )
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Column( name = "OL_COMMENT", length = 100 )
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
new file mode 100644
index 0000000..0c41b86
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
@@ -0,0 +1,220 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Entity
+@Table( name = "orders", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Orders implements IOrders
+{
+
+	private Integer      id;
+
+	private IAddress     addressByOShipAddrId;
+
+	private ICustomer    customer;
+
+	private IAddress     addressByOBillAddrId;
+
+	private Date        ODate;
+
+	private Double      OSubTotal;
+
+	private Double      OTax;
+
+	private Double      OTotal;
+
+	private String      OShipType;
+
+	private Date        OShipDate;
+
+	private String      OStatus;
+
+	private Set<ICcXacts> ccXactses  = new HashSet<ICcXacts>( 0 );
+
+	private Set<IOrderLine> orderLines = new HashSet<IOrderLine>( 0 );
+
+	public Orders()
+	{
+
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "O_ID", unique = true, nullable = false )
+	public Integer getOId()
+	
+	{
+		return this.id;
+	}
+
+	public void setOId(Integer OId)
+	{
+		this.id = OId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_SHIP_ADDR_ID", nullable = false )
+	public IAddress getAddressByOShipAddrId()
+	{
+		return this.addressByOShipAddrId;
+	}
+
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId;
+	}
+
+	@ManyToOne( targetEntity=Customer.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_C_ID", nullable = false )
+	public ICustomer getCustomer()
+	{
+		return this.customer;
+	}
+
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_BILL_ADDR_ID", nullable = false )
+	public IAddress getAddressByOBillAddrId()
+	{
+		return this.addressByOBillAddrId;
+	}
+
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_DATE", length = 19 )
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+
+	@Column( name = "O_SUB_TOTAL" )
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Column( name = "O_TAX" )
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Column( name = "O_TOTAL" )
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Column( name = "O_SHIP_TYPE", length = 10 )
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_SHIP_DATE", length = 19 )
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+
+	@Column( name = "O_STATUS", length = 15 )
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
new file mode 100644
index 0000000..c1d1af5
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+/**
+ * ShoppingCart generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class ShoppingCart implements IShoppingCart
+{
+	private Integer scId;
+
+	private Date    scTime;
+	
+	private Set<IShoppingCartLine> shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "shoppingCart" )
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+    	return shoppingCartLines;
+    }
+
+    public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+    {
+    	this.shoppingCartLines = shoppingCartLines;
+    }
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SC_ID", unique = true, nullable = false )
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "SC_TIME", length = 19 )
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
new file mode 100644
index 0000000..d993052
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
@@ -0,0 +1,99 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * ShoppingCartLine generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart_line", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class ShoppingCartLine implements IShoppingCartLine
+{
+	private Integer sclId;
+
+	private IItem    item;
+
+	private Integer sclQty;
+	
+	private IShoppingCart shoppingCart;	
+
+	public ShoppingCartLine()
+	{
+	}
+	
+	@ManyToOne( targetEntity=ShoppingCart.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "SCL_SC_ID", nullable = false )
+	@Override
+    public IShoppingCart getShoppingCart()
+    {
+    	return shoppingCart;
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart;
+    }
+
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SCL_ID", unique = true, nullable = false )
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId( Integer sclScId )
+	{
+		this.sclId = sclScId;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "SCL_I_ID", nullable = false )
+	@Override
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "SCL_QTY" )
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
new file mode 100644
index 0000000..21df49c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
@@ -0,0 +1,40 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Set;
+
+
+
+public interface IAddress
+{
+
+	public Integer getAddrId();
+
+	public void setAddrId(Integer addrId);
+
+	public  ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public String getAddrStreet1();
+
+	public void setAddrStreet1(String addrStreet1);
+
+	public String getAddrStreet2();
+
+	public void setAddrStreet2(String addrStreet2);
+
+	public String getAddrCity();
+
+	public void setAddrCity(String addrCity);
+
+	public String getAddrState();
+
+	public void setAddrState(String addrState);
+
+	public String getAddrZip();
+
+	public void setAddrZip(String addrZip);
+
+	public Set<ICustomer> getCustomers();
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
new file mode 100644
index 0000000..a1ebe5a
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
@@ -0,0 +1,34 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface IAuthor
+{
+
+	public Integer getAId();
+
+	public void setAId(Integer AId);
+
+	public String getAFname();
+
+	public void setAFname(String AFname);
+
+	public String getALname();
+
+	public void setALname(String ALname);
+
+	public String getAMname();
+
+	public void setAMname(String AMname);
+
+	public Date getADob();
+
+	public void setADob(Date ADob);
+
+	public String getABio();
+
+	public void setABio(String ABio);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
new file mode 100644
index 0000000..c695622
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
@@ -0,0 +1,50 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface ICcXacts
+{
+
+	public Integer getId();
+
+	public void setId(Integer id);
+
+	public ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public IOrders getOrders();
+
+	public String getCxType();
+
+	public void setCxType(String cxType);
+
+	public Integer getCxNum();
+
+	public void setCxNum(Integer cxNum);
+
+	public String getCxName();
+
+	public void setCxName(String cxName);
+
+	public Date getCxExpiry();
+
+	public void setCxExpiry(Date cxExpiry);
+
+	public String getCxAuthId();
+
+	public void setCxAuthId(String cxAuthId);
+
+	public Double getCxXactAmt();
+
+	public void setCxXactAmt(Double o_TOTAL);
+
+	public Date getCxXactDate();
+
+	public void setCxXactDate(Date cxXactDate);
+
+	public void setOrders(IOrders orders);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
new file mode 100644
index 0000000..376b67c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
@@ -0,0 +1,23 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface ICountry
+{
+
+	public Integer getCoId();
+
+	public void setCoId(Integer coId);
+
+	public String getCoName();
+
+	public void setCoName(String coName);
+
+	public Double getCoExchange();
+
+	public void setCoExchange(Double coExchange);
+
+	public String getCoCurrency();
+
+	public void setCoCurrency(String coCurrency);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
new file mode 100644
index 0000000..4046c24
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface ICustomer
+{
+
+	public Integer getCId();
+
+	public void setCId(Integer CId);
+
+	public IAddress getAddress();
+
+	public void setAddress(IAddress address);
+
+	public String getCUname();
+
+	public void setCUname(String CUname);
+
+	public String getCPasswd();
+
+	public void setCPasswd(String CPasswd);
+
+	public String getCFname();
+
+	public void setCFname(String CFname);
+
+	public String getCLname();
+
+	public void setCLname(String CLname);
+
+	public String getCPhone();
+
+	public void setCData(String CData);
+
+	public String getCData();
+
+	public void setCBirthdate(Date CBirthdate);
+
+	public Date getCBirthdate();
+
+	public void setCYtdPmt(Double c_YTD_PMT);
+
+	public Double getCYtdPmt();
+
+	public void setCBalance(Double c_BALANCE);
+
+	public Double getCBalance();
+
+	public void setCDiscount(double c_DISCOUNT);
+
+	public Double getCDiscount();
+
+	public void setCExpiration(Date CExpiration);
+
+	public Date getCExpiration();
+
+	public void setCLogin(Date CLogin);
+
+	public Date getCLogin();
+
+	public void setCLastVisit(Date CLastVisit);
+
+	public Date getCLastVisit();
+
+	public void setCSince(Date CSince);
+
+	public Date getCSince();
+
+	public void setCEmail(String CEmail);
+
+	public String getCEmail();
+
+	public void setCPhone(String CPhone);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IItem.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
new file mode 100644
index 0000000..700e485
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
@@ -0,0 +1,100 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface IItem
+{
+
+	public Integer getIId();
+
+	public void setIDimension(String IDimension);
+
+	public String getIDimension();
+
+	public void setIBacking(String IBacking);
+
+	public String getIBacking();
+
+	public void setIPage(String IPage);
+
+	public String getIPage();
+
+	public void setIIsbn(String IIsbn);
+
+	public String getIIsbn();
+
+	public void setIStock(Integer IStock);
+
+	public Integer getIStock();
+
+	public void setIAvail(Date IAvail);
+
+	public Date getIAvail();
+
+	public void setICost(Double i_COST);
+
+	public Double getICost();
+
+	public void setISrp(Double i_SRP);
+
+	public Double getISrp();
+
+	public void setIImage(String IImage);
+
+	public String getIImage();
+
+	public void setIThumbnail(String IThumbnail);
+
+	public String getIThumbnail();
+
+	public void setIRelated5(Integer IRelated5);
+
+	public Integer getIRelated5();
+
+	public void setIRelated4(Integer IRelated4);
+
+	public Integer getIRelated4();
+
+	public void setIRelated3(Integer IRelated3);
+
+	public Integer getIRelated3();
+
+	public void setIRelated2(Integer IRelated2);
+
+	public Integer getIRelated2();
+
+	public void setIRelated1(Integer IRelated1);
+
+	public Integer getIRelated1();
+
+	public void setIDesc(String IDesc);
+
+	public String getIDesc();
+
+	public void setISubject(String ISubject);
+
+	public String getISubject();
+
+	public void setIPublisher(String IPublisher);
+
+	public String getIPublisher();
+
+	public void setIPubDate(Date IPubDate);
+
+	public Date getIPubDate();
+
+	public void setITitle(String ITitle);
+
+	public String getITitle();
+
+	public void setAuthor(IAuthor author);
+
+	public IAuthor getAuthor();
+
+	public void setIId(Integer IId);
+	
+	public double getIRandom();
+	
+	public void setIRandom(double num);
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
new file mode 100644
index 0000000..581c9c8
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
@@ -0,0 +1,31 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface IOrderLine
+{
+
+	public Integer getOlId();
+
+	public void setOlId(Integer olId);
+
+	public IOrders getOrders();
+
+	public void setOrders(IOrders orders);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getOlQty();
+
+	public void setOlQty(Integer olQty);
+
+	public Double getOlDiscount();
+
+	public void setOlDiscount(Double oL_DISCOUNT);
+
+	public String getOlComment();
+
+	public void setOlComment(String olComment);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
new file mode 100644
index 0000000..6b0ad44
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+public interface IOrders
+{
+
+	public Integer getOId();
+
+	public void setOId(Integer OId);
+
+	IAddress getAddressByOShipAddrId();
+
+	void setAddressByOShipAddrId(IAddress addressByOShipAddrId);
+
+	ICustomer getCustomer();
+
+	void setCustomer(ICustomer customer);
+
+	IAddress getAddressByOBillAddrId();
+
+	void setAddressByOBillAddrId(IAddress addressByOBillAddrId);
+
+
+	void setOStatus(String OStatus);
+
+	String getOStatus();
+
+	void setOShipDate(Date OShipDate);
+
+	Date getOShipDate();
+
+	void setOShipType(String OShipType);
+
+	String getOShipType();
+
+	void setOTotal(double o_TOTAL);
+
+	Double getOTotal();
+
+	void setOTax(Double o_TAX);
+
+	Double getOTax();
+
+	void setOSubTotal(Double o_SUB_TOTAL);
+
+	Double getOSubTotal();
+
+	void setODate(Date ODate);
+
+	Date getODate();
+
+	public Set<IOrderLine> getOrderLines();
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
new file mode 100644
index 0000000..7b69ab3
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+
+public interface IShoppingCart
+{
+
+	public void setScTime(Date scTime);
+
+	public Date getScTime();
+
+	public void setScId(Integer scId);
+
+	public Integer getScId();
+
+	public Set<IShoppingCartLine> getShoppingCartLines();
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
new file mode 100644
index 0000000..3a8b308
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
@@ -0,0 +1,24 @@
+package eu.cloudscale.showcase.db.model;
+
+
+
+public interface IShoppingCartLine
+{
+
+	public IShoppingCart getShoppingCart();
+
+	public void setShoppingCart(IShoppingCart shoppingCart);
+
+	public Integer getSclId();
+
+	public void setSclId(Integer sclScId);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getSclQty();
+
+	public void setSclQty(Integer sclQty);
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
new file mode 100644
index 0000000..ad0d4d1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
@@ -0,0 +1,161 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "address" )
+public class Address implements IAddress, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//	private MongoService service;
+//	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 926688150220849693L;
+
+	@Id
+	private ObjectId      id;
+	
+	@Indexed
+	private Integer       addrId;
+
+	private Integer		  coId;
+
+	private String        addrStreet1;
+
+	private String        addrStreet2;
+
+	private String        addrCity;
+
+	private String        addrState;
+
+	private String        addrZip;
+	
+	public Address()
+	{
+		
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAddrId()
+	{
+		return addrId;
+	}
+
+	@Override
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryById(this.coId);
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.coId = country.getCoId();
+	}
+
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@Override
+    public Set<ICustomer> getCustomers()
+    {
+		if( this.addrId == null )
+			return new HashSet<ICustomer>(0);
+		
+		IAddress address = DatabaseHelper.getDatabase().findAddressById( this.addrId );
+		return new HashSet<ICustomer>(DatabaseHelper.getDatabase().findCustomerByAddress( address )); 
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
new file mode 100644
index 0000000..d1129a0
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
@@ -0,0 +1,137 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+@Document( collection = "author" )
+public class Author implements IAuthor, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = -658143403409650089L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  authorId;
+
+	private String   AFname;
+
+	private String   ALname;
+
+	private String   AMname;
+
+	private Date     ADob;
+
+	private String   ABio;
+
+	private String   lNameSoundex;
+
+	public Author()
+	{
+
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAId()
+	{
+		return this.authorId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.authorId = AId;
+	}
+
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	public String getlNameSoundex()
+	{
+		return lNameSoundex;
+	}
+
+	public void setlNameSoundex(String lNameSoundex)
+	{
+		this.lNameSoundex = lNameSoundex;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
new file mode 100644
index 0000000..5351530
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
@@ -0,0 +1,185 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "ccxacts" )
+public class CcXacts implements ICcXacts, Serializable
+{
+
+//	@Autowired
+//	@Qualifier("service")
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -8752879558532267562L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer   ccXactsId;
+
+	private Integer cxCoId;
+
+	private Integer cxOId;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private String cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+	
+	public CcXacts()
+	{
+	}
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getId()
+	{
+		return this.ccXactsId;
+	}
+
+	@Override
+	public void setId(Integer id)
+	{
+		this.ccXactsId = id;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryById( this.cxCoId );
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.cxCoId = country.getCoId();
+	}
+
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().findOrdersById( this.cxOId );
+	}
+
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+	@Override
+	public String getCxAuthId()
+	{
+		return this.cxAuthId;
+	}
+
+	@Override
+	public void setCxAuthId(String cxAuthId)
+	{
+		this.cxAuthId = cxAuthId;
+	}
+
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.cxOId = orders.getOId();
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
new file mode 100644
index 0000000..5bf2f63
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
@@ -0,0 +1,96 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+@Document( collection = "country" )
+public class Country implements ICountry, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 2938841459454938022L;
+
+	@Id
+	private ObjectId      id;
+
+	@Indexed
+	private Integer        coId;
+
+	@Indexed
+	private String        coName;
+
+	private Double        coExchange;
+
+	private String        coCurrency;
+
+	public Country()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
new file mode 100644
index 0000000..6ff68ab
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
@@ -0,0 +1,287 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "customer" )
+public class Customer implements ICustomer, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+//	
+    private static final long serialVersionUID = 1920560375336316671L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  cId;
+
+	@Indexed
+	private Integer  addrId;
+
+	private String   cUname;
+
+	private String   cPasswd;
+
+	private String   cFname;
+
+	private String   cLname;
+
+	private String   cPhone;
+
+	private String   cEmail;
+
+	private Date     cSince;
+
+	private Date     cLastVisit;
+
+	private Date     cLogin;
+
+	private Date     cExpiration;
+
+	private Double   cDiscount;
+
+	private Double   cBalance;
+
+	private Double   cYtdPmt;
+
+	private Date     cBirthdate;
+
+	private String   cData;
+	
+	public Customer()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	@Override
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@Override
+	public IAddress getAddress()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( addrId );
+	}
+
+	@Override
+	public void setAddress(IAddress address)
+	{
+		this.addrId = address.getAddrId();
+	}
+
+	@Override
+	public String getCUname()
+	{
+		return this.cUname;
+	}
+
+	@Override
+	public void setCUname(String CUname)
+	{
+		this.cUname = CUname;
+	}
+
+	@Override
+	public String getCPasswd()
+	{
+		return this.cPasswd;
+	}
+
+	@Override
+	public void setCPasswd(String CPasswd)
+	{
+		this.cPasswd = CPasswd;
+	}
+
+	@Override
+	public String getCFname()
+	{
+		return this.cFname;
+	}
+
+	@Override
+	public void setCFname(String CFname)
+	{
+		this.cFname = CFname;
+	}
+
+	@Override
+	public String getCLname()
+	{
+		return this.cLname;
+	}
+
+	@Override
+	public void setCLname(String CLname)
+	{
+		this.cLname = CLname;
+	}
+
+	@Override
+	public String getCPhone()
+	{
+		return this.cPhone;
+	}
+
+	@Override
+	public void setCPhone(String CPhone)
+	{
+		this.cPhone = CPhone;
+	}
+
+	@Override
+	public String getCEmail()
+	{
+		return this.cEmail;
+	}
+
+	@Override
+	public void setCEmail(String CEmail)
+	{
+		this.cEmail = CEmail;
+	}
+
+	@Override
+	public Date getCSince()
+	{
+		return this.cSince;
+	}
+
+	@Override
+	public void setCSince(Date CSince)
+	{
+		this.cSince = CSince;
+	}
+
+	@Override
+	public Date getCLastVisit()
+	{
+		return this.cLastVisit;
+	}
+
+	@Override
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.cLastVisit = CLastVisit;
+	}
+
+	@Override
+	public Date getCLogin()
+	{
+		return this.cLogin;
+	}
+
+	@Override
+	public void setCLogin(Date CLogin)
+	{
+		this.cLogin = CLogin;
+	}
+
+	@Override
+	public Date getCExpiration()
+	{
+		return this.cExpiration;
+	}
+
+	@Override
+	public void setCExpiration(Date CExpiration)
+	{
+		this.cExpiration = CExpiration;
+	}
+
+	@Override
+	public Double getCDiscount()
+	{
+		return this.cDiscount;
+	}
+
+	@Override
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.cDiscount = c_DISCOUNT;
+	}
+
+	@Override
+	public Double getCBalance()
+	{
+		return this.cBalance;
+	}
+
+	@Override
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.cBalance = c_BALANCE;
+	}
+
+	@Override
+	public Double getCYtdPmt()
+	{
+		return this.cYtdPmt;
+	}
+
+	@Override
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.cYtdPmt = c_YTD_PMT;
+	}
+
+	@Override
+	public Date getCBirthdate()
+	{
+		return this.cBirthdate;
+	}
+
+	@Override
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.cBirthdate = CBirthdate;
+	}
+
+	@Override
+	public String getCData()
+	{
+		return this.cData;
+	}
+
+	@Override
+	public void setCData(String CData)
+	{
+		this.cData = CData;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
new file mode 100644
index 0000000..a14b300
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
@@ -0,0 +1,405 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "item" )
+public class Item implements IItem, Serializable
+{
+
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = -1311610290364285271L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  iId;
+
+	private Integer  authId;
+
+	private String   iTitle;
+
+	private Date     iPubDate;
+
+	private String   iPublisher;
+
+	private String   iSubject;
+
+	private String   iDesc;
+
+	private Integer  iRelated1;
+
+	private Integer  iRelated2;
+
+	private Integer  iRelated3;
+
+	private Integer  iRelated4;
+
+	private Integer  iRelated5;
+
+	private String   iThumbnail;
+
+	private String   iImage;
+
+	private Double   iSrp;
+
+	private Double   iCost;
+
+	private Date     iAvail;
+
+	private Integer  iStock;
+
+	private String   iIsbn;
+
+	private String   iPage;
+
+	private String   iBacking;
+
+	private String   iDimension;
+
+	private Integer  olQty;
+
+	/* for random selection */
+	private double   iRandom;
+	
+	private String iTitleSoundex;
+
+	public Integer getOlQty()
+	{
+		return olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	
+    public String getiTitleSoundex()
+    {
+    	return iTitleSoundex;
+    }
+
+	
+    public void setiTitleSoundex(String iTitleSoundex)
+    {
+    	this.iTitleSoundex = iTitleSoundex;
+    }
+
+	@Override
+	public Integer getIId()
+	{
+		return this.iId;
+	}
+
+	@Override
+	public void setIId(Integer IId)
+	{
+		this.iId = IId;
+	}
+
+	@Override
+	public IAuthor getAuthor()
+	{
+		return DatabaseHelper.getDatabase().findAuthorById( this.authId );
+	}
+
+	@Override
+	public void setAuthor(IAuthor author)
+	{
+		this.setAuthId( author.getAId() );
+	}
+
+	@Override
+	public String getITitle()
+	{
+		return this.iTitle;
+	}
+
+	@Override
+	public void setITitle(String ITitle)
+	{
+		this.iTitle = ITitle;
+	}
+
+	@Override
+	public Date getIPubDate()
+	{
+		return this.iPubDate;
+	}
+
+	@Override
+	public void setIPubDate(Date IPubDate)
+	{
+		this.iPubDate = IPubDate;
+	}
+
+	@Override
+	public String getIPublisher()
+	{
+		return this.iPublisher;
+	}
+
+	@Override
+	public void setIPublisher(String IPublisher)
+	{
+		this.iPublisher = IPublisher;
+	}
+
+	@Override
+	public String getISubject()
+	{
+		return this.iSubject;
+	}
+
+	@Override
+	public void setISubject(String ISubject)
+	{
+		this.iSubject = ISubject;
+	}
+
+	@Override
+	public String getIDesc()
+	{
+		return this.iDesc;
+	}
+
+	@Override
+	public void setIDesc(String IDesc)
+	{
+		this.iDesc = IDesc;
+	}
+
+	@Override
+	public Integer getIRelated1()
+	{
+		return this.iRelated1;
+	}
+
+	@Override
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.iRelated1 = IRelated1;
+	}
+
+	@Override
+	public Integer getIRelated2()
+	{
+		return this.iRelated2;
+	}
+
+	@Override
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.iRelated2 = IRelated2;
+	}
+
+	@Override
+	public Integer getIRelated3()
+	{
+		return this.iRelated3;
+	}
+
+	@Override
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.iRelated3 = IRelated3;
+	}
+
+	@Override
+	public Integer getIRelated4()
+	{
+		return this.iRelated4;
+	}
+
+	@Override
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.iRelated4 = IRelated4;
+	}
+
+	@Override
+	public Integer getIRelated5()
+	{
+		return this.iRelated5;
+	}
+
+	@Override
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.iRelated5 = IRelated5;
+	}
+
+	@Override
+	public String getIThumbnail()
+	{
+		return this.iThumbnail;
+	}
+
+	@Override
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.iThumbnail = IThumbnail;
+	}
+
+	@Override
+	public String getIImage()
+	{
+		return this.iImage;
+	}
+
+	@Override
+	public void setIImage(String IImage)
+	{
+		this.iImage = IImage;
+	}
+
+	@Override
+	public Double getISrp()
+	{
+		return this.iSrp;
+	}
+
+	@Override
+	public void setISrp(Double i_SRP)
+	{
+		this.iSrp = i_SRP;
+	}
+
+	@Override
+	public Double getICost()
+	{
+		return this.iCost;
+	}
+
+	@Override
+	public void setICost(Double i_COST)
+	{
+		this.iCost = i_COST;
+	}
+
+	@Override
+	public Date getIAvail()
+	{
+		return this.iAvail;
+	}
+
+	@Override
+	public void setIAvail(Date IAvail)
+	{
+		this.iAvail = IAvail;
+	}
+
+	@Override
+	public Integer getIStock()
+	{
+		return this.iStock;
+	}
+
+	@Override
+	public void setIStock(Integer IStock)
+	{
+		this.iStock = IStock;
+	}
+
+	@Override
+	public String getIIsbn()
+	{
+		return this.iIsbn;
+	}
+
+	@Override
+	public void setIIsbn(String IIsbn)
+	{
+		this.iIsbn = IIsbn;
+	}
+
+	@Override
+	public String getIPage()
+	{
+		return this.iPage;
+	}
+
+	@Override
+	public void setIPage(String IPage)
+	{
+		this.iPage = IPage;
+	}
+
+	@Override
+	public String getIBacking()
+	{
+		return this.iBacking;
+	}
+
+	@Override
+	public void setIBacking(String IBacking)
+	{
+		this.iBacking = IBacking;
+	}
+
+	@Override
+	public String getIDimension()
+	{
+		return this.iDimension;
+	}
+
+	@Override
+	public void setIDimension(String IDimension)
+	{
+		this.iDimension = IDimension;
+	}
+
+	@Override
+	public double getIRandom()
+	{
+		return iRandom;
+	}
+
+	@Override
+	public void setIRandom(double iRandom)
+	{
+		this.iRandom = iRandom;
+	}
+
+	public Integer getAuthId()
+	{
+		return authId;
+	}
+
+	public void setAuthId(Integer authId)
+	{
+		this.authId = authId;
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
new file mode 100644
index 0000000..16d08b8
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
@@ -0,0 +1,134 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orderLine")
+public class OrderLine implements IOrderLine, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -6695288937139715783L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer    olId;
+
+	private Integer orderId;
+
+	private Integer itemId;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+	
+
+	public OrderLine()
+	{
+		
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOlId()
+	{
+		return this.olId;
+	}
+
+	@Override
+	public void setOlId(Integer olId)
+	{
+		this.olId = olId;
+	}
+	
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().findOrdersById( orderId );
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orderId = orders.getOId();
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		return DatabaseHelper.getDatabase().findItemById( this.itemId );
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.itemId = item.getIId();
+	}
+
+	@Override
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	@Override
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Override
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	@Override
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Override
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	@Override
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
new file mode 100644
index 0000000..bc4cfb1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
@@ -0,0 +1,265 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orders")
+public class Orders implements IOrders, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -4867580403414098274L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer        oId;
+
+	private Integer addressByOShipAddrId;
+	
+	private Integer       customer;
+
+	private Integer addressByOBillAddrId;
+
+	private Date           ODate;
+
+	private Double        OSubTotal;
+
+	private Double        OTax;
+
+	private Double 		OTotal;
+
+	private String         OShipType;
+
+	private Date           OShipDate;
+
+	private String         OStatus;
+	
+	private List<Integer> ccXactIds;
+
+	private List<Integer> orderLinesIds;
+	
+	public Orders()
+	{
+
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOId()
+	{
+		return this.oId;
+	}
+	
+	@Override
+	public void setOId(Integer OId)
+	{
+		this.oId = OId;
+	}
+
+	@Override
+	public IAddress getAddressByOShipAddrId()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( this.addressByOShipAddrId );
+	}
+	
+	@Override
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId.getAddrId();
+	}
+
+	@Override
+	public ICustomer getCustomer()
+	{
+		return DatabaseHelper.getDatabase().findCustomerById( this.customer );
+	}
+
+	@Override
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer.getCId();
+	}
+
+	@Override
+	public IAddress getAddressByOBillAddrId()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( this.addressByOBillAddrId );
+	}
+
+	@Override
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId.getAddrId();
+	}
+
+	@Override
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	@Override
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+	
+	@Override
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	@Override
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Override
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+	
+	@Override
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Override
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	@Override
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Override
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	@Override
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Override
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	@Override
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+	
+	@Override
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	@Override
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@Override
+    public HashSet<IOrderLine> getOrderLines()
+    {
+		HashSet<IOrderLine> orderLinesSet = new HashSet<IOrderLine>();
+		if ( this.orderLinesIds != null )
+		{
+    		for( Integer olId : this.orderLinesIds )
+    		{
+    			IOrderLine orderLine = DatabaseHelper.getDatabase().findOrderLineById(olId);
+    			orderLinesSet.add(orderLine);
+    		}	
+    	}
+		
+		return orderLinesSet;
+    }
+
+	public void setCcXactses(HashSet<ICcXacts> ccXacts)
+    {
+	    ArrayList<Integer> ccXactIds = new ArrayList<Integer>();
+	    for(ICcXacts ccXact : ccXacts)
+	    {
+	    	ccXactIds.add(ccXact.getId());
+	    }
+	    this.ccXactIds = ccXactIds;
+    }
+
+	public void setOrderLines(HashSet<IOrderLine> set)
+    {
+	    ArrayList<Integer> list = new ArrayList<Integer>();
+	    for (IOrderLine ol : set)
+	    {
+	    	list.add(ol.getOlId());
+	    }
+	    this.orderLinesIds = list;
+    }
+
+	public HashSet<ICcXacts> getCcXactses()
+    {
+		HashSet<ICcXacts> set = new HashSet<ICcXacts>();
+		for(Integer ccXactId : this.ccXactIds)
+		{
+			ICcXacts ccXact = DatabaseHelper.getDatabase().findCcXactsById( ccXactId );
+			set.add(ccXact);
+		}
+		
+		return set;
+    }
+	
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
new file mode 100644
index 0000000..35316e7
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
@@ -0,0 +1,96 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "shoppingCart" )
+public class ShoppingCart implements IShoppingCart, Serializable
+{
+//
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = -235081098185134853L;
+
+	@Id
+	private ObjectId               id;
+
+	@Indexed
+	private Integer                scId;
+
+	private Date                   scTime;
+	
+	
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@Override
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+		List  res = DatabaseHelper.getDatabase().findAllShoppingCartLinesBySC( this );
+		if( res == null || res.isEmpty() )
+			return new HashSet<IShoppingCartLine>();
+		
+		return new HashSet<IShoppingCartLine>(res);
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
new file mode 100644
index 0000000..0fa8813
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
@@ -0,0 +1,101 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Component
+@Document( collection = "shoppingCartLine" )
+public class ShoppingCartLine implements IShoppingCartLine, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = 767045854888711002L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer sclId;
+
+	private Integer item;
+
+	private Integer sclQty;
+	
+	private Integer shoppingCart;
+	
+	public ShoppingCartLine()
+	{
+	}
+
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public IShoppingCart getShoppingCart()
+    {
+    	return DatabaseHelper.getDatabase().findShoppingCartById( shoppingCart );
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart.getScId();
+    }
+
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId(Integer sclScId)
+	{
+		this.sclId = sclScId;
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		IItem item = DatabaseHelper.getDatabase().findItemById( this.item );
+		return item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item.getIId();
+	}
+
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/AService.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/AService.java
new file mode 100644
index 0000000..cfb4da2
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/AService.java
@@ -0,0 +1,630 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.dao.mongo.impl.ShoppingCartDaoImpl;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Transactional(readOnly=true)
+public abstract class AService implements IService
+{	
+	@Autowired
+    protected IAddressDao addressDao;
+	
+	@Autowired
+	protected IAuthorDao authorDao;
+	
+	@Autowired
+	protected ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	protected ICountryDao countryDao;
+	
+	@Autowired
+	protected ICustomerDao customerDao;
+	
+	@Autowired
+    protected IItemDao itemDao;
+	
+	@Autowired
+    protected IOrderLineDao orderLineDao;
+	
+	@Autowired
+    protected IOrdersDao ordersDao;
+	
+	@Autowired
+    protected IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	protected IShoppingCartLineDao shoppingCartLineDao;
+	
+	@Override
+	@Transactional(readOnly=false)
+    public IShoppingCart createEmptyCart()
+    {
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = new ShoppingCart();
+		sc.setScTime( new Date() );
+		//getCurrentSession().saveOrUpdate(sc);
+		scDao.shrani( sc );
+		
+		return sc;
+    }
+	
+	@SuppressWarnings( "rawtypes" )
+	@Override
+	@Cacheable("newProducts")
+	public List getNewProducts(String category)
+	{
+		System.out.println("getNewProducts(" + category + ") called!");
+		return itemDao.getNewProducts( category );
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public IShoppingCart doCart(IShoppingCart sc, Integer itemId,
+	        List<Integer> ids, List<Integer> quantities)
+	{
+
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		IShoppingCartDao scDao = shoppingCartDao;
+
+		if ( itemId != null )
+		{
+			addItem( sc, itemDao.findById( itemId.intValue() ) );
+		}
+
+		refreshCart( sc, ids, quantities );
+		addRandomItemToCartIfNecessary( sclDao, sc );
+		resetCartTime( sclDao, sc );
+
+		return sc;
+	}
+	
+	protected void resetCartTime(IShoppingCartLineDao sclDao, IShoppingCart sc)
+	{
+		try 
+		{
+			IShoppingCartDao scDao = shoppingCartDao;
+			sc.setScTime( new Date() );
+  			scDao.shrani( sc );
+		}
+		catch(Exception e)
+		{
+			System.out.println("ShoppingId = " + sc.getScId());
+			e.printStackTrace();
+		}
+	}
+	
+//	@Transactional(readOnly=false)
+	protected void addRandomItemToCartIfNecessary(IShoppingCartLineDao sclDao,
+	        IShoppingCart sc)
+	{
+		// check and see if the cart is empty. If it's not, we do
+		// nothing.
+
+		try
+		{
+			// Check to see if the cart is empty
+			if ( sc.getShoppingCartLines().size() == 0 )
+			{
+				// Cart is empty
+				addItem( sc, itemDao.getRandomItem() );
+			}
+
+		}
+		catch ( java.lang.Exception ex )
+		{
+			ex.printStackTrace();
+		}
+	}
+	
+	protected IShoppingCart getCart(Integer shoppingId, double discount)
+	{
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = scDao.findById( shoppingId );
+		return sc;
+	}
+
+	// protected void addRandomItemToCartIfNecessary(
+	// IShoppingCartLineDao sclDao, Integer shoppingId)
+	// {
+	// IItemDao itemDao = getItemDaoImpl();
+	//
+	// if ( sclDao.isCartEmpty( shoppingId ) )
+	// {
+	// IItem randItem = itemDao.getRandomItem();
+	// // related_item = getRelated1(sclDao, shoppingId, randItem);
+	// addItem( shoppingId, randItem );
+	// }
+	//
+	// }
+
+	// protected IItem getRelated1(IShoppingCartLineDao<IShoppingCartLine>
+	// sclDao,
+	// Integer shoppingId,
+	// IItem randItem)
+	// {
+	// IItemDao<IItem> itemDao = getItemDaoImpl();
+	// IItem relatedItem = itemDao.getRelated1( randItem );
+	// return relatedItem;
+	// }
+
+//	@Transactional(readOnly=false)
+	protected void refreshCart(IShoppingCart sc, List<Integer> ids,
+	        List<Integer> quantities)
+	{
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		for ( int i = 0; i < ids.size(); i++ )
+		{
+			int itemId = ids.get( i );
+			int QTY = quantities.get( i );
+			IShoppingCartLine scl = sclDao.getBySCandItem( sc.getScId(), itemId );
+			if ( QTY == 0 )
+			{
+				sclDao.delete( scl );
+			}
+			else
+			{
+				scl.setSclQty( QTY );
+				sclDao.shrani( scl );
+			}
+		}
+
+	}
+
+//	@Transactional(readOnly=false)
+	protected void addItem(IShoppingCart sc, IItem item)
+	{
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		IShoppingCartDao scDao = shoppingCartDao;
+
+		IShoppingCartLine scl = sclDao.getBySCandItem( sc.getScId(),
+		        item.getIId() );
+
+		if ( scl != null )
+		{
+			scl.setSclQty( scl.getSclQty() + 1 );
+			sclDao.shrani( scl );
+		}
+		else
+		{
+			scl = sclDao.getObject();
+			scl.setItem( item );
+			scl.setSclQty( 1 );
+			
+			scl.setShoppingCart( sc );
+			sclDao.shrani( scl );
+			
+			sc.getShoppingCartLines().add( scl );
+			scDao.shrani( sc );
+		}
+		
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, long ccNumber, String ccName,
+	        Date ccExpiry, String shipping, String street1, String street2,
+	        String city, String state, String zip, String country)
+	{
+
+		IShoppingCart sc = shoppingCartDao.findById( shoppingId );
+		ICustomer customer = customerDao.findById( customerId );
+
+		double cDiscount = getCDiscount( customer );
+//		IShoppingCart cart = getCart( shoppingId, cDiscount );
+		IAddress address = saveAddress( street1, street2, city, state, zip,
+		        country );
+		
+		IOrders order = saveOrder( address, customer, shipping, sc, cDiscount );
+
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, sc, address );
+		
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, Long ccNumber, String ccName,
+	        Date ccExpiry, String shipping)
+	{
+
+		ICustomer customer = customerDao.findById( customerId );
+
+		double discount = getCDiscount(  customer );
+		IShoppingCart sc = getCart( shoppingId, discount );
+		IAddress address = customer.getAddress();
+
+		IOrders order = saveOrder( address, customer, shipping, sc, discount );
+		
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, sc, address );
+
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+	
+	@Transactional(readOnly=false)
+	protected void clearCart(Integer shoppingId)
+	{
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = (IShoppingCart) scDao.findById( shoppingId );
+
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res )
+    		{
+    			sclDao.delete( scl );
+    		}
+		}
+	}
+
+    @Transactional(readOnly=false)
+	protected ICcXacts saveCcXacts(IOrders order, String ccType, long ccNumber,
+	        String ccName, Date ccExpiry, IShoppingCart cart, IAddress address)
+	{
+		if ( ccType.length() > 10 )
+			ccType = ccType.substring( 0, 10 );
+
+		if ( ccName.length() > 30 )
+			ccName = ccName.substring( 0, 30 );
+
+		ICcXacts ccXacts = ccXactsDao.getObject();
+		ccXacts.setCountry( address.getCountry() );
+		ccXacts.setOrders( order );
+		ccXacts.setCxType( ccType );
+		ccXacts.setCxNum( (int) ccNumber );
+		ccXacts.setCxName( ccName );
+		ccXacts.setCxExpiry( ccExpiry );
+		ccXacts.setCxXactAmt( calculateTotal( cart ) );
+		ccXacts.setCxXactDate( new Date() );
+		ccXacts.setCountry( address.getCountry() );
+
+		ccXactsDao.shrani( ccXacts );
+
+		return ccXacts;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IAddress saveAddress(String street1, String street2, String city,
+	        String state, String zip, String country)
+	{
+
+		IAddress address = addressDao.getObject();
+
+		address.setAddrStreet1( street1 );
+		address.setAddrStreet2( street2 );
+		address.setAddrCity( city );
+		address.setAddrState( state );
+		address.setAddrZip( zip );
+
+		address.setCountry( countryDao.getByName( country ) );
+		addressDao.shrani( address );
+
+		return address;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		IOrders order = ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		ordersDao.shrani( order );
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			order.getOrderLines().add( ol );
+    			orderLineDao.shrani( ol );
+    		}
+		}
+		
+		ordersDao.shrani( order );
+
+		return order;
+	}
+
+	public String getRandomString(int min, int max)
+	{
+		String newstring = new String();
+		Random rand = new Random();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79
+		                                                       // characters
+		int strlen = (int) Math.floor( rand.nextDouble() * ( max - min + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+	
+	protected double calculateTotal(IShoppingCart sc)
+	{
+		double total = 0;
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl : res )
+    		{
+    			if( scl != null )
+    			{
+    				total += scl.getItem().getICost();
+    			}
+    		}
+		}
+
+		return total;
+	}
+
+	protected double getCDiscount(ICustomer customer)
+	{
+		return customer.getCDiscount();
+	}
+
+	@Override
+	public List searchByAuthor(String keyword)
+	{
+
+		List<IAuthor> authors = authorDao.findBySoundexLname( keyword );
+
+		List<IItem> items = new ArrayList<IItem>();
+
+		for ( IAuthor author : authors )
+		{
+			if ( items.size() >= 50 )
+			{
+				break;
+			}
+
+			items.addAll( itemDao.findAllByAuthor( author ) );
+		}
+
+		return items;
+	}
+	
+	@Override
+	public List<IItem> getPromotional()
+	{
+		return itemDao.getPromotional();
+	}
+	
+	@Override
+	public boolean countryExist( String country)
+    {
+		ICountry country1 = countryDao.getByName( country );
+		return country1 == null;
+    }
+	
+	@Override
+	public ICustomer getUserBy(String uname, String passwd)
+	{
+	    return customerDao.getUserBy( uname, passwd );
+	}
+	
+	@Override
+	public ICustomer getCustomerObject()
+	{
+		return customerDao.getObject();
+	}
+	
+	@Override
+	public IAddress getAddressObject()
+	{
+		return addressDao.getObject();
+	}
+	
+	@Override
+	public ICountry getCountryByName(String country)
+	{
+		return countryDao.getByName( country );
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public void saveAddress(IAddress address)
+	{
+	    addressDao.shrani(address);
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public void saveCustomer(ICustomer customer)
+	{
+	    customerDao.shrani( customer );
+	}
+	
+	@Override
+	public IShoppingCart findShoppingCartById(Integer shoppingId)
+	{
+		return shoppingCartDao.findById( shoppingId );
+	}
+	
+	@Override
+	public ICustomer findCustomerById(Integer customerId)
+	{
+		return customerDao.findById( customerId );
+	}
+	
+	@Override
+	@Cacheable("bestSellers")
+	public List<Object[]> getBestSellers(String category)
+	{
+		return itemDao.getBestSellers( category );
+	}
+	
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchByTitle(String keyword)
+    {
+	    List<IItem> items = itemDao.findAllByTitle( keyword );
+	    
+	    return items;
+    }
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchBySubject(String keyword)
+    {
+	    List<IItem> items = itemDao.findAllBySubject( keyword );
+	    
+	    return items;
+    }
+	
+	@Override
+	public IOrders getMostRecentOrder(ICustomer customer)
+	{
+		return ordersDao.getMostRecentOrder( customer );
+	}
+	
+	@Override
+	public List<IOrderLine> findAllOrderLineByOrder(IOrders order)
+	{
+	    return orderLineDao.findAllByOrder( order );
+	}
+	@Override
+	public IItem findItemById(Integer itemId)
+	{
+	    return itemDao.findById( itemId );
+	}
+	
+	@Override
+	public IAddress findAddressById(Integer addrId)
+    {
+	    return addressDao.findById( addrId );
+    }
+	
+	@Override
+	public ICountry getCountryById(Integer coId)
+    {
+	    return countryDao.findById( coId );
+    }
+
+	@Override
+	public List<ICustomer> findCustomerByAddress(IAddress address)
+    {
+	    return customerDao.findByAddress( address );
+    }
+
+	@Override
+	public IOrders findOrdersById(Integer cxOId)
+    {
+		return ordersDao.findById( cxOId );
+    }
+
+	@Override
+	public IAuthor findAuthorById(Integer cxAuthId)
+    {
+		try 
+		{
+			return authorDao.findById( cxAuthId );
+		}
+		catch(Exception e)
+		{
+			System.out.println("AuthorDao is null");
+			return null;
+		}
+    }
+
+	@Override
+	public IOrderLine findOrderLineById(Integer olId)
+    {
+		return orderLineDao.findById( olId );
+    }
+
+	@Override
+	public ICcXacts findCcXactsById(Integer ccXactId)
+    {
+		return ccXactsDao.findById( ccXactId );
+    }
+	
+	@Override
+	public List findAllShoppingCartLinesBySC(IShoppingCart shoppingCart)
+    {
+		try 
+		{
+			return shoppingCartDao.findAllBySC( shoppingCart );
+		}
+		catch(NullPointerException e)
+		{
+			ShoppingCartDaoImpl bean = ContextHelper.getApplicationContext().getBean(ShoppingCartDaoImpl.class);
+			return bean.findAllBySC(shoppingCart);
+		}
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
new file mode 100644
index 0000000..03be0e7
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
@@ -0,0 +1,10 @@
+package eu.cloudscale.showcase.db.services;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class HibernateService extends AService
+{
+
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/IService.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/IService.java
new file mode 100644
index 0000000..9d881ec
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/IService.java
@@ -0,0 +1,87 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.Date;
+import java.util.List;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+public interface IService 
+{
+	
+    public List getNewProducts(String category);
+
+	public IShoppingCart doCart(IShoppingCart sc, Integer itemId,
+            List<Integer> ids, List<Integer> quantities);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, long ccNumber, String ccName, Date ccExpiry,
+            String shipping, String street1, String street2, String city,
+            String state, String zip, String country);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, Long ccNumber, String ccName, Date ccExpiry,
+            String shipping);
+
+	public List<IItem> searchByAuthor(String keyword);
+
+	public List<IItem> searchByTitle(String keyword);
+
+	public List<IItem> searchBySubject(String keyword);
+
+	public List<Object[]> getBestSellers(String category);
+
+	public IShoppingCart createEmptyCart();
+
+	public IShoppingCart findShoppingCartById(Integer shoppingId);
+
+	public List<IItem> getPromotional();
+
+	boolean countryExist(String country);
+
+	public ICustomer getUserBy(String uname, String passwd);
+
+	public ICustomer getCustomerObject();
+
+	public IAddress getAddressObject();
+
+	public ICountry getCountryByName(String country);
+
+	public void saveAddress(IAddress address);
+
+	public void saveCustomer(ICustomer customer);
+
+	public ICustomer findCustomerById(Integer customerId);
+
+	public IOrders getMostRecentOrder(ICustomer customer);
+
+	public List<IOrderLine> findAllOrderLineByOrder(IOrders order);
+
+	public IItem findItemById(Integer itemId);
+
+	List findAllShoppingCartLinesBySC(IShoppingCart shoppingCart);
+
+	ICcXacts findCcXactsById(Integer ccXactId);
+
+	IOrderLine findOrderLineById(Integer olId);
+
+	IAuthor findAuthorById(Integer cxAuthId);
+
+	IOrders findOrdersById(Integer cxOId);
+
+	List<ICustomer> findCustomerByAddress(IAddress address);
+
+	ICountry getCountryById(Integer coId);
+
+	IAddress findAddressById(Integer addrId);
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
new file mode 100644
index 0000000..5ce98b2
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
@@ -0,0 +1,96 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.stereotype.Service;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Service
+//@Component
+public class MongoService extends AService
+{
+	public MongoService()
+	{	
+		System.out.println("Creating MongoService");
+//		addressDao = ContextHelper.getApplicationContext().getBean( AddressDaoImpl.class );
+	}
+	
+	
+	@Override
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		Orders order = (Orders) ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		//ordersDao.shrani( order );
+		
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			
+    			orderLineDao.shrani( ol );
+    			
+    			HashSet<IOrderLine> set = new HashSet<IOrderLine>();
+				set.add(ol);
+				set.addAll(order.getOrderLines());
+    			
+    			order.setOrderLines( set );
+    			//ordersDao.shrani(order);
+    			
+    			Item item = (Item) itemDao.findById( scl.getItem().getIId() );
+
+    			Integer olQty = item.getOlQty();
+    			item.setOlQty( (olQty == null ? 0 : olQty ) + 1 );
+    			
+    			itemDao.shrani( item );
+    
+    			// TODO: Update item IStock property
+    		}
+		}
+
+		ordersDao.shrani( order );
+
+		return order;
+	}
+
+	
+
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
new file mode 100644
index 0000000..9d2dd1e
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
@@ -0,0 +1,633 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Random;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.support.GenericXmlApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+public abstract class AGenerate implements IGenerate
+{
+	@Autowired(required=true)
+    protected IAddressDao addressDao;
+	
+	@Autowired(required=true)
+	protected IAuthorDao authorDao;
+	
+	@Autowired
+	protected ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	protected ICountryDao countryDao;
+	
+	@Autowired
+	protected ICustomerDao customerDao;
+	
+	@Autowired
+    protected IItemDao itemDao;
+	
+	@Autowired
+    protected IOrderLineDao orderLineDao;
+	
+	@Autowired
+    protected IOrdersDao ordersDao;
+	
+	@Autowired
+    protected IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	protected IShoppingCartLineDao shoppingCartLineDao;
+
+	// TODO: Move this to properties file
+	protected static final int    NUM_EBS       = 100;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ITEMS     = 10000;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_CUSTOMERS = NUM_EBS * 2880;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ADDRESSES = 2 * NUM_CUSTOMERS;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_AUTHORS   = (int) ( .25 * NUM_ITEMS );
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ORDERS    = (int) ( .9 * NUM_CUSTOMERS );
+
+	// TODO: Move this to properties file
+	protected static String[][]   tables        = {
+	        {"address", "addr_co_id", "addr_zip" }, {"author", "a_lname" },
+	        {"cc_xacts" }, {"country", "co_name" },
+	        {"customer", "c_addr_id", "c_uname" },
+	        {"item", "i_title", "i_subject", "i_a_id" },
+	        {"order_line", "ol_i_id", "ol_o_id" }, {"orders", "o_c_id" },
+	        {"shopping_cart" }, {"shopping_cart_line", "scl_i_id" } };
+
+	protected Random       rand          = new Random();
+	
+	//protected GenericXmlApplicationContext ctx = null;
+	
+	protected IService db = null;
+	
+	public AGenerate()
+	{
+		//ctx = ContextHelper.getApplicationContext();
+		//db = DatabaseHelper.getDatabase();
+	}
+	
+	
+	protected String getRandomAString(int min, int max)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  String getRandomAString(int length)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		for ( i = 0; i < length; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  int getRandomNString(int num_digits)
+	{
+		int return_num = 0;
+		for ( int i = 0; i < num_digits; i++ )
+		{
+			return_num += getRandomInt( 0, 9 )
+			        * (int) java.lang.Math.pow( 10.0, (double) i );
+		}
+		return return_num;
+	}
+
+	protected  int getRandomNString(int min, int max)
+	{
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) ) + min;
+		return getRandomNString( strlen );
+	}
+
+	protected  int getRandomInt(int lower, int upper)
+	{
+
+		int num = (int) Math.floor( rand.nextDouble()
+		        * ( ( upper + 1 ) - lower ) );
+		if ( num + lower > upper || num + lower < lower )
+		{
+			System.out.println( "ERROR: Random returned value of of range!" );
+			System.exit( 1 );
+		}
+		return num + lower;
+	}
+
+	protected  String DigSyl(int D, int N)
+	{
+		int i;
+		String resultString = new String();
+		String Dstr = Integer.toString( D );
+
+		if ( N > Dstr.length() )
+		{
+			int padding = N - Dstr.length();
+			for ( i = 0; i < padding; i++ )
+				resultString = resultString.concat( "BA" );
+		}
+
+		for ( i = 0; i < Dstr.length(); i++ )
+		{
+			if ( Dstr.charAt( i ) == '0' )
+				resultString = resultString.concat( "BA" );
+			else if ( Dstr.charAt( i ) == '1' )
+				resultString = resultString.concat( "OG" );
+			else if ( Dstr.charAt( i ) == '2' )
+				resultString = resultString.concat( "AL" );
+			else if ( Dstr.charAt( i ) == '3' )
+				resultString = resultString.concat( "RI" );
+			else if ( Dstr.charAt( i ) == '4' )
+				resultString = resultString.concat( "RE" );
+			else if ( Dstr.charAt( i ) == '5' )
+				resultString = resultString.concat( "SE" );
+			else if ( Dstr.charAt( i ) == '6' )
+				resultString = resultString.concat( "AT" );
+			else if ( Dstr.charAt( i ) == '7' )
+				resultString = resultString.concat( "UL" );
+			else if ( Dstr.charAt( i ) == '8' )
+				resultString = resultString.concat( "IN" );
+			else if ( Dstr.charAt( i ) == '9' )
+				resultString = resultString.concat( "NG" );
+		}
+
+		return resultString;
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+    public void populateCountryTable()
+	{
+		String[] countries = {"United States", "United Kingdom", "Canada",
+		        "Germany", "France", "Japan", "Netherlands", "Italy",
+		        "Switzerland", "Australia", "Algeria", "Argentina", "Armenia",
+		        "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangla Desh",
+		        "Barbados", "Belarus", "Belgium", "Bermuda", "Bolivia",
+		        "Botswana", "Brazil", "Bulgaria", "Cayman Islands", "Chad",
+		        "Chile", "China", "Christmas Island", "Colombia", "Croatia",
+		        "Cuba", "Cyprus", "Czech Republic", "Denmark",
+		        "Dominican Republic", "Eastern Caribbean", "Ecuador", "Egypt",
+		        "El Salvador", "Estonia", "Ethiopia", "Falkland Island",
+		        "Faroe Island", "Fiji", "Finland", "Gabon", "Gibraltar",
+		        "Greece", "Guam", "Hong Kong", "Hungary", "Iceland", "India",
+		        "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Jamaica",
+		        "Jordan", "Kazakhstan", "Kuwait", "Lebanon", "Luxembourg",
+		        "Malaysia", "Mexico", "Mauritius", "New Zealand", "Norway",
+		        "Pakistan", "Philippines", "Poland", "Portugal", "Romania",
+		        "Russia", "Saudi Arabia", "Singapore", "Slovakia",
+		        "South Africa", "South Korea", "Spain", "Sudan", "Sweden",
+		        "Taiwan", "Thailand", "Trinidad", "Turkey", "Venezuela",
+		        "Zambia" };
+
+		double[] exchanges = {1, .625461, 1.46712, 1.86125, 6.24238, 121.907,
+		        2.09715, 1842.64, 1.51645, 1.54208, 65.3851, 0.998, 540.92,
+		        13.0949, 3977, 1, .3757, 48.65, 2, 248000, 38.3892, 1, 5.74,
+		        4.7304, 1.71, 1846, .8282, 627.1999, 494.2, 8.278, 1.5391,
+		        1677, 7.3044, 23, .543, 36.0127, 7.0707, 15.8, 2.7, 9600,
+		        3.33771, 8.7, 14.9912, 7.7, .6255, 7.124, 1.9724, 5.65822,
+		        627.1999, .6255, 309.214, 1, 7.75473, 237.23, 74.147, 42.75,
+		        8100, 3000, .3083, .749481, 4.12, 37.4, 0.708, 150, .3062,
+		        1502, 38.3892, 3.8, 9.6287, 25.245, 1.87539, 7.83101, 52,
+		        37.8501, 3.9525, 190.788, 15180.2, 24.43, 3.7501, 1.72929,
+		        43.9642, 6.25845, 1190.15, 158.34, 5.282, 8.54477, 32.77,
+		        37.1414, 6.1764, 401500, 596, 2447.7 };
+
+		String[] currencies = {"Dollars", "Pounds", "Dollars",
+		        "Deutsche Marks", "Francs", "Yen", "Guilders", "Lira",
+		        "Francs", "Dollars", "Dinars", "Pesos", "Dram", "Schillings",
+		        "Manat", "Dollars", "Dinar", "Taka", "Dollars", "Rouble",
+		        "Francs", "Dollars", "Boliviano", "Pula", "Real", "Lev",
+		        "Dollars", "Franc", "Pesos", "Yuan Renmimbi", "Dollars",
+		        "Pesos", "Kuna", "Pesos", "Pounds", "Koruna", "Kroner",
+		        "Pesos", "Dollars", "Sucre", "Pounds", "Colon", "Kroon",
+		        "Birr", "Pound", "Krone", "Dollars", "Markka", "Franc",
+		        "Pound", "Drachmas", "Dollars", "Dollars", "Forint", "Krona",
+		        "Rupees", "Rupiah", "Rial", "Dinar", "Punt", "Shekels",
+		        "Dollars", "Dinar", "Tenge", "Dinar", "Pounds", "Francs",
+		        "Ringgit", "Pesos", "Rupees", "Dollars", "Kroner", "Rupees",
+		        "Pesos", "Zloty", "Escudo", "Leu", "Rubles", "Riyal",
+		        "Dollars", "Koruna", "Rand", "Won", "Pesetas", "Dinar",
+		        "Krona", "Dollars", "Baht", "Dollars", "Lira", "Bolivar",
+		        "Kwacha" };
+
+		int NUM_COUNTRIES = 92;
+
+		System.out.println( "Populating COUNTRY with " + NUM_COUNTRIES
+		        + " countries" );
+		
+		countryDao.createTable();
+		
+		for ( int i = 1; i <= NUM_COUNTRIES; i++ )
+		{
+			ICountry c = countryDao.getObject();
+			
+			if( db instanceof MongoService)
+			{
+				c.setCoId( i );
+			}
+			c.setCoName( countries[i - 1] );
+			c.setCoExchange( exchanges[i - 1] );
+			c.setCoCurrency( currencies[i - 1] );
+
+			countryDao.shrani( c );
+		}
+
+		countryDao.finish();
+
+		//System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateAuthorTable()
+    {
+		String A_FNAME, A_MNAME, A_LNAME, A_BIO;
+		java.sql.Date A_DOB;
+		GregorianCalendar cal;
+
+		System.out.println( "Populating AUTHOR Table with " + NUM_AUTHORS
+		        + " authors" );
+		
+		
+		for ( int i = 1; i <= NUM_AUTHORS; i++ )
+		{
+			IAuthor a = authorDao.getObject();
+
+			int month, day, year, maxday;
+			A_FNAME = getRandomAString( 3, 20 );
+			A_MNAME = getRandomAString( 1, 20 );
+			A_LNAME = getRandomAString( 1, 20 );
+			year = getRandomInt( 1800, 1990 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			A_DOB = new java.sql.Date( cal.getTime().getTime() );
+			A_BIO = getRandomAString( 125, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAId( i );
+			}
+			a.setAFname( A_FNAME );
+			a.setALname( A_LNAME );
+			a.setAMname( A_MNAME );
+			a.setADob( A_DOB );
+			a.setABio( A_BIO );
+
+			authorDao.shrani( a );
+		}
+
+		authorDao.finish();
+
+		System.out.println( "" );    
+    }
+
+
+	@Override
+    public void populateAddressTable()
+    {
+		System.out.println( "Populating ADDRESS Table with " + NUM_ADDRESSES
+		        + " addresses" );
+		System.out.print( "Complete (in 10,000's): " );
+		String ADDR_STREET1, ADDR_STREET2, ADDR_CITY, ADDR_STATE;
+		String ADDR_ZIP;
+		int ADDR_CO_ID;
+		
+
+		for ( int i = 569450; i <= NUM_ADDRESSES; i++ )
+		{
+			IAddress a = addressDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			ADDR_STREET1 = getRandomAString( 15, 40 );
+			ADDR_STREET2 = getRandomAString( 15, 40 );
+			ADDR_CITY = getRandomAString( 4, 30 );
+			ADDR_STATE = getRandomAString( 2, 20 );
+			ADDR_ZIP = getRandomAString( 5, 10 );
+			ADDR_CO_ID = getRandomInt( 1, 92 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAddrId( i );
+			}
+			a.setAddrStreet1( ADDR_STREET1 );
+			a.setAddrStreet2( ADDR_STREET2 );
+			a.setAddrCity( ADDR_CITY );
+			a.setAddrState( ADDR_STATE );
+			a.setAddrZip( ADDR_ZIP );
+			a.setCountry( countryDao.findById( ADDR_CO_ID ) );
+
+			addressDao.shrani( a );
+		}
+
+		addressDao.finish();
+
+		System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateCustomerTable()
+    {
+		String C_UNAME, C_PASSWD, C_LNAME, C_FNAME;
+		int C_ADDR_ID, C_PHONE;
+		String C_EMAIL;
+		java.sql.Date C_SINCE, C_LAST_LOGIN;
+		java.sql.Timestamp C_LOGIN, C_EXPIRATION;
+		double C_DISCOUNT, C_BALANCE, C_YTD_PMT;
+		java.sql.Date C_BIRTHDATE;
+		String C_DATA;
+		int i;
+
+		System.out.println( "Populating CUSTOMER Table with " + NUM_CUSTOMERS
+		        + " customers" );
+		System.out.print( "Complete (in 10,000's): " );
+		
+		for ( i = 1; i <= NUM_CUSTOMERS; i++ )
+		{
+			ICustomer c = customerDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+			
+			C_UNAME = DigSyl( i, 0 ).toLowerCase();
+			C_PASSWD = C_UNAME.toLowerCase();
+			C_LNAME = getRandomAString( 8, 15 );
+			C_FNAME = getRandomAString( 8, 15 );
+			C_ADDR_ID = getRandomInt( 1, NUM_ADDRESSES );
+			C_PHONE = getRandomNString( 9, 16 );
+			C_EMAIL = C_UNAME + "@" + getRandomAString( 2, 9 ) + ".com";
+
+			GregorianCalendar cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 730 ) );
+			C_SINCE = new java.sql.Date( cal.getTime().getTime() );
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 60 ) );
+			if ( cal.after( new GregorianCalendar() ) )
+				cal = new GregorianCalendar();
+
+			C_LAST_LOGIN = new java.sql.Date( cal.getTime().getTime() );
+			C_LOGIN = new java.sql.Timestamp( System.currentTimeMillis() );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.HOUR, 2 );
+			C_EXPIRATION = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			C_DISCOUNT = (double) getRandomInt( 0, 50 ) / 100.0;
+			C_BALANCE = 0.00;
+			C_YTD_PMT = (double) getRandomInt( 0, 99999 ) / 100.0;
+			int year = getRandomInt( 1880, 2000 );
+			int month = getRandomInt( 0, 11 );
+			int maxday = 31;
+			int day;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			C_BIRTHDATE = new java.sql.Date( cal.getTime().getTime() );
+
+			C_DATA = getRandomAString( 100, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+    		if( db instanceof MongoService)
+    		{
+    			c.setCId( i );
+    		}
+			c.setCUname( C_UNAME );
+			c.setCPasswd( C_PASSWD );
+			c.setCFname( C_FNAME );
+			c.setCLname( C_LNAME );
+			IAddress addr = addressDao.findById( C_ADDR_ID );
+			c.setAddress( addr );
+			c.setCPhone( String.valueOf( C_PHONE ) );
+			c.setCEmail( C_EMAIL );
+			c.setCSince( C_SINCE );
+			c.setCLastVisit( C_LAST_LOGIN );
+			c.setCLogin( C_LOGIN );
+			c.setCExpiration( C_EXPIRATION );
+			c.setCDiscount( C_DISCOUNT );
+			c.setCBalance( C_BALANCE );
+			c.setCYtdPmt( C_YTD_PMT );
+			c.setCBirthdate( C_BIRTHDATE );
+			c.setCData( C_DATA );
+
+			customerDao.shrani( c );
+		}
+
+		customerDao.finish();
+
+		//System.out.print( "\n" );
+    }
+
+
+	@Override
+    public void populateItemTable()
+    {
+		String I_TITLE;
+		GregorianCalendar cal;
+		int I_A_ID;
+		java.sql.Date I_PUB_DATE;
+		String I_PUBLISHER, I_SUBJECT, I_DESC;
+		int I_RELATED1, I_RELATED2, I_RELATED3, I_RELATED4, I_RELATED5;
+		String I_THUMBNAIL, I_IMAGE;
+		double I_SRP, I_COST, I_RANDOM;
+		java.sql.Date I_AVAIL;
+		int I_STOCK;
+		String I_ISBN;
+		int I_PAGE;
+		String I_BACKING;
+		String I_DIMENSIONS;
+
+		String[] SUBJECTS = {"ARTS", "BIOGRAPHIES", "BUSINESS", "CHILDREN",
+		        "COMPUTERS", "COOKING", "HEALTH", "HISTORY", "HOME", "HUMOR",
+		        "LITERATURE", "MYSTERY", "NON-FICTION", "PARENTING",
+		        "POLITICS", "REFERENCE", "RELIGION", "ROMANCE", "SELF-HELP",
+		        "SCIENCE-NATURE", "SCIENCE-FICTION", "SPORTS", "YOUTH",
+		        "TRAVEL" };
+		int NUM_SUBJECTS = 24;
+
+		String[] BACKINGS = {"HARDBACK", "PAPERBACK", "USED", "AUDIO",
+		        "LIMITED-EDITION" };
+		int NUM_BACKINGS = 5;
+
+		System.out.println( "Populating ITEM table with " + NUM_ITEMS
+		        + " items" );
+		
+		
+		Random rand = new Random();
+		
+		for ( int i = 1; i <= NUM_ITEMS; i++ )
+		{
+			I_RANDOM = rand.nextDouble();
+			int month, day, year, maxday;
+			I_TITLE = getRandomAString( 14, 60 );
+			if ( i <= ( NUM_ITEMS / 4 ) )
+				I_A_ID = i;
+			else
+				I_A_ID = getRandomInt( 1, NUM_ITEMS / 4 );
+
+			year = getRandomInt( 1930, 2000 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			I_PUB_DATE = new java.sql.Date( cal.getTime().getTime() );
+
+			I_PUBLISHER = getRandomAString( 14, 60 );
+			I_SUBJECT = SUBJECTS[getRandomInt( 0, NUM_SUBJECTS - 1 )];
+			I_DESC = getRandomAString( 100, 500 );
+
+			I_RELATED1 = getRandomInt( 1, NUM_ITEMS );
+			do
+			{
+				I_RELATED2 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED2 == I_RELATED1 );
+			do
+			{
+				I_RELATED3 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED3 == I_RELATED1 || I_RELATED3 == I_RELATED2 );
+			do
+			{
+				I_RELATED4 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED4 == I_RELATED1 || I_RELATED4 == I_RELATED2
+			        || I_RELATED4 == I_RELATED3 );
+			do
+			{
+				I_RELATED5 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED5 == I_RELATED1 || I_RELATED5 == I_RELATED2
+			        || I_RELATED5 == I_RELATED3 || I_RELATED5 == I_RELATED4 );
+
+			I_THUMBNAIL = new String( "img" + i % 100 + "/thumb_" + i + ".gif" );
+			I_IMAGE = new String( "img" + i % 100 + "/image_" + i + ".gif" );
+			I_SRP = (double) getRandomInt( 100, 99999 );
+			I_SRP /= 100.0;
+
+			I_COST = I_SRP
+			        - ( ( ( (double) getRandomInt( 0, 50 ) / 100.0 ) ) * I_SRP );
+
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 1, 30 ) );
+			I_AVAIL = new java.sql.Date( cal.getTime().getTime() );
+			I_STOCK = getRandomInt( 10, 30 );
+			I_ISBN = getRandomAString( 13 );
+			I_PAGE = getRandomInt( 20, 9999 );
+			I_BACKING = BACKINGS[getRandomInt( 0, NUM_BACKINGS - 1 )];
+			I_DIMENSIONS = ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 );
+
+			IItem item = itemDao.getObject();
+			// Set parameter
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				item.setIId( i );
+			}
+			item.setIRandom( I_RANDOM );
+			item.setITitle( I_TITLE );
+			item.setIPubDate( I_PUB_DATE );
+			item.setIPublisher( I_PUBLISHER );
+			item.setISubject( I_SUBJECT );
+			item.setIDesc( I_DESC );
+			item.setIRelated1( I_RELATED1 );
+			item.setIRelated2( I_RELATED2 );
+			item.setIRelated3( I_RELATED3 );
+			item.setIRelated4( I_RELATED4 );
+			item.setIRelated5( I_RELATED5 );
+			item.setIThumbnail( I_THUMBNAIL );
+			item.setIImage( I_IMAGE );
+			item.setISrp( I_SRP );
+			item.setICost( I_COST );
+			item.setIAvail( I_AVAIL );
+			item.setIStock( I_STOCK );
+			item.setIIsbn( I_ISBN );
+			item.setIPage( String.valueOf( I_PAGE ) );
+			item.setIBacking( I_BACKING );
+			item.setIDimension( I_DIMENSIONS );
+			item.setAuthor( authorDao.findById( I_A_ID ) );
+
+			itemDao.shrani( item );
+			
+			itemDao.findById( item.getIId() );
+		}
+
+		itemDao.finish();
+		//System.out.println( "" );
+    }
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/Generate.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/Generate.java
new file mode 100644
index 0000000..d50eef9
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/Generate.java
@@ -0,0 +1,47 @@
+package eu.cloudscale.showcase.generate;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+
+@Component
+public class Generate
+{
+	public Generate()
+	{
+		
+	}
+
+	public void generate(IGenerate db)
+	{
+
+		//db.dropTables( tables );
+		//db.populateCountryTable();
+		//db.populateAuthorTable();
+		db.populateAddressTable();
+		//db.populateCustomerTable();
+		//db.populateItemTable();
+		//db.populateOrdersAndCC_XACTSTable();
+		// db.createIndexes(tables);
+
+		System.out.println( "FINISHED!" );
+	}
+
+	public static void main(String[] args)
+	{
+		if( args.length < 1 )
+		{
+			System.out.println("Usage: $ java Generate <mysql|mongodb>");
+			System.exit(0);			
+		}
+
+		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:app-context.xml");
+		
+	    Generate generate = context.getBean(Generate.class);
+	    IGenerate gen = args[0] == "mysql" ? context.getBean(GenerateHibernate.class) : context.getBean(GenerateMongo.class);
+//	    gen.setContext(context);
+		generate.generate(gen);
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
new file mode 100644
index 0000000..7a51371
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
@@ -0,0 +1,154 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+@Component
+public class GenerateHibernate extends AGenerate
+{
+	
+	public GenerateHibernate()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		String CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+
+
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			Orders order = new Orders();
+
+			// Set parameter
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+			order.setCcXactses( new HashSet<ICcXacts>() );
+			order.setOrderLines( new HashSet<IOrderLine>() );
+			ordersDao.shrani( order );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				
+				OrderLine orderLine = new OrderLine();
+				orderLine.setItem( itemDao.findById( OL_I_ID ) );
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+
+				orderLineDao.shrani( orderLine );
+				order.getOrderLines().add( orderLine );
+
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomAString( 15 );
+			CX_CO_ID = getRandomInt( 1, 92 );
+
+			CcXacts ccXacts = new CcXacts();
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setOrders( order );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( CX_AUTH_ID );
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+
+//			ccXacts.setOrders( order );
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+
+			order.getCcXactses().add( ccXacts );
+
+			ccXactsDao.shrani( ccXacts );
+
+		}
+
+		System.out.println( "" );
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
new file mode 100644
index 0000000..b666096
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
@@ -0,0 +1,163 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.mongo.CcXacts;
+import eu.cloudscale.showcase.db.model.mongo.OrderLine;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Component
+public class GenerateMongo extends AGenerate
+{
+	
+	public GenerateMongo()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		String CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+		
+		
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			Orders order = new Orders();
+			
+			// Set parameter
+			order.setOId( i );
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+			order.setCcXactses( new HashSet<ICcXacts>() );
+			order.setOrderLines( new HashSet<IOrderLine>() );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				
+				OrderLine orderLine = new OrderLine();				
+				orderLine.setOlId( OL_ID );
+				orderLine.setItem(itemDao.findById( OL_I_ID ));
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+				
+				orderLineDao.shrani( orderLine );
+				
+				HashSet<IOrderLine> set = new HashSet<IOrderLine>();
+				set.add(orderLine);
+				set.addAll(order.getOrderLines());
+				
+				order.setOrderLines( set );
+				ordersDao.shrani( order );
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomAString( 15 );
+			CX_CO_ID = getRandomInt( 1, 92 );
+					
+			CcXacts ccXacts = new CcXacts();
+			ccXacts.setId( i );
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( CX_AUTH_ID );
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+			
+			ccXacts.setOrders(order);
+			ccXactsDao.shrani( ccXacts );
+			
+			HashSet<ICcXacts> set = new HashSet<ICcXacts>();
+			set.add(ccXacts);
+			set.addAll(order.getCcXactses());
+			
+			order.setCcXactses(set);
+			
+			ordersDao.shrani( order );
+			
+		}
+
+		System.out.println( "" );
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
new file mode 100644
index 0000000..6e1921b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
@@ -0,0 +1,19 @@
+package eu.cloudscale.showcase.generate;
+
+import org.springframework.context.ApplicationContext;
+
+public interface IGenerate
+{
+//	public void setContext(ApplicationContext ctx);
+	public void populateCountryTable();
+	
+	public void populateAuthorTable();
+	
+	public void populateAddressTable();
+	
+	public void populateCustomerTable();
+	
+	public void populateItemTable();
+	
+	public void populateOrdersAndCC_XACTSTable();
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/AController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/AController.java
new file mode 100644
index 0000000..3e23f87
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/AController.java
@@ -0,0 +1,130 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.ui.Model;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.services.IService;
+
+public abstract class AController
+{
+	
+	@Autowired
+	@Qualifier("service")
+    protected IService service;
+	
+	
+	public HttpSession getHttpSession(Class c, HttpServletRequest request)
+	{
+		DatabaseHelper.getDatabase();
+		Logger log = LogManager.getLogger(c.getName());
+		HttpSession session = request.getSession();
+		
+		//System.out.println("SESSION_ID = " + session.getId());
+		
+		return session;
+	}
+	
+	protected String getUrl2(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null)
+	    {
+	    	url += "?SHOPPING_ID=" + shoppingId;
+	    	if( customerId != null )
+	    	{
+	    		url += "&C_ID=" + customerId;
+	    	}
+	    }
+	    else if ( customerId != null )
+	    {
+	    	url += "?C_ID=" + customerId;
+	    }
+		
+		return url;
+    }
+
+	protected String getUrl1(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null )
+		{
+			url += "&SHOPPING_ID=" + shoppingId;
+		}
+		
+		if( customerId != null )
+		{
+			url += "&C_ID=" + customerId;
+		}
+		
+		return url;
+    }	
+	
+	protected String getShoppingCartUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/shopping-cart" );
+	}
+
+	protected String getHomeUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/" );
+	}
+
+	protected String getSearchRequestUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/search" );
+	}
+	
+	protected String getOrderInquiryUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2( shoppingId, customerId, "/order-inquiry" );
+    }
+	
+	protected void setupFrontend(Model model, Integer shoppingId, Integer customerId)
+	{
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+		
+		String orderInquiryUrl = getOrderInquiryUrl(shoppingId, customerId);
+		model.addAttribute( "orderInquiryUrl", orderInquiryUrl );
+		
+		model.addAttribute( "cssResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.css" ));
+		model.addAttribute( "imgResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.img" ));
+		model.addAttribute( "jsResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.js" ));
+	}
+
+	protected Properties getApplicationProperties()
+	{
+		Resource resource = new ClassPathResource("app.properties");
+		Properties props = null;
+		try
+        {
+	        props = PropertiesLoaderUtils.loadProperties(resource);
+        }
+        catch ( IOException e )
+        {
+	        e.printStackTrace();
+        }
+		
+		return props;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
new file mode 100644
index 0000000..d1d6fc4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping("/best-sellers")
+public class BestSellersController extends AController
+{
+	static final Logger log = LogManager.getLogger(BestSellersController.class.getName());
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String bestSellers(@RequestParam( value="SUBJECT", required=false) String category, 
+							  @RequestParam( value="C_ID", required=false) Integer customerId,
+							  @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+							  HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(BestSellersController.class, request);
+
+		List<Object[]> res = service.getBestSellers( category );
+		model.addAttribute( "products", res );
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		model.addAttribute( "promotional", service.getPromotional() );	
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "best-sellers";
+	}
+	
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
new file mode 100644
index 0000000..ee9629f
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
@@ -0,0 +1,145 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+
+@Controller
+@RequestMapping("/buy-confirm")
+public class BuyConfirmController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request,
+						Model model)
+	{
+		HttpSession session = super.getHttpSession(BuyConfirmController.class, request);
+		
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		String shoppingIdString = request.getParameter( "SHOPPING_ID" );
+		Integer shoppingId = null;
+		if( shoppingIdString != null && !shoppingIdString.isEmpty() )
+		{
+			shoppingId = Integer.parseInt(  shoppingIdString );
+		}
+		
+		String customerIdString = request.getParameter( "C_ID" );
+		Integer customerId = null;
+		if( customerIdString != null && !customerIdString.isEmpty() )
+		{
+			customerId = Integer.parseInt(  customerIdString );
+		}
+		
+		String ccType = request.getParameter( "CC_TYPE" );
+		String ccNumber_str = request.getParameter( "CC_NUMBER" );
+		Long ccNumber = null;
+		if( !ccNumber_str.isEmpty() )
+			ccNumber = Long.parseLong( ccNumber_str );
+		
+		SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
+		String ccName = request.getParameter( "CC_NAME" );
+		Date ccExpiry = null;
+        try
+        {
+	        ccExpiry = sdf.parse(request.getParameter( "CC_EXPIRY" ));
+        }
+        catch ( ParseException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+		String shipping = request.getParameter( "SHIPPING" );
+		String street1 = request.getParameter( "street1" );
+		
+		
+		BuyConfirmResult res = null;
+		if( street1 != null && street1.equals( "" ))
+		{
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+			if( errors.isEmpty() )
+			{
+				res = service.doBuyConfirm( shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+			}
+		}
+		else
+		{
+			String street2 = request.getParameter("street2");
+			String city = request.getParameter("city");
+			String state = request.getParameter( "state" );
+			String zip = request.getParameter("zip");
+			String country = request.getParameter("country");
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, country, city, state, zip);
+			if( errors.isEmpty() )
+			{
+
+				res = service.doBuyConfirm(shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, street2, city, state, zip, country);
+
+			}
+		}
+		
+
+		
+		model.addAttribute("errors", errors);
+		model.addAttribute("results", res);
+		setupFrontend( model, shoppingId, customerId );
+		return "buy-confirm";
+	}
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping)
+    {
+		if(shoppingId == null)
+	    	errors.add( "Shipping id is null!" );
+	    if( customerId == null)
+	    	errors.add( "Customer id is null" );
+	    if( ccType == null || ccType.isEmpty() )
+	    	errors.add( "ccType is null" );
+	    if( ccNumber == null)
+	    	errors.add("ccNumber is null");
+	    if( ccName == null || ccName.isEmpty() )
+	    	errors.add( "ccName is null" );
+	    if( ccExpiry == null)
+	    	errors.add( "ccExpiry is null" );
+	    if( shipping == null || shipping.isEmpty() )
+	    	errors.add( "Shipping is null" );
+    }
+
+
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping, String street, String country, String city, String state, String zip)
+    {
+	    checkEmptiness( errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping );
+	    
+	    if( city == null )
+	    	errors.add( "City is null" );
+	    
+	    if( state == null )
+	    	errors.add( "State is null" );
+	    
+	    if( zip == null )
+	    	errors.add( "Zip is null" );
+	    
+	    if( street == null )
+	    	errors.add( "Street1 or street2 is null" );
+	    
+	    if( service.countryExist(country) )
+	    	errors.add( "That country doesn't exist!" );
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
new file mode 100644
index 0000000..1fc1805
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
@@ -0,0 +1,225 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Controller
+@RequestMapping( "/buy" )
+public class BuyController extends AController
+{
+	static Logger log = LogManager.getLogger(BuyController.class.getName());
+	
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	@Transactional
+	public String get(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "RETURNING_FLAG", required = false ) String returningFlag,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(BuyController.class, request);
+
+		ArrayList<String> errors = new ArrayList<String>();
+
+		long start = System.currentTimeMillis();
+
+		ICustomer customer = null;
+		if ( returningFlag.equals( "Y" ) )
+		{
+			String uname = request.getParameter( "username" );
+			String passwd = request.getParameter( "password" );
+
+			if ( uname.length() == 0 || passwd.length() == 0 )
+			{
+				errors.add( "Username and password cannot be empty!" );
+			}
+			else
+			{
+				customer = service.getUserBy( uname, passwd );
+				if ( customer == null )
+				{
+					errors.add( "Invalid username or password!" );
+				}
+
+//				if ( errors.isEmpty() )
+//				{
+//					session.setAttribute( "customer", customer );
+//				}
+			}
+		}
+		else if ( returningFlag.equals( "N" ) )
+		{
+			String fname = request.getParameter( "fname" );
+			checkEmptiness( fname, "First name", errors );
+			String lname = request.getParameter( "lname" );
+			checkEmptiness( lname, "Last name", errors );
+			String city = request.getParameter( "city" );
+			String state = request.getParameter( "state" );
+			String street1 = request.getParameter( "street1" );
+			String street2 = request.getParameter( "street2" );
+			String zip = request.getParameter( "zip" );
+			String country = request.getParameter( "country" );
+			checkEmptiness( country, "Country", errors );
+			String phone = request.getParameter( "phone" );
+			String email = request.getParameter( "email" );
+			String birthdate = request.getParameter( "birthdate" );
+			String data = request.getParameter( "data" );
+
+			if ( errors.isEmpty() )
+			{
+				customer = service.getCustomerObject();
+				customer.setCFname( fname );
+				customer.setCLname( lname );
+
+				IAddress address = service.getAddressObject();
+				address.setAddrCity( city );
+				address.setAddrState( state );
+				address.setAddrStreet1( street1 );
+				address.setAddrStreet2( street2 );
+				address.setAddrZip( zip );
+				System.out.println("getCountryByName()");
+				ICountry countryObj = service.getCountryByName( country );
+				if ( countryObj == null )
+				{
+					errors.add( "Country " + country + " doesn't exist" );
+				}
+				else
+				{
+					address.setCountry( countryObj );
+				}
+				
+				address.getCustomers().add( customer );
+				service.saveAddress( address );
+				
+				customer.setAddress( address );
+				customer.setCPhone( phone );
+				SimpleDateFormat sdf = new SimpleDateFormat( "dd/mm/yyyy" );
+
+				try
+				{
+					customer.setCBirthdate( sdf.parse( birthdate ) );
+				}
+				catch ( ParseException e )
+				{
+					e.printStackTrace();
+				}
+				customer.setCData( data );
+				customer.setCEmail( email );
+				customer.setCBalance( 0.0 );
+				customer.setCDiscount( (int) ( java.lang.Math.random() * 51 ) );
+				customer.setCExpiration( new Date(
+				        System.currentTimeMillis() + 7200000 ) );
+				customer.setCLastVisit( new Date( System.currentTimeMillis() ) );
+				customer.setCLogin( new Date( System.currentTimeMillis() ) );
+				customer.setCSince( new Date( System.currentTimeMillis() ) );
+				customer.setCYtdPmt( 0.0 );
+				customer.setCUname( "" );
+				customer.setCPasswd( "" );
+				service.saveCustomer( customer );
+				customer.setCUname( DigSyl( customer.getCId(), 0 ).toLowerCase() );
+				customer.setCPasswd( customer.getCUname().toLowerCase() );
+				service.saveCustomer( customer ); // update it with username and
+												// password
+			}
+		}
+		else
+		{
+			errors.add( "RETURNING_FLAG not set to Y or N!" );
+		}
+
+		if ( shoppingId == null )
+		{
+			errors.add( "Shopping cart ID not set!" );
+		}
+		
+		IShoppingCart cart = service.findShoppingCartById( shoppingId );
+		model.addAttribute( "errors", errors );
+		model.addAttribute( "cart", cart );
+		model.addAttribute( "customer", customer );
+		
+//		if( cart != null )
+//			model.addAttribute( "subTotal", getSubTotal( cart.getShoppingCartLines() ) );
+
+		setupFrontend(model, shoppingId, customerId);
+//		System.out.println("[Buy controller] " + (System.currentTimeMillis() - start) );
+		return "buy";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		double total = 0;
+		for ( IShoppingCartLine scl : shoppingCartLines )
+		{
+			total += scl.getItem().getICost();
+		}
+
+		return total;
+	}
+
+	private void checkEmptiness(String obj, String desc,
+	        ArrayList<String> errors)
+	{
+		if ( obj == null || obj.isEmpty() )
+		{
+			errors.add( desc + " is empty!" );
+		}
+	}
+
+	private static final String[] digS = {"BA", "OG", "AL", "RI", "RE", "SE",
+	        "AT", "UL", "IN", "NG"    };
+
+	public String DigSyl(int d, int n)
+	{
+		String s = "";
+
+		if ( n == 0 )
+			return ( DigSyl( d ) );
+		for ( ; n > 0; n-- )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+			d = d / 10;
+		}
+
+		return ( s );
+	}
+
+	private String DigSyl(int d)
+	{
+		String s = "";
+
+		for ( ; d != 0; d = d / 10 )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+		}
+
+		return ( s );
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
new file mode 100644
index 0000000..327cd39
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
@@ -0,0 +1,52 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+@Controller
+@RequestMapping( "/customer-registration" )
+public class CustomerRegistrationController extends AController
+{
+	
+	
+
+	@RequestMapping( "" )
+	public String get(
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(CustomerRegistrationController.class, request);
+		
+		ICustomer customer = null;
+		if ( customerId != null )
+		{
+			customer = service.findCustomerById( customerId );
+		}
+
+		model.addAttribute( "shoppingId", shoppingId );
+		model.addAttribute( "customerId", customerId );
+
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+
+		model.addAttribute( "sessionId", session.getId() );
+
+		setupFrontend( model, shoppingId, customerId );
+		return "customer-registration";
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
new file mode 100644
index 0000000..a4fbc86
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
@@ -0,0 +1,105 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+
+@Controller
+@RequestMapping( "/" )
+public class HomeController extends AController
+{
+	static Logger log = LogManager.getLogger(HomeController.class.getName());
+	
+	private String[]            categories = {"ARTS", "NON-FICTION",
+	        "BIOGRAPHIES", "PARENTING", "BUSINESS", "POLITICS", "CHILDREN",
+	        "REFERENCE", "COMPUTERS", "RELIGION", "COOKING", "ROMANCE",
+	        "HEALTH", "SELF-HELP", "HISTORY", "SCIENCE-NATURE", "HOME",
+	        "SCIENCE-FICTION", "HUMOR", "SPORTS", "LITERATURE", "MYSTERY" };
+
+
+	private class Split
+	{
+
+		public String left, right, leftUrl, rightUrl;
+
+		public Split(String l, String lUrl, String r, String rUrl)
+		{
+			left = l;
+			leftUrl = lUrl;
+			rightUrl = rUrl;
+			right = r;
+		}
+	}
+
+	/**
+	 * Simply selects the home view to render by returning its name.
+	 */
+	@RequestMapping( value = "/", method = RequestMethod.GET )
+	public String home(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        Locale locale, HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(HomeController.class, request);
+	
+		String categoryUrl = getUrl1( shoppingId, customerId, "" );
+		
+		model.addAttribute( "promotional", service.getPromotional() );
+		model.addAttribute( "categories", prepareCategories( categoryUrl ) );
+
+		model.addAttribute( "categoryUrl", categoryUrl );
+
+
+		String productUrl = getProductUrl( shoppingId, customerId );
+		model.addAttribute( "productUrl", productUrl );
+		setupFrontend( model, shoppingId, customerId );
+
+		return "home";
+	}
+
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl1( shoppingId, customerId, "" );
+	}
+
+	// private String getCategoryUrl(Integer shoppingId, Integer customerId)
+	// {
+	// String url = "";
+	// if( shoppingId != null)
+	// url+="&SHOPPING_ID=" + shoppingId;
+	//
+	// if( customerId != null )
+	// url += "&C_ID=" + customerId;
+	//
+	// return url;
+	// }
+
+	private List<Split> prepareCategories(String url)
+	{
+		ArrayList<Split> cats = new ArrayList<Split>();
+
+		for ( int i = 0; i < categories.length; i += 2 )
+		{
+			cats.add( new Split( categories[i], categories[i] + url,
+			        categories[i + 1], categories[i + 1] + url ) );
+		}
+		return cats;
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
new file mode 100644
index 0000000..622dfe9
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
@@ -0,0 +1,64 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+@Controller
+@RequestMapping("/login")
+public class LoginController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, HttpSession session, Model model)
+	{		
+		String referer = request.getParameter("next");
+		if( referer.isEmpty() )
+			referer = request.getHeader( "referer" );
+		
+		if( session.getAttribute( "customer" ) != null)
+			return "redirect:" + referer == null ? "/" : referer;
+		
+		model.addAttribute("referer", referer);
+		return "login";
+	}
+	
+	@RequestMapping(value="", method=RequestMethod.POST)
+	public String post(@RequestParam("username") String username, 
+						@RequestParam("password") String password,
+						@RequestParam("referer") String referer,
+						HttpSession session, Model model)
+	{
+		ICustomer customer = null;
+		
+		if( (customer = service.getUserBy(username, password)) != null )
+		{
+			Date currDate = new Date(); 
+			
+			
+			Calendar c = Calendar.getInstance();
+			c.setTime( currDate );
+			c.add( Calendar.HOUR, -1 );
+			
+			customer.setCLogin( currDate );
+			customer.setCExpiration( c.getTime() );
+			service.saveCustomer(customer);
+			session.setAttribute( "customer", customer );
+			return "redirect:" + referer;
+		}
+		
+		model.addAttribute("errors", "Login failed. Check username and password");
+		return "login";
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
new file mode 100644
index 0000000..0616cb2
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping( "/new-products" )
+public class NewProductsController extends AController
+{
+
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(Locale locale, Model model)
+//	{
+//		return "new-products";
+//	}
+
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	public String newProductsCategory(
+	        @RequestParam( value="SUBJECT", required=false) String category,
+	        @RequestParam( value="C_ID", required=false) Integer customerId,
+	        @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+	        Locale locale,
+	        HttpServletRequest request,
+	        Model model)
+	{
+		HttpSession session = super.getHttpSession(NewProductsController.class, request);
+		
+		return getNewProducts(category, model, customerId, shoppingId );
+	}
+	
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, null);
+//	}
+//	
+//	@RequestMapping( value = "/{category}/{customerId}/{shoppingId}", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								@PathVariable("shoppingId") Integer shoppingId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, shoppingId);
+//	}
+
+	private String getNewProducts(String category, Model model, Integer customerId, Integer shoppingId)
+	{
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		
+		model.addAttribute( "products", service.getNewProducts( category ) );
+		model.addAttribute( "promotional", service.getPromotional() );
+		
+		setupFrontend(model, shoppingId, customerId);
+		return "new-products";
+	}
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl1(shoppingId, customerId, "");
+    }
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
new file mode 100644
index 0000000..92cf341
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Controller
+@RequestMapping("/order-display")
+public class OrderDisplayController extends AController
+{
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @RequestMapping(method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(OrderDisplayController.class, request);
+		
+		if( session == null )
+			session = request.getSession(true);
+		
+		Integer customerId = null;
+		try
+		{
+			customerId = Integer.parseInt( request.getParameter("C_ID") );
+		}
+		catch(Exception e) {}
+		
+		Integer shoppingId = null;
+		try
+		{
+			shoppingId = Integer.parseInt( request.getParameter("SHOPPING_ID") );
+		}
+		catch(Exception e) {}
+		
+		String uname = request.getParameter("username");
+		String passwd = request.getParameter("password");
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		IOrders order = null;
+		List<IOrderLine> orderLines = null;
+		
+		if (uname != null && passwd != null) 
+		{
+
+			ICustomer customer = service.getUserBy( uname, passwd);
+			
+			if (customer == null) 
+			{
+				errors.add( "Error: Incorrect password or username.\n" );
+			} 
+			else 
+			{
+				order = service.getMostRecentOrder( customer );
+				if (order == null)
+				{
+					errors.add("User doesn't have orders");
+				}
+				else 
+				{
+					orderLines = service.findAllOrderLineByOrder( order );
+				}
+			}
+
+		} 
+		else
+		{
+			errors.add("Error: TPCW_order_display_servlet, uname and passwd not set!.\n");
+		}
+		
+		if( errors.isEmpty() )
+		{
+			model.addAttribute( "order", order );
+			model.addAttribute( "orderLines", orderLines );
+		}
+		
+		model.addAttribute( "errors", errors);
+		
+		setupFrontend( model, shoppingId, customerId );
+		return "order-display";
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
new file mode 100644
index 0000000..e23dfaf
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping( "/order-inquiry" )
+public class OrderInquiryController extends AController
+{
+
+	@RequestMapping( method = RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(OrderInquiryController.class, request);
+
+		if ( session == null )
+			session = request.getSession( true );
+
+		Integer C_ID = null;
+		try
+		{
+			C_ID = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+		
+		Integer SHOPPING_ID = null;
+		try
+		{
+			SHOPPING_ID = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+
+		if ( C_ID != null )
+		{
+			model.addAttribute( "customerId", C_ID );
+		}
+
+		if ( SHOPPING_ID != null )
+		{
+			model.addAttribute( "shoppingId", SHOPPING_ID );
+		}
+
+		setupFrontend( model, SHOPPING_ID, C_ID );
+		return "order-inquiry";
+	}
+
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
new file mode 100644
index 0000000..31650a0
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
@@ -0,0 +1,66 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Controller
+@RequestMapping("/product-detail")
+public class ProductDetailServlet extends AController
+{
+	
+	@RequestMapping(method = RequestMethod.GET)
+	public String get(
+					@RequestParam(value= "I_ID", required=false) Integer itemId,
+					@RequestParam(value = "C_ID", required=false ) Integer customerId,
+					@RequestParam(value = "SHOPPING_ID", required=false) Integer shoppingId,
+					HttpServletRequest request,
+					Locale locale, 
+					Model model)
+	{
+		HttpSession session = super.getHttpSession(ProductDetailServlet.class, request);
+				
+
+		IItem item = service.findItemById(itemId);
+		
+		String addToShoppingCartUrl = buildAddToShoppingCartUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "addToShoppingCartUrl", addToShoppingCartUrl);
+		
+		String adminUrl = buildAdminUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "adminUrl", adminUrl );
+		
+		model.addAttribute( "item", item);
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "product_detail";
+	}
+
+	private String buildAddToShoppingCartUrl(Integer shoppingId, Integer customerId, Integer itemId)
+    {
+		String url = getUrl2(shoppingId, customerId, "/shopping-cart");
+		if( url.equals( "/shopping-cart" ))
+			url += "?";
+		
+		url += "&I_ID=" + itemId + "&QTY=1&ADD_FLAG=Y";
+		return url;
+    }
+
+	private String buildAdminUrl(Integer shoppingId, Integer customerId, int id)
+    {
+	    return getUrl2(shoppingId, customerId, "/admin");
+    }
+
+	
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
new file mode 100644
index 0000000..dc2ec2b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
@@ -0,0 +1,83 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+@Controller
+@RequestMapping("/search")
+public class SearchController extends AController
+{
+	
+	@RequestMapping( method=RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+	
+		HttpSession session = super.getHttpSession(SearchController.class, request);
+		
+		String field = request.getParameter("searchField");
+		String keyword = request.getParameter( "keyword" );
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		if( keyword == null)
+		{
+			keyword = "";
+			errors.add( "Search string is empty" );
+			model.addAttribute( "errors", errors );
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		if( field.equalsIgnoreCase( "author" ))
+    		{
+    			model.addAttribute( "results", service.searchByAuthor(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "title" ))
+    		{
+    			model.addAttribute( "results", service.searchByTitle(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "subject" ))
+    		{
+    			model.addAttribute( "results", service.searchBySubject(keyword) );
+    		}
+		}
+		
+		model.addAttribute( "searchField", field );
+		model.addAttribute( "keyword", keyword );
+		setupUrls( model, request);
+		return "search";
+	}
+	
+	private void setupUrls(Model model, HttpServletRequest request)
+	{
+		Integer shoppingId = null;
+		if( request.getParameter( "SHOPPING_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+		Integer customerId = null;
+		if( request.getParameter( "C_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "C_ID" ));
+		}
+		setupFrontend( model, shoppingId, customerId);
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+	}
+	
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
new file mode 100644
index 0000000..019d431
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
@@ -0,0 +1,117 @@
+package eu.cloudscale.showcase.servlets;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Controller
+@RequestMapping("/shopping-cart")
+public class ShoppingCartController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(ShoppingCartController.class, request);
+				
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		Integer itemId = null;
+		Integer customerId = null;
+		Integer shoppingId = null;
+		if( request.getParameter( "I_ID" ) != null )
+		{
+			itemId = Integer.parseInt(request.getParameter( "I_ID" ));
+		}
+		
+		if( request.getParameter( "C_ID" ) != null )
+		{
+			customerId = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		
+		if( request.getParameter( "SHOPPING_ID" ) != null )
+		{
+			shoppingId = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+		String addFlag = request.getParameter("ADD_FLAG");
+		
+		IShoppingCart sc =  service.findShoppingCartById( shoppingId );
+		
+		if( shoppingId == null || sc == null )
+		{
+			sc =  service.createEmptyCart();
+		}
+		
+		if( addFlag != null && addFlag.equals( "Y" ) )
+		{
+			if(itemId == null)
+				errors.add("No item id!");
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		List<Integer> quantities = new ArrayList<Integer>();
+    		List<Integer> ids = new ArrayList<Integer>();
+    		int i = 0;
+    		String curr_QTYstr = request.getParameter( "QTY_" + i ) ;
+    		String curr_I_IDstr = request.getParameter( "I_ID_" + i );
+    		
+    		while (curr_I_IDstr != null) 
+    		{
+    			ids.add(Integer.parseInt(curr_I_IDstr));
+    			quantities.add(Integer.parseInt((curr_QTYstr)));
+    			i++;
+    			curr_QTYstr = request.getParameter("QTY_" + i);
+    			curr_I_IDstr = request.getParameter("I_ID_" + i);
+    		}
+    		
+    		IShoppingCart cart = service.doCart(sc, itemId, ids, quantities);
+    		model.addAttribute( "cart", cart);
+//    		model.addAttribute( "subTotal", getSubTotal(cart.getShoppingCartLines()));
+		
+    		String customerRegistration = getCustomerRegistrationURL(customerId, sc.getScId());
+    		model.addAttribute( "checkoutUrl", customerRegistration);
+		
+    		if( customerId != null )
+    			model.addAttribute("customerId", customerId);
+		}
+		
+		model.addAttribute("errors", errors);
+		setupFrontend(model, sc.getScId(), customerId);
+		return "shopping-cart";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+    {
+		double subtotal = 0;
+		for(IShoppingCartLine scl : shoppingCartLines)
+		{
+			subtotal += scl.getItem().getICost();
+		}
+		
+		return subtotal;
+    }
+
+
+	private String getCustomerRegistrationURL(Integer customerId, Integer shoppingId)
+    {
+		return getUrl2(shoppingId, customerId, "/customer-registration");
+    }	
+	
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java
new file mode 100644
index 0000000..ced040f
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java
@@ -0,0 +1,34 @@
+package eu.cloudscale.showcase.test;
+
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import java.sql.Connection;
+
+
+public class JDBCtest
+{
+	public static void main(String args[])
+	{
+		try
+        {
+	        Class.forName("com.mysql.jdbc.Driver");
+			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/tpcw?user=root&password=toor");
+			Statement statment = conn.createStatement();
+			long start = System.currentTimeMillis();
+			ResultSet resultSet = statment.executeQuery( "SELECT i_id, i_title, a_fname, a_lname , SUM(ol_qty) AS val FROM orders, order_line, item, author WHERE order_line.ol_o_id = orders.o_id AND item.i_id = order_line.ol_i_id AND item.i_subject = 'ARTS' AND item.i_a_id = author.a_id GROUP BY i_id ORDER BY orders.o_date, val DESC LIMIT 50" );
+			System.out.println(start-(System.currentTimeMillis())/1E9);
+        }
+        catch ( ClassNotFoundException e )
+        {
+	        e.printStackTrace();
+        }
+        catch ( SQLException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/java/tresholds.java b/deployment-scripts/scripts/software/showcase/src/main/java/tresholds.java
new file mode 100644
index 0000000..8f1e736
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/java/tresholds.java
@@ -0,0 +1,66 @@
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+
+
+
+public class tresholds
+{
+	static final int HOME_INTERACTION_ID = 0;
+	static final int BEST_SELLERS_INTERACTION_ID = 1;
+	static final int NEW_PRODUCTS_INTERACTION_ID = 2;
+	static final int PRODUCT_DETAIL_INTERACTION_ID = 3;
+	static final int SEARCH1_INTERACTION_ID = 4;
+	static final int SEARCH2_INTERACTION_ID = 5;
+	static final int SEARCH3_INTERACTION_ID = 6;
+	static final int SHOPPING_CART1_INTERACTION_ID = 7;
+	static final int SHOPPING_CART2_INTERACTION_ID = 8;
+	static final int BUY_INTERACTION_ID = 9;
+	static final int ORDER_INQUIRY_INTERACTION_ID = 10;
+	static final int BUY_CONFIRM_INTERACTION_ID = (Integer) null;
+
+	public static void main(String[] args)
+	{
+		HashMap<Integer, LinkedHashMap<Integer, Integer[]>> tresholds = new HashMap<Integer, LinkedHashMap<Integer, Integer[]>>();
+		
+		LinkedHashMap<Integer, Integer[]> homeMap = new LinkedHashMap<Integer, Integer[]>();
+		homeMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		homeMap.put(9559, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		homeMap.put(7688, new Integer[] {ORDER_INQUIRY_INTERACTION_ID});
+		homeMap.put(7585, new Integer[] {NEW_PRODUCTS_INTERACTION_ID});
+		homeMap.put(3792, new Integer[] {BEST_SELLERS_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> bestSellersMap = new LinkedHashMap<Integer, Integer[]>();
+		bestSellersMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		bestSellersMap.put(9942, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		bestSellersMap.put(4607, new Integer[] {HOME_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> buyConfirmMap = new LinkedHashMap<Integer, Integer[]>();
+		buyConfirmMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		buyConfirmMap.put(342, new Integer[] {HOME_INTERACTION_ID});
+
+		LinkedHashMap<Integer, Integer[]> buyRequestMap = new LinkedHashMap<Integer, Integer[]>();
+		buyRequestMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		buyRequestMap.put(9595, new Integer[] {HOME_INTERACTION_ID});
+		buyRequestMap.put(9199, new Integer[] {BUY_CONFIRM_INTERACTION_ID});
+				
+		LinkedHashMap<Integer, Integer[]> customerRegistrationMap = new LinkedHashMap<Integer, Integer[]>();
+		customerRegistrationMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		customerRegistrationMap.put(9619, new Integer[] {HOME_INTERACTION_ID});
+		customerRegistrationMap.put(9145, new Integer[] {BUY_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> newProductsMap = new LinkedHashMap<Integer, Integer[]>();
+		newProductsMap.put( 9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		newProductsMap.put(9941, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		newProductsMap.put(9867, new Integer[] {PRODUCT_DETAIL_INTERACTION_ID});
+		newProductsMap.put(299, new Integer[] {HOME_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> orderDisplayMap = new LinkedHashMap<Integer, Integer[]>();
+		orderDisplayMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		orderDisplayMap.put(802, new Integer[] {HOME_INTERACTION_ID});
+		
+		
+		
+		tresholds.put(HOME_INTERACTION_ID, homeMap);
+	}
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/app.properties b/deployment-scripts/scripts/software/showcase/src/main/resources/app.properties
new file mode 100644
index 0000000..53595f1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/app.properties
@@ -0,0 +1,3 @@
+eu.cloudscale.files.url.css=http\://url-to/css
+eu.cloudscale.files.url.img=http\://url-to/img
+eu.cloudscale.files.url.js=http\://url-to/js
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/app-context.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/app-context.xml
new file mode 100644
index 0000000..adb0a97
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/app-context.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd">
+	
+   	<import resource="classpath:cache.xml" />
+	<import resource="classpath:${eu.cloudscale.datasource}.xml" />
+<!-- 	<import resource="classpath:hibernate.xml" /> -->
+	<import resource="classpath:servlet-context.xml" />
+    <context:annotation-config /> 
+    <context:component-scan base-package="eu.cloudscale.showcase.generate" />
+    
+	<!-- These variables are replaced with ones defined in pom.xml -->
+
+
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/cache.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/cache.xml
new file mode 100644
index 0000000..1709a98
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/cache.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+
+	<cache:annotation-driven />
+				
+	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
+		p:cache-manager-ref="ehcache" />
+	<bean id="ehcache"
+		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
+		p:cacheManagerName="myCacheManager" p:shared="true" p:config-location="classpath:ehcache.xml" />
+		
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.hibernate.properties b/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.hibernate.properties
new file mode 100644
index 0000000..c0484c4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql:loadbalance://10.32.11.115,10.32.11.114,10.32.11.106,10.32.11.105,10.32.11.104,10.32.11.102/tpcw
+jdbc.username=root
+jdbc.password=password
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.mongodb.properties b/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.mongodb.properties
new file mode 100644
index 0000000..098b885
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/database/database.aws.mongodb.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mongodb
+mongodb.dbname=tpcw_test
+mongodb.host=10.10.43.53
+mongodb.port=27017
+mongodb.username=tpcw
+mongodb.password=pass
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/ehcache.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..58ecc72
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/ehcache.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">    
+    <diskStore path="java.io.tmpdir/Cloudscale-cache"/>
+    <defaultCache 
+    	eternal="false" 
+    	maxElementsInMemory="100000"
+        overflowToDisk="false" 
+        diskPersistent="false" 
+        timeToIdleSeconds="0"
+        timeToLiveSeconds="600" 
+        memoryStoreEvictionPolicy="LRU"
+    />
+    
+    <cache 
+     	name="bestSellers"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="newProducts"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="search"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+    
+    <cache 
+     	name="org.hibernate.cache.spi.UpdateTimestampsCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+   
+ 	<cache 
+ 		name="org.hibernate.cache.internal.StandardQueryCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/> 
+</ehcache>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/generate/database.aws.hibernate.properties b/deployment-scripts/scripts/software/showcase/src/main/resources/generate/database.aws.hibernate.properties
new file mode 100644
index 0000000..d80d407
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/generate/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://master/tpcw
+jdbc.username=root
+jdbc.password=password
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/hibernate.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/hibernate.xml
new file mode 100644
index 0000000..1bf2adc
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/hibernate.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xsi:schemaLocation="http://www.springframework.org/schema/jdbc 
+			http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/tx 
+			http://www.springframework.org/schema/tx/spring-tx.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+	
+<!-- 	<context:property-placeholder -->
+<!-- 		location="${eu.cloudscale.showcase.generate.properties}" /> -->
+		<context:property-placeholder 
+			location="classpath:database/database.aws.hibernate.properties" />
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.hibernate" />
+	
+	<bean id="service" class="eu.cloudscale.showcase.db.services.HibernateService" />
+	
+	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
+		destroy-method="close">
+
+		<property name="driverClass" value="${jdbc.driverClassName}" />
+		<property name="jdbcUrl" value="${jdbc.url}" />
+		<property name="user" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<!-- these are C3P0 properties -->
+		<property name="acquireIncrement" value="1" />
+		<property name="minPoolSize" value="4" />
+		<property name="maxPoolSize" value="${connection_pool_size}" />
+<!-- 		<property name="maxPoolSize" value="400"/> -->
+<!-- 		<property name="maxIdleTime" value="30" /> -->
+<!-- 		<property name="maxConnectionAge" value="180" /> -->
+		<!-- <property name="debugUnreturnedConnectionStackTraces" value="true" 
+			/> -->
+		<property name="initialPoolSize" value="4" />
+<!-- 		<property name="idleConnectionTestPeriod" value="5" /> -->
+<!-- 		<property name="checkoutTimeout" value="60000" /> -->
+<!-- 		<property name="maxIdleTimeExcessConnections" value="30" /> -->
+<!-- 		<property name="unreturnedConnectionTimeout" value="60" /> -->
+<!-- 		<property name="debugUnreturnedConnectionStackTraces" value="true" /> -->
+		<!-- <property name="automaticTestTable" value="conTest" /> -->
+<!-- 		<property name="testConnectionOnCheckin" value="true" /> -->
+<!-- 		<property name="testConnectionOnCheckout" value="true" /> -->
+	</bean>
+
+	<tx:annotation-driven transaction-manager="transactionManager" />
+
+	<bean id="sessionFactory"
+		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		
+		<property name="packagesToScan" value="eu.cloudscale.showcase.db.dao" />
+		<property name="hibernateProperties">
+			<props>
+<!-- 				<prop key="hibernate.hbm2ddl.auto">create</prop> -->
+<!-- 				<prop key="hibernate.jdbc.batch_size">50</prop> -->
+				<prop key="hibernate.show_sql">false</prop>
+				<prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
+<!-- 				<prop key="hibernate.max_fetch_depth">4</prop> -->
+				<!-- <prop key="hibernate.connection.release_mode">after_statement</prop> -->
+				<prop key="hibernate.cache.use_second_level_cache">true</prop>
+				<prop key="hibernate.cache.use_query_cache">true</prop>
+				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
+				<prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:ehcache.xml</prop>
+<!-- 				<prop key="hibernate.generate_statistics">true</prop> -->
+			</props>
+		</property>
+		<property name="annotatedClasses">
+			<list>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Address</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Author</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.CcXacts</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Country</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Customer</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Item</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.OrderLine</value>
+				<!-- <value>eu.cloudscale.showcase.db.model.rbms.CcXactsId</value> -->
+				<value>eu.cloudscale.showcase.db.model.hibernate.Orders</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCart
+				</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine
+				</value>
+			</list>
+		</property>
+	</bean>
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+</beans>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/log4j.properties b/deployment-scripts/scripts/software/showcase/src/main/resources/log4j.properties
new file mode 100644
index 0000000..21d09a8
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+log4j.rootCategory=ERROR, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
+log4j.category.org.springframework.beans.factory=ERROR
+log4j.logger.eu.cloudscale.showcase.servlets=ERROR
+log4j.logger.com.mchange=INFO
+log4j.cy.org.springframework.data.document.mongodb=DEBUG
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/mongodb.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/mongodb.xml
new file mode 100644
index 0000000..30cd791
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/mongodb.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/data/mongo
+			http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
+	
+    
+	
+    <context:annotation-config /> 
+	<!-- More information: http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/mongo.core.html -->
+	<context:property-placeholder
+		location="classpath:database/database.aws.mongodb.properties" />
+	
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.mongo.impl" />
+<!-- 	<context:component-scan base-package="eu.cloudscale.showcase.db.services" /> -->
+<!-- 	<context:component-scan base-package="eu.cloudscale.showcase.db.model.mongo" /> -->
+	
+	
+	<mongo:mongo host="${mongodb.host}" port="${mongodb.port}" >
+		<mongo:options connections-per-host="${connection_pool_size}"
+                   	connect-timeout="30000"
+		/>
+	</mongo:mongo>
+
+	<mongo:db-factory dbname="${mongodb.dbname}" username="${mongodb.username}" password="${mongodb.password}" mongo-ref="mongo" />
+
+	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
+	</bean>
+	<bean id="service" class="eu.cloudscale.showcase.db.services.MongoService">
+	</bean>
+</beans>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/schema.sql b/deployment-scripts/scripts/software/showcase/src/main/resources/schema.sql
new file mode 100644
index 0000000..ca29ee9
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/schema.sql
@@ -0,0 +1,264 @@
+SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
+SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
+SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
+
+DROP SCHEMA IF EXISTS `tpcw` ;
+CREATE SCHEMA IF NOT EXISTS `tpcw` DEFAULT CHARACTER SET utf8 COLLATE utf8_slovenian_ci ;
+USE `tpcw` ;
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`author`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`author` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`author` (
+  `A_ID` INT NOT NULL AUTO_INCREMENT ,
+  `A_FNAME` VARCHAR(20) NULL ,
+  `A_LNAME` VARCHAR(20) NULL ,
+  `A_MNAME` VARCHAR(20) NULL ,
+  `A_DOB` DATETIME NULL ,
+  `A_BIO` TEXT NULL ,
+  PRIMARY KEY (`A_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`item`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`item` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`item` (
+  `I_ID` INT NOT NULL AUTO_INCREMENT ,
+  `I_TITLE` VARCHAR(60) NULL ,
+  `I_A_ID` INT NOT NULL ,
+  `I_PUB_DATE` DATETIME NULL ,
+  `I_PUBLISHER` VARCHAR(60) NULL ,
+  `I_SUBJECT` VARCHAR(60) NULL ,
+  `I_DESC` TEXT NULL ,
+  `I_RELATED1` INT NULL ,
+  `I_RELATED2` INT NULL ,
+  `I_RELATED3` INT NULL ,
+  `I_RELATED4` INT NULL ,
+  `I_RELATED5` INT NULL ,
+  `I_THUMBNAIL` VARCHAR(60) NULL ,
+  `I_IMAGE` VARCHAR(60) NULL ,
+  `I_SRP` INT NULL ,
+  `I_COST` INT NULL ,
+  `I_AVAIL` DATETIME NULL ,
+  `I_STOCK` INT NULL ,
+  `I_ISBN` VARCHAR(13) NULL ,
+  `I_PAGE` VARCHAR(4) NULL ,
+  `I_BACKING` VARCHAR(15) NULL ,
+  `I_DIMENSION` VARCHAR(25) NULL ,
+  INDEX `fk_ITEM_AUTHOR` (`I_A_ID` ASC) ,
+  PRIMARY KEY (`I_ID`) ,
+  CONSTRAINT `fk_ITEM_AUTHOR`
+    FOREIGN KEY (`I_A_ID` )
+    REFERENCES `tpcw`.`author` (`A_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`country`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`country` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`country` (
+  `CO_ID` INT NOT NULL AUTO_INCREMENT ,
+  `CO_NAME` VARCHAR(50) NULL ,
+  `CO_EXCHANGE` DOUBLE NULL ,
+  `CO_CURRENCY` VARCHAR(18) NULL ,
+  PRIMARY KEY (`CO_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`address`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`address` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`address` (
+  `ADDR_ID` INT NOT NULL AUTO_INCREMENT ,
+  `ADDR_STREET1` VARCHAR(40) NULL ,
+  `ADDR_STREET2` VARCHAR(40) NULL ,
+  `ADDR_CITY` VARCHAR(30) NULL ,
+  `ADDR_STATE` VARCHAR(20) NULL ,
+  `ADDR_ZIP` VARCHAR(10) NULL ,
+  `ADDR_CO_ID` INT NOT NULL ,
+  PRIMARY KEY (`ADDR_ID`) ,
+  INDEX `fk_ADDRESS_COUNTRY1` (`ADDR_CO_ID` ASC) ,
+  CONSTRAINT `fk_ADDRESS_COUNTRY1`
+    FOREIGN KEY (`ADDR_CO_ID` )
+    REFERENCES `tpcw`.`country` (`CO_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`customer`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`customer` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`customer` (
+  `C_ID` INT NOT NULL AUTO_INCREMENT ,
+  `C_UNAME` VARCHAR(20) NULL ,
+  `C_PASSWD` VARCHAR(20) NULL ,
+  `C_FNAME` VARCHAR(15) NULL ,
+  `C_LNAME` VARCHAR(15) NULL ,
+  `C_ADDR_ID` INT NOT NULL ,
+  `C_PHONE` VARCHAR(16) NULL ,
+  `C_EMAIL` VARCHAR(50) NULL ,
+  `C_SINCE` DATE NULL ,
+  `C_LAST_VISIT` DATE NULL ,
+  `C_LOGIN` DATETIME NULL ,
+  `C_EXPIRATION` DATETIME NULL COMMENT '	' ,
+  `C_DISCOUNT` INT NULL ,
+  `C_BALANCE` INT NULL ,
+  `C_YTD_PMT` INT NULL ,
+  `C_BIRTHDATE` DATE NULL ,
+  `C_DATA` TEXT NULL ,
+  PRIMARY KEY (`C_ID`) ,
+  INDEX `fk_CUSTOMER_ADDRESS1` (`C_ADDR_ID` ASC) ,
+  CONSTRAINT `fk_CUSTOMER_ADDRESS1`
+    FOREIGN KEY (`C_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`orders`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`orders` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`orders` (
+  `O_ID` INT NOT NULL AUTO_INCREMENT ,
+  `O_C_ID` INT NOT NULL ,
+  `O_DATE` DATETIME NULL ,
+  `O_SUB_TOTAL` INT NULL ,
+  `O_TAX` INT NULL ,
+  `O_TOTAL` INT NULL ,
+  `O_SHIP_TYPE` VARCHAR(10) NULL ,
+  `O_SHIP_DATE` DATETIME NULL ,
+  `O_BILL_ADDR_ID` INT NOT NULL ,
+  `O_SHIP_ADDR_ID` INT NOT NULL ,
+  `O_STATUS` VARCHAR(15) NULL ,
+  PRIMARY KEY (`O_ID`) ,
+  INDEX `fk_ORDERS_CUSTOMER1` (`O_C_ID` ASC) ,
+  INDEX `fk_ORDERS_ADDRESS1` (`O_BILL_ADDR_ID` ASC) ,
+  INDEX `fk_ORDERS_ADDRESS2` (`O_SHIP_ADDR_ID` ASC) ,
+  CONSTRAINT `fk_ORDERS_CUSTOMER1`
+    FOREIGN KEY (`O_C_ID` )
+    REFERENCES `tpcw`.`customer` (`C_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDERS_ADDRESS1`
+    FOREIGN KEY (`O_BILL_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDERS_ADDRESS2`
+    FOREIGN KEY (`O_SHIP_ADDR_ID` )
+    REFERENCES `tpcw`.`address` (`ADDR_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`order_line`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`order_line` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`order_line` (
+  `OL_ID` INT NOT NULL ,
+  `OL_O_ID` INT NOT NULL ,
+  `OL_I_ID` INT NOT NULL ,
+  `OL_QTY` INT NULL ,
+  `OL_DISCOUNT` INT NULL ,
+  `OL_COMMENT` VARCHAR(100) NULL ,
+  PRIMARY KEY (`OL_ID`) ,
+  INDEX `fk_ORDER_LINE_ITEM1` (`OL_I_ID` ASC) ,
+  INDEX `fk_ORDER_LINE_ORDERS1` (`OL_O_ID` ASC) ,
+  CONSTRAINT `fk_ORDER_LINE_ITEM1`
+    FOREIGN KEY (`OL_I_ID` )
+    REFERENCES `tpcw`.`item` (`I_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_ORDER_LINE_ORDERS1`
+    FOREIGN KEY (`OL_O_ID` )
+    REFERENCES `tpcw`.`orders` (`O_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`cc_xacts`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`cc_xacts` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`cc_xacts` (
+  `CX_O_ID` INT NOT NULL AUTO_INCREMENT ,
+  `CX_TYPE` VARCHAR(10) NULL ,
+  `CX_NUM` INT NULL ,
+  `CX_NAME` VARCHAR(31) NULL ,
+  `CX_EXPIRY` DATE NULL ,
+  `CX_AUTH_ID` VARCHAR(15) NULL ,
+  `CX_XACT_AMT` DECIMAL(15,2) NULL ,
+  `CX_XACT_DATE` DATETIME NULL ,
+  `CX_CO_ID` INT NOT NULL ,
+  INDEX `fk_CC_XACTS_ORDERS` (`CX_O_ID` ASC) ,
+  INDEX `fk_CC_XACTS_COUNTRY` (`CX_CO_ID` ASC) ,
+  CONSTRAINT `fk_CC_XACTS_ORDERS`
+    FOREIGN KEY (`CX_O_ID` )
+    REFERENCES `tpcw`.`orders` (`O_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `fk_CC_XACTS_COUNTRY`
+    FOREIGN KEY (`CX_CO_ID` )
+    REFERENCES `tpcw`.`country` (`CO_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`shopping_cart`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`shopping_cart` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`shopping_cart` (
+  `SC_ID` INT NOT NULL AUTO_INCREMENT ,
+  `SC_TIME` TIMESTAMP NULL ,
+  PRIMARY KEY (`SC_ID`) )
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `tpcw`.`shopping_cart_line`
+-- -----------------------------------------------------
+DROP TABLE IF EXISTS `tpcw`.`shopping_cart_line` ;
+
+CREATE  TABLE IF NOT EXISTS `tpcw`.`shopping_cart_line` (
+  `SCL_SC_ID` INT NOT NULL AUTO_INCREMENT ,
+  `SCL_QTY` INT NULL ,
+  `SCL_I_ID` INT NOT NULL ,
+  PRIMARY KEY (`SCL_SC_ID`) ,
+  INDEX `fk_shopping_cart_line_item1` (`SCL_I_ID` ASC) ,
+  CONSTRAINT `fk_shopping_cart_line_item1`
+    FOREIGN KEY (`SCL_I_ID` )
+    REFERENCES `tpcw`.`item` (`I_ID` )
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION)
+ENGINE = InnoDB;
+
+
+
+SET SQL_MODE=@OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
diff --git a/deployment-scripts/scripts/software/showcase/src/main/resources/servlet-context.xml b/deployment-scripts/scripts/software/showcase/src/main/resources/servlet-context.xml
new file mode 100644
index 0000000..29131b6
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/resources/servlet-context.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<!-- DispatcherServlet Context: defines this servlet's request-processing 
+		infrastructure -->
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<annotation-driven />
+
+	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
+		up static resources in the ${webappRoot}/resources directory -->
+	<resources mapping="/resources/**" location="/resources/" />
+
+	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
+		in the /WEB-INF/views directory -->
+	<beans:bean id="templateResolver"
+		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="suffix" value=".html" />
+		<beans:property name="templateMode" value="HTML5" />
+	</beans:bean>
+
+	<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+		<beans:property name="templateResolver" ref="templateResolver" />
+		<beans:property name="additionalDialects">
+			<beans:set>
+				<beans:bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
+			</beans:set>
+		</beans:property>
+	</beans:bean>
+
+	<beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+		<beans:property name="templateEngine" ref="templateEngine" />
+		<beans:property name="order" value="1" />
+	</beans:bean>
+
+	<beans:bean
+		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="order" value="2" />
+		<beans:property name="suffix" value=".html" />
+	</beans:bean>
+
+	<context:component-scan base-package="eu.cloudscale.showcase.servlets" />
+
+</beans:beans>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.css b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.css
new file mode 100644
index 0000000..2f56af3
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.css
@@ -0,0 +1,6158 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  width: auto\9;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img,
+.google-maps img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+  cursor: pointer;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+@media print {
+  * {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !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: 0.5cm;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover,
+a:focus {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+  margin-left: 2.127659574468085%;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 21px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+a.muted:hover,
+a.muted:focus {
+  color: #808080;
+}
+
+.text-warning {
+  color: #c09853;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #a47e3c;
+}
+
+.text-error {
+  color: #b94a48;
+}
+
+a.text-error:hover,
+a.text-error:focus {
+  color: #953b39;
+}
+
+.text-info {
+  color: #3a87ad;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+  color: #2d6987;
+}
+
+.text-success {
+  color: #468847;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+  color: #356635;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 20px;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1,
+h2,
+h3 {
+  line-height: 40px;
+}
+
+h1 {
+  font-size: 38.5px;
+}
+
+h2 {
+  font-size: 31.5px;
+}
+
+h3 {
+  font-size: 24.5px;
+}
+
+h4 {
+  font-size: 17.5px;
+}
+
+h5 {
+  font-size: 14px;
+}
+
+h6 {
+  font-size: 11.9px;
+}
+
+h1 small {
+  font-size: 24.5px;
+}
+
+h2 small {
+  font-size: 17.5px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+  display: inline-block;
+  *display: inline;
+  padding-right: 5px;
+  padding-left: 5px;
+  *zoom: 1;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal {
+  *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.dl-horizontal:after {
+  clear: both;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 160px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 180px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 17.5px;
+  font-weight: 300;
+  line-height: 1.25;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  white-space: nowrap;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 10px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  vertical-align: middle;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+input,
+textarea,
+.uneditable-input {
+  width: 206px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 20px;
+  padding-left: 20px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -20px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"],
+.row-fluid .controls-row [class*="span"] {
+  float: left;
+}
+
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+  padding-top: 5px;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning .control-label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error .control-label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success .control-label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+.control-group.info .control-label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+  color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  border-color: #3a87ad;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+  border-color: #2d6987;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #3a87ad;
+}
+
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:invalid:focus,
+textarea:focus:invalid:focus,
+select:focus:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  display: inline-block;
+  margin-bottom: 10px;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input,
+.input-append .dropdown-menu,
+.input-prepend .dropdown-menu,
+.input-append .popover,
+.input-prepend .popover {
+  font-size: 14px;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  vertical-align: top;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn,
+.input-append .btn-group > .dropdown-toggle,
+.input-prepend .btn-group > .dropdown-toggle {
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input + .btn-group .btn:last-child,
+.input-append select + .btn-group .btn:last-child,
+.input-append .uneditable-input + .btn-group .btn:last-child {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append .add-on,
+.input-append .btn,
+.input-append .btn-group {
+  margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child,
+.input-append .btn-group:last-child > .dropdown-toggle {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append input + .btn-group .btn,
+.input-prepend.input-append select + .btn-group .btn,
+.input-prepend.input-append .uneditable-input + .btn-group .btn {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .btn-group:first-child {
+  margin-left: 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 160px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 180px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+  margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block,
+.form-horizontal .uneditable-input + .help-block,
+.form-horizontal .input-prepend + .help-block,
+.form-horizontal .input-append + .help-block {
+  margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 180px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table .table {
+  background-color: #ffffff;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child > th:first-child,
+.table-bordered tbody:first-child tr:first-child > td:first-child,
+.table-bordered tbody:first-child tr:first-child > th:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child > th:last-child,
+.table-bordered tbody:first-child tr:first-child > td:last-child,
+.table-bordered tbody:first-child tr:first-child > th:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:first-child,
+.table-bordered tbody:last-child tr:last-child > td:first-child,
+.table-bordered tbody:last-child tr:last-child > th:first-child,
+.table-bordered tfoot:last-child tr:last-child > td:first-child,
+.table-bordered tfoot:last-child tr:last-child > th:first-child {
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:last-child,
+.table-bordered tbody:last-child tr:last-child > td:last-child,
+.table-bordered tbody:last-child tr:last-child > th:last-child,
+.table-bordered tfoot:last-child tr:last-child > td:last-child,
+.table-bordered tfoot:last-child tr:last-child > th:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
+  -webkit-border-bottom-left-radius: 0;
+          border-bottom-left-radius: 0;
+  -moz-border-radius-bottomleft: 0;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 0;
+          border-bottom-right-radius: 0;
+  -moz-border-radius-bottomright: 0;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-striped tbody > tr:nth-child(odd) > td,
+.table-striped tbody > tr:nth-child(odd) > th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover > td,
+.table-hover tbody tr:hover > th {
+  background-color: #f5f5f5;
+}
+
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+.table td.span1,
+.table th.span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+.table td.span2,
+.table th.span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+.table td.span3,
+.table th.span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+.table td.span4,
+.table th.span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+.table td.span5,
+.table th.span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+.table td.span6,
+.table th.span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+.table td.span7,
+.table th.span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+.table td.span8,
+.table th.span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+.table td.span9,
+.table th.span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+.table td.span10,
+.table th.span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+.table td.span11,
+.table th.span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+.table td.span12,
+.table th.span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+.table tbody tr.success > td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error > td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.warning > td {
+  background-color: #fcf8e3;
+}
+
+.table tbody tr.info > td {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover > td {
+  background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover > td {
+  background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover > td {
+  background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover > td {
+  background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  width: 16px;
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+
+.dropup .dropdown-submenu > .dropdown-menu {
+  top: auto;
+  bottom: 0;
+  margin-top: 0;
+  margin-bottom: -2px;
+  -webkit-border-radius: 5px 5px 5px 0;
+     -moz-border-radius: 5px 5px 5px 0;
+          border-radius: 5px 5px 5px 0;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown-submenu.pull-left {
+  float: none;
+}
+
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  z-index: 1051;
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #cccccc;
+  *border: 0;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:focus,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover,
+.btn:focus {
+  color: #333333;
+  text-decoration: none;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 11px 19px;
+  font-size: 17.5px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+  margin-top: 4px;
+}
+
+.btn-small {
+  padding: 2px 10px;
+  font-size: 11.9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+  margin-top: -1px;
+}
+
+.btn-mini {
+  padding: 0 6px;
+  font-size: 10.5px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:focus,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+  color: #333333;
+  text-decoration: none;
+}
+
+.btn-group {
+  position: relative;
+  display: inline-block;
+  *display: inline;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 10.5px;
+}
+
+.btn-group > .btn-small {
+  font-size: 11.9px;
+}
+
+.btn-group > .btn-large {
+  font-size: 17.5px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.btn-mini .caret,
+.btn-small .caret {
+  margin-top: 8px;
+}
+
+.dropup .btn-large .caret {
+  border-bottom-width: 5px;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical > .btn {
+  display: block;
+  float: none;
+  max-width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical > .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical > .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical > .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical > .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical > .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert,
+.alert h4 {
+  color: #c09853;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-success h4 {
+  color: #468847;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-danger h4,
+.alert-error h4 {
+  color: #b94a48;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-info h4 {
+  color: #3a87ad;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > li > a > img {
+  max-width: none;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover,
+.tabs-below > .nav-tabs > li > a:focus {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-inner:after {
+  clear: both;
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+  overflow: visible;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #777777;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover,
+.navbar .brand:focus {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #777777;
+}
+
+.navbar-link {
+  color: #777777;
+}
+
+.navbar-link:hover,
+.navbar-link:focus {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+  margin-top: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 5px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+  margin-right: 0;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #777777;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:focus,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+  border-top-color: #333333;
+  border-bottom-color: #333333;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #777777;
+  border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover,
+.navbar-inverse .brand:focus,
+.navbar-inverse .nav > li > a:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .brand {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-text {
+  color: #999999;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover,
+.navbar-inverse .navbar-link:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > a:hover .caret,
+.navbar-inverse .nav li.dropdown > a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:focus,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb > li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb > li > .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb > .active {
+  color: #999999;
+}
+
+.pagination {
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+  display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+  float: left;
+  padding: 4px 12px;
+  line-height: 20px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+  border-left-width: 1px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pagination-large ul > li > a,
+.pagination-large ul > li > span {
+  padding: 11px 19px;
+  font-size: 17.5px;
+}
+
+.pagination-large ul > li:first-child > a,
+.pagination-large ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.pagination-large ul > li:last-child > a,
+.pagination-large ul > li:last-child > span {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.pagination-mini ul > li:first-child > a,
+.pagination-small ul > li:first-child > a,
+.pagination-mini ul > li:first-child > span,
+.pagination-small ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 3px;
+          border-bottom-left-radius: 3px;
+  -webkit-border-top-left-radius: 3px;
+          border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -moz-border-radius-topleft: 3px;
+}
+
+.pagination-mini ul > li:last-child > a,
+.pagination-small ul > li:last-child > a,
+.pagination-mini ul > li:last-child > span,
+.pagination-small ul > li:last-child > span {
+  -webkit-border-top-right-radius: 3px;
+          border-top-right-radius: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+          border-bottom-right-radius: 3px;
+  -moz-border-radius-topright: 3px;
+  -moz-border-radius-bottomright: 3px;
+}
+
+.pagination-small ul > li > a,
+.pagination-small ul > li > span {
+  padding: 2px 10px;
+  font-size: 11.9px;
+}
+
+.pagination-mini ul > li > a,
+.pagination-mini ul > li > span {
+  padding: 0 6px;
+  font-size: 10.5px;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 10%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin-left: -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  outline: none;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 10%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  position: relative;
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  font-size: 11px;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  text-align: left;
+  white-space: normal;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-top: -10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-left: -10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-title:empty {
+  display: none;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow {
+  border-width: 11px;
+}
+
+.popover .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-bottom-width: 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  border-right-color: #ffffff;
+  border-left-width: 0;
+}
+
+.popover.bottom .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-top-width: 0;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  border-left-color: #ffffff;
+  border-right-width: 0;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.media,
+.media-body {
+  overflow: hidden;
+  *overflow: visible;
+  zoom: 1;
+}
+
+.media,
+.media .media {
+  margin-top: 15px;
+}
+
+.media:first-child {
+  margin-top: 0;
+}
+
+.media-object {
+  display: block;
+}
+
+.media-heading {
+  margin: 0 0 5px;
+}
+
+.media > .pull-left {
+  margin-right: 10px;
+}
+
+.media > .pull-right {
+  margin-left: 10px;
+}
+
+.media-list {
+  margin-left: 0;
+  list-style: none;
+}
+
+.label,
+.badge {
+  display: inline-block;
+  padding: 2px 4px;
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding-right: 9px;
+  padding-left: 9px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+.label:empty,
+.badge:empty {
+  display: none;
+}
+
+a.label:hover,
+a.label:focus,
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+
+.carousel-inner > .active {
+  left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel-inner > .next {
+  left: 100%;
+}
+
+.carousel-inner > .prev {
+  left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+
+.carousel-inner > .active.left {
+  left: -100%;
+}
+
+.carousel-inner > .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-indicators {
+  position: absolute;
+  top: 15px;
+  right: 15px;
+  z-index: 5;
+  margin: 0;
+  list-style: none;
+}
+
+.carousel-indicators li {
+  display: block;
+  float: left;
+  width: 10px;
+  height: 10px;
+  margin-left: 5px;
+  text-indent: -999px;
+  background-color: #ccc;
+  background-color: rgba(255, 255, 255, 0.25);
+  border-radius: 5px;
+}
+
+.carousel-indicators .active {
+  background-color: #fff;
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit li {
+  line-height: 30px;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.min.css b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.min.css
new file mode 100644
index 0000000..c10c7f4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.css b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.css
new file mode 100644
index 0000000..fcd72f7
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+@-ms-viewport {
+  width: device-width;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+.visible-print {
+  display: none !important;
+}
+
+@media print {
+  .visible-print {
+    display: inherit !important;
+  }
+  .hidden-print {
+    display: none !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.564102564102564%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.7624309392265194%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .uneditable-input[class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="offset"]:first-child {
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade {
+    top: -100px;
+  }
+  .modal.fade.in {
+    top: 20px;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .media .pull-left,
+  .media .pull-right {
+    display: block;
+    float: none;
+    margin-bottom: 10px;
+  }
+  .media-object {
+    margin-right: 0;
+    margin-left: 0;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .nav > li > a:focus,
+  .nav-collapse .dropdown-menu a:hover,
+  .nav-collapse .dropdown-menu a:focus {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a,
+  .navbar-inverse .nav-collapse .dropdown-menu a {
+    color: #999999;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .nav > li > a:focus,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: none;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .open > .dropdown-menu {
+    display: block;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.min.css b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..d1b7f4b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/add_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/add_B.gif
new file mode 100644
index 0000000..b8aed96
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/add_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/best_sellers.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/best_sellers.gif
new file mode 100644
index 0000000..25dc936
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/best_sellers.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/checkout_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/checkout_B.gif
new file mode 100644
index 0000000..fd793e6
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/checkout_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/display_last_order_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/display_last_order_B.gif
new file mode 100644
index 0000000..569cb83
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/display_last_order_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings.png b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings.png differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings-white.png b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/glyphicons-halflings-white.png differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/home_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/home_B.gif
new file mode 100644
index 0000000..972c356
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/home_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale.png b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale.png
new file mode 100644
index 0000000..3500f6c
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale.png differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale-aws.png b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale-aws.png
new file mode 100644
index 0000000..069cadd
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/logo-CloudScale-aws.png differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/order_status_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/order_status_B.gif
new file mode 100644
index 0000000..91c3ffc
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/order_status_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/refresh_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/refresh_B.gif
new file mode 100644
index 0000000..944aab6
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/refresh_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/search_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/search_B.gif
new file mode 100644
index 0000000..b2f115e
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/search_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/shopping_cart_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/shopping_cart_B.gif
new file mode 100644
index 0000000..d68076f
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/shopping_cart_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/submit_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/submit_B.gif
new file mode 100644
index 0000000..a3e3b71
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/submit_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/tpclogo.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/tpclogo.gif
new file mode 100644
index 0000000..f0fde9d
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/tpclogo.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/update_B.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/update_B.gif
new file mode 100644
index 0000000..584a852
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/update_B.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/whats_new.gif b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/whats_new.gif
new file mode 100644
index 0000000..892c02a
Binary files /dev/null and b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/img/whats_new.gif differ
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.js b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.js
new file mode 100644
index 0000000..c298ee4
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.js
@@ -0,0 +1,2276 @@
+/* ===================================================
+ * bootstrap-transition.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+   * ======================================================= */
+
+  $(function () {
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-alert.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.alert
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT NO CONFLICT
+  * ================= */
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-button.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.button
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON NO CONFLICT
+  * ================== */
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    $btn.button('toggle')
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-carousel.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options = options
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      if (this.interval) clearInterval(this.interval);
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , getActiveIndex: function () {
+      this.$active = this.$element.find('.item.active')
+      this.$items = this.$active.parent().children()
+      return this.$items.index(this.$active)
+    }
+
+  , to: function (pos) {
+      var activeIndex = this.getActiveIndex()
+        , that = this
+
+      if (pos > (this.$items.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activeIndex == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle(true)
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      e = $.Event('slide', {
+        relatedTarget: $next[0]
+      , direction: direction
+      })
+
+      if ($next.hasClass('active')) return
+
+      if (this.$indicators.length) {
+        this.$indicators.find('.active').removeClass('active')
+        this.$element.one('slid', function () {
+          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+          $nextIndicator && $nextIndicator.addClass('active')
+        })
+      }
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.carousel
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL NO CONFLICT
+  * ==================== */
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var $this = $(this), href
+      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      , options = $.extend({}, $target.data(), $this.data())
+      , slideIndex
+
+    $target.carousel(options)
+
+    if (slideIndex = $this.attr('data-slide-to')) {
+      $target.data('carousel').pause().to(slideIndex).cycle()
+    }
+
+    e.preventDefault()
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-collapse.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning || this.$element.hasClass('in')) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning || !this.$element.hasClass('in')) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSE PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.collapse
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSE NO CONFLICT
+  * ==================== */
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+ /* COLLAPSE DATA-API
+  * ================= */
+
+  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+    var $this = $(this), href
+      , target = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+      , option = $(target).data('collapse') ? 'toggle' : $this.data()
+    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    $(target).collapse(option)
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-dropdown.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+      }
+
+      $this.focus()
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) {
+        if (e.which == 27) $parent.find(toggle).focus()
+        return $this.click()
+      }
+
+      $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    $(toggle).each(function () {
+      getParent($(this)).removeClass('open')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = selector && $(selector)
+
+    if (!$parent || !$parent.length) $parent = $this.parent()
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+  * ==================== */
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(document)
+    .on('click.dropdown.data-api', clearMenus)
+    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.dropdown-menu', function (e) { e.stopPropagation() })
+    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
+/* =========================================================
+ * bootstrap-modal.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element.show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
+            that.$element.focus().trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function () {
+        var that = this
+        this.$element.hide()
+        this.backdrop(function () {
+          that.removeBackdrop()
+          that.$element.trigger('hidden')
+        })
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop && this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          this.$backdrop.click(
+            this.options.backdrop == 'static' ?
+              $.proxy(this.$element[0].focus, this.$element[0])
+            : $.proxy(this.hide, this)
+          )
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          if (!callback) return
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.modal
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL NO CONFLICT
+  * ================= */
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+      , href = $this.attr('href')
+      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
+
+    e.preventDefault()
+
+    $target
+      .modal(option)
+      .one('hide', function () {
+        $this.focus()
+      })
+  })
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-tooltip.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+        , triggers
+        , trigger
+        , i
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      triggers = this.options.trigger.split(' ')
+
+      for (i = triggers.length; i--;) {
+        trigger = triggers[i]
+        if (trigger == 'click') {
+          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+        } else if (trigger != 'manual') {
+          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+        }
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var defaults = $.fn[this.type].defaults
+        , options = {}
+        , self
+
+      this._options && $.each(this._options, function (key, value) {
+        if (defaults[key] != value) options[key] = value
+      }, this)
+
+      self = $(e.currentTarget)[this.type](options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+        , e = $.Event('show')
+
+      if (this.hasContent() && this.enabled) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        $tip
+          .detach()
+          .css({ top: 0, left: 0, display: 'block' })
+
+        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+        pos = this.getPosition()
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        this.applyPlacement(tp, placement)
+        this.$element.trigger('shown')
+      }
+    }
+
+  , applyPlacement: function(offset, placement){
+      var $tip = this.tip()
+        , width = $tip[0].offsetWidth
+        , height = $tip[0].offsetHeight
+        , actualWidth
+        , actualHeight
+        , delta
+        , replace
+
+      $tip
+        .offset(offset)
+        .addClass(placement)
+        .addClass('in')
+
+      actualWidth = $tip[0].offsetWidth
+      actualHeight = $tip[0].offsetHeight
+
+      if (placement == 'top' && actualHeight != height) {
+        offset.top = offset.top + height - actualHeight
+        replace = true
+      }
+
+      if (placement == 'bottom' || placement == 'top') {
+        delta = 0
+
+        if (offset.left < 0){
+          delta = offset.left * -2
+          offset.left = 0
+          $tip.offset(offset)
+          actualWidth = $tip[0].offsetWidth
+          actualHeight = $tip[0].offsetHeight
+        }
+
+        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+      } else {
+        this.replaceArrow(actualHeight - height, actualHeight, 'top')
+      }
+
+      if (replace) $tip.offset(offset)
+    }
+
+  , replaceArrow: function(delta, dimension, position){
+      this
+        .arrow()
+        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+        , e = $.Event('hide')
+
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).detach()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.detach()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.detach()
+
+      this.$element.trigger('hidden')
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function () {
+      var el = this.$element[0]
+      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+        width: el.offsetWidth
+      , height: el.offsetHeight
+      }, this.$element.offset())
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , arrow: function(){
+      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function (e) {
+      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
+      self.tip().hasClass('in') ? self.hide() : self.show()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover focus'
+  , title: ''
+  , delay: 0
+  , html: false
+  , container: false
+  }
+
+
+ /* TOOLTIP NO CONFLICT
+  * =================== */
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-popover.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+        || $e.attr('data-content')
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.popover
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+ /* POPOVER NO CONFLICT
+  * =================== */
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-scrollspy.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY NO CONFLICT
+  * ===================== */
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);/* ========================================================
+ * bootstrap-tab.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active:last a')[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+  * =============== */
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-typeahead.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.source = this.options.source
+    this.$menu = $(this.options.menu)
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.position(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu
+        .insertAfter(this.$element)
+        .css({
+          top: pos.top + pos.height
+        , left: pos.left
+        })
+        .show()
+
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('focus',    $.proxy(this.focus, this))
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if (this.eventSupported('keydown')) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
+    }
+
+  , eventSupported: function(eventName) {
+      var isSupported = eventName in this.$element
+      if (!isSupported) {
+        this.$element.setAttribute(eventName, 'return;')
+        isSupported = typeof this.$element[eventName] === 'function'
+      }
+      return isSupported
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+        case 16: // shift
+        case 17: // ctrl
+        case 18: // alt
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , focus: function (e) {
+      this.focused = true
+    }
+
+  , blur: function (e) {
+      this.focused = false
+      if (!this.mousedover && this.shown) this.hide()
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+      this.$element.focus()
+    }
+
+  , mouseenter: function (e) {
+      this.mousedover = true
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  , mouseleave: function (e) {
+      this.mousedover = false
+      if (!this.focused && this.shown) this.hide()
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  var old = $.fn.typeahead
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /* TYPEAHEAD NO CONFLICT
+  * =================== */
+
+  $.fn.typeahead.noConflict = function () {
+    $.fn.typeahead = old
+    return this
+  }
+
+
+ /* TYPEAHEAD DATA-API
+  * ================== */
+
+  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+    var $this = $(this)
+    if ($this.data('typeahead')) return
+    $this.typeahead($this.data())
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window)
+      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.affix
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX NO CONFLICT
+  * ================= */
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.min.js b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.min.js
new file mode 100644
index 0000000..95c5ac5
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/resources/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
new file mode 100644
index 0000000..7e780e1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<!-- DispatcherServlet Context: defines this servlet's request-processing 
+		infrastructure -->
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<annotation-driven />
+
+	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
+		up static resources in the ${webappRoot}/resources directory -->
+	<resources mapping="/resources/**" location="/resources/" />
+
+	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
+		in the /WEB-INF/views directory -->
+	<beans:bean id="templateResolver"
+		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="suffix" value=".html" />
+		<beans:property name="templateMode" value="HTML5" />
+	</beans:bean>
+
+	<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+		<beans:property name="templateResolver" ref="templateResolver" />
+		<beans:property name="additionalDialects">
+			<beans:set>
+				<beans:bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
+			</beans:set>
+		</beans:property>
+	</beans:bean>
+
+	<beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+		<beans:property name="templateEngine" ref="templateEngine" />
+		<beans:property name="order" value="1" />
+	</beans:bean>
+
+	<beans:bean
+		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="order" value="2" />
+		<beans:property name="suffix" value=".html" />
+	</beans:bean>
+
+	<beans:bean name="main" class="org.thymeleaf.spring3.view.ThymeleafView">
+		<beans:property name="staticVariables">
+			<beans:map>
+				<beans:entry key="footer" value="Some company: &lt;b&gt;ACME&lt;/b&gt;" />
+			</beans:map>
+		</beans:property>
+	</beans:bean>
+
+	<context:component-scan base-package="eu.cloudscale.showcase.servlets" />
+
+</beans:beans>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/root-context.xml b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/root-context.xml
new file mode 100644
index 0000000..9cbb4aa
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/spring/root-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<!-- Root Context: defines shared resources visible to all other web components -->
+	<import resource="classpath:app-context.xml" />
+</beans>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/best-sellers.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/best-sellers.html
new file mode 100644
index 0000000..09896ec
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/best-sellers.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Best sellers</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+<!-- 					<td th:text="${item}"></td> -->
+					<td th:text="${item[2] + ' ' + item[3]}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item[0]} + '' + ${productUrl}}" th:text="${item[1]}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy.html
new file mode 100644
index 0000000..9c7bf4d
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="container-narrow">
+		<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="${error}"></div>
+		</div>
+		<div th:unless="${!errors.isEmpty()}">
+			<form th:action="@{/buy-confirm(C_ID=${customer.CId})}" method="get">
+				<div class="billing-info">
+					<h2>Billing information:</h2>
+					<table>
+						<tr>
+							<td>Firstname:</td>
+							<td th:text="${customer.CFname}"></td>
+						</tr>
+						<tr>
+							<td>Lastname:</td>
+							<td th:text="${customer.CLname}"></td>
+						</tr>
+					</table>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street2:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet2}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrCity}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrState}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrZip}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.country.coName}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Email</div>
+					<div class="pull-left content" th:text="${customer.CEmail}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Phone:</div>
+					<div class="pull-left content" th:text="${customer.CPhone}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+				</div>
+				<hr />
+				<div class="shipping-info">
+					<h2>Shipping information:</h2>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content">
+						<input type="text" name="street1" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street 2:</div>
+					<div class="pull-left content">
+						<input type="text" name="street2" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content">
+						<input type="text" name="city" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content">
+						<input type="text" name="state" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content">
+						<input type="text" name="zip" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content">
+						<input type="text" name="country" />
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<div class="clearfix"></div>
+				<hr />
+				<h2>Order information:</h2>
+				<div>
+					<table class="table">
+						<thead>
+							<tr>
+								<th>OTY</th>
+								<th>Product</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr th:if="${cart != null and cart.shoppingCartLines != null}" th:each="line, i : ${cart.shoppingCartLines}">
+								<td th:text="${line.sclQty}"></td>
+								<td>Title: <i th:text="${line.item.ITitle}"></i> - Backing:
+									<span th:text="${line.item.IBacking}"></span><br /> SRP. $<span
+									th:text="${line.item.ISrp}"></span> <span style="color: red;"><strong>Your
+											Price: <span th:text="${line.item.ICost}"></span>
+									</strong></span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+				<div>
+					Subtotal width discount (0.0%): $<span th:text="${subTotal}"></span><br />
+					Tax:<br /> Shipping and Handling: <br /> Total: $<span
+						th:text="${subTotal}"></span><br />
+				</div>
+				<hr />
+				<div class="payment">
+					<div class="pull-left myLabel">CreditCartType</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Visa" checked="checked" />Visa&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="MasterCard" />MasterCard&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Discover" />Discover&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Amex" />American Express&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Diners" />Diners&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Name on Credit Card</div>
+					<div class="pull-left content">
+						<input name="CC_NAME" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Number</div>
+					<div class="pull-left content">
+						<input name="CC_NUMBER" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Expiration Date
+						(mm/dd/yyyy)</div>
+					<div class="pull-left content">
+						<input name="CC_EXPIRY" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Shipping method</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="AIR" checked="checked" />AIR&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="UPS" />UPS&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="FEDEX" />FEDEX&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="SHIP" />SHIP&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="COURIER" />COURIER&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="MAIL" />MAIL&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<input th:if="${cart}" th:value="${cart.scId}" type="hidden"
+					name="SHOPPING_ID" /> <input th:if="${customer}"
+					th:value="${customer.CId}" type="hidden" name="C_ID" /> <input
+					class="btn btn-primary" type="submit" value="Submit" />
+			</form>
+		</div>
+	</div>
+</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy-confirm.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy-confirm.html
new file mode 100644
index 0000000..680b1d3
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/buy-confirm.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy confirm</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}">
+		</div>
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<h2 align="center">Buy confirm</h2>
+		<h2>Order information:</h2>
+		<table class="table">
+			<thead>
+				<tr>
+					<th>
+						QTY
+					</th>
+					<th>
+						Product
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="line : ${results.cart.shoppingCartLines}">
+					<td th:text="${line.sclQty}">
+					</td>
+					<td>
+						Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+						<span th:text="${line.item.IBacking}"></span><br />
+						SRP. $<span th:text="${line.item.ISrp}"></span>
+						<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+		<h2>Your order has been processed</h2>
+		<div class="pull-left myLabel">
+			Subtotal with discount:
+		</div>
+		<div class="pull-left content" th:text="${scSubTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Tax (8.25%):
+		</div>
+		<div class="pull-left content" th:text="${scTax}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Shipping and Handling:
+		</div>
+		<div class="pull-left content" th:text="${scShipCost}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Total:
+		</div>
+		<div class="pull-left content" th:text="${scTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<h2>Order Number: <span th:text="${results.order.OId}"></span></h2>
+		<h1>Thank you for shopping at TPC-W</h1>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/customer-registration.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/customer-registration.html
new file mode 100644
index 0000000..d15b5ee
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/customer-registration.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Customer registration</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<h2 align="center">Customer registration</h2>
+	<form th:action="@{'/buy;jsessionid=' + ${sessionId}}" method="get">
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="Y" checked="checked" />I am existing user
+			</label>
+		</div>
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="N" />I am a first time customer
+			</label>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are an existing customer, enter your username and password:</strong><br/>
+			<br />
+			<fieldset>
+				<label>
+					Username:
+				</label>
+				<input name="username" type="text" />
+				<label>
+					Password:
+				</label>
+				<input name="password" type="password" />
+			</fieldset>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are a first time customer, enter the details below:</strong><br />
+			<br />
+			<fieldset>
+				<label>Enter your birth date (mm/dd/yyyy):</label>
+				<input name="birthdate" />
+				<label>Enter your first name: </label>
+				<input name="fname" />
+				<label>Enter your last name: </label>
+				<input name="lname" />
+				<label>
+					Enter your address 1:
+				</label>
+				<input name="street1" />
+				<label>
+					Enter your address 2:
+				</label>
+				<input name="street2" />
+				<label>
+					Enter your City, State, Zip:
+				</label> 
+				<input name="city" placeholder="City" /> 
+				<input name="state" placeholder="State" /> 
+				<input name="zip" placeholder="Zip" />
+				<label>
+					Enter your Country: 
+				</label>
+				<input name="country" />
+				<label>
+					Enter your Phone: 
+				</label>
+				<input name="phone" />
+				<label>
+				Enter your Email: 
+				</label>
+				<input name="email" />
+				<label>
+					Special Instructions: 
+				</label>
+				<textarea name="data" rows="4" cols="65"></textarea>
+				<input th:if="${customerId}" type="hidden" th:value="${customerId}" name="C_ID" />
+				<input th:if="${shoppingId}" type="hidden" th:value="${shoppingId}" name="SHOPPING_ID" />
+			</fieldset>
+		</div>
+		<center><input type="submit" value="Submit" class="btn" /></center>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/home.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/home.html
new file mode 100644
index 0000000..607ae5b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/home.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>TPC-W</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+<!-- 	<div th:text="${welcomeMessage}"> -->
+<!-- 	</div> -->
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<div class="categories">
+		<div>
+			<div class="pull-left" style="width: 340px; text-align: center;">
+				<h3>What's new</h3>
+			</div>
+			<div class="pull-right" style="width: 260px; text-align: center;">
+				<h3>Best sellers</h3>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		<div>
+			<div class="pull-left left-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/new-products?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/new-products?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="pull-right right-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/best-sellers?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/best-sellers?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="clearfix"></div>
+		</div>		
+	</div>
+</div>
+
+</body>
+</html>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/login.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/login.html
new file mode 100644
index 0000000..f43ff9a
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/login.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>Order inquiry</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap.min.css}"/>
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap-responsive.min.css}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a href="#">Search</a></li>
+		  <li><a href="#">Shopping cart</a></li>
+		  <li><a href="#">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{/resources/img/logo-CloudScale.png}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div th:if="${errors}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}"></div>
+	</div>
+	<form action="#"  th:action="@{/login}" method="post">
+		<input type="hidden" th:value="${referer}" name="referer" />
+		<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<input class="btn" type="submit" value="Submit" />
+		</fieldset>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/new-products.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/new-products.html
new file mode 100644
index 0000000..cad7890
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/new-products.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>New products</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+				<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-display.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-display.html
new file mode 100644
index 0000000..816aa1b
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-display.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order display</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="alert alert-error" th:if="${!errors.isEmpty()}" th:each="erro : ${errors}">
+		<div th:text="${err}"></div>		
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<div th:if="${order}">
+			<p>
+				<strong>Order ID:</strong><span th:text="${order.OId}"></span>
+			</p>
+			<p>
+				<strong>Order Placed on:</strong>
+				<span th:text="${order.ODate}"></span>
+			</p>
+			<p>
+				<strong>Shipping Type:</strong>
+				<span th:text="${order.OShipType}"></span>
+			</p>
+			<p>
+				<strong>Ship date:</strong>
+				<span th:text="${order.OShipDate}"></span>
+			</p>
+			<p>
+				<strong>Order subtotal:</strong>
+				<span th:text="${order.OSubTotal}"></span>
+			</p>
+			<p>
+				<strong>Order Tax:</strong>
+				<span th:text="${order.OTax}"></span>
+			</p>
+			<p>
+				<strong>Order Total:</strong>
+				<span th:text="${order.OTotal}"></span>
+			</p>
+			
+			<div class="pull-left" style="width: 400px">
+				<strong>
+					Bill To:<br/>
+					<span th:text="${order.customer.CFname} + ' ' + ${order.customer.CLname}"></span><br />
+				</strong>
+				<br />
+				<address>
+					<span th:text="${order.addressByOShipAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrState} + ' ' + ${order.addressByOShipAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.country.coName}"></span>
+				</address>
+				<br />
+				Email: <span th:text="${order.customer.CEmail}"></span><br/>
+				Phone: <span th:text=" ${order.customer.CPhone}"></span><br/>
+				<br />
+				Order status: <span th:text="${order.OStatus}"></span><br />
+			</div>
+			<div class="pull-left">
+				<strong>
+					Ship to: 
+				</strong><br />
+				<br />
+				<address>
+					<span th:text="${order.addressByOBillAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrState} + ' ' + ${order.addressByOBillAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.country.coName}"></span><br />
+				</address>
+			</div>
+			
+			<table class="table">
+				<thead>
+					<tr>
+						<th>
+							Item #
+						</th>
+						<th>
+							Title
+						</th>
+						<th>
+							Cost
+						</th>
+						<th>
+							QTY
+						</th>
+						<th>
+							Discount
+						</th>
+						<th>
+							Comment
+						</th>
+					</tr>	
+				</thead>
+				<tbody>
+					<tr th:each="o : ${orderLines}">
+						<td th:text="${o.olId}"></td>
+						<td th:text="${o.item.ITitle}"></td>
+						<td th:text="${o.item.ICost}"></td>
+						<td th:text="${o.olQty}"></td>
+						<td th:text="${o.olDiscount}"></td>
+						<td th:text="${o.olComment}"></td>
+					</tr>
+				</tbody>
+			</table> 
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-inquiry.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-inquiry.html
new file mode 100644
index 0000000..92c91cf
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/order-inquiry.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order inquiry</title>
+  </head>
+<body>
+<div layout:fragment="content">	
+	<div>
+		<form th:action="@{/order-display}" method="get" >
+			<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<div th:if="${shoppingId}" >
+				<input type="hidden" name="SHOPPING_ID" th:value="${shoppingId}" />
+			</div>
+			<div th:if="${customerId}">
+				<input type="hidden" name="C_ID" th:value="${customerId}" />
+			</div>
+			<input class="btn" type="submit" value="Display last order" />
+		</fieldset>
+		</form>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/product_detail.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/product_detail.html
new file mode 100644
index 0000000..cb491a1
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/product_detail.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Product detail page</title>
+  </head>
+<body>
+<div layout:fragment="content">
+
+		<div class="row-fluid marketing">
+			<dl class="dl-horizontal">
+				<dt>Title</dt>
+				<dd th:text="${item.ITitle}">Title</dd>
+
+				<dt>Author</dt>
+				<dd th:text="${item.author.AFname + ' ' + item.author.ALname}">FirstName LastName</dd>
+
+				<dt>Subject</dt>
+				<dd th:text="${item.ISubject}">Subject</dd>
+				
+				<dt>Description</dt>
+				<dd th:text="${item.IDesc}">Description</dd>
+			    
+			    <dt>Suggested Retail Price</dt>
+			    <dd th:text="${item.ISrp}">Suggested Retail Price</dd>
+			    
+			    <dt>Our Price</dt>
+			    <dd th:text="${item.ICost}">Our Price</dd>
+			    
+			    <dt>You save</dt>
+			    <dd th:with="savings=(${item.ISrp} - ${item.ICost})" 
+			         th:text="${savings}">You save</dd>
+			    
+			    <dt>Backing</dt>
+			    <dd><span th:text="${item.IBacking}">Item Backing</span><span th:text="${item.IPage}">Item page</span></dd>
+			    
+			    <dt>Published by</dt>
+			    <dd th:text="${item.IPublisher}">Publisher</dd>
+			    
+			    <dt>Publication date</dt>
+			    <dd th:text="${item.IPubDate}">Pub date</dd>
+			    
+			    <dt>Avail date</dt>
+			    <dd th:text="${item.IAvail}">Avail date</dd>
+			    
+			    <dt>Dimensions</dt>
+			    <dd th:text="${item.IDimension}">Dimensions</dd>
+			    
+			    <dt>ISBN</dt>
+			    <dd th:text="${item.IIsbn}">ISBN</dd>
+			</dl>
+		</div>
+		<div>
+			<a class="btn" th:href="@{${addToShoppingCartUrl}}">Add to cart</a>
+			&nbsp;<a class="btn" href="#">Update</a>
+			
+		</div>
+	</div>
+</body>
+</html>
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/search.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/search.html
new file mode 100644
index 0000000..b412687
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/search.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Search</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<form method="get">
+	Search by: 
+	<select name="searchField">
+		<option value="author">
+			Author
+		</option>
+		<option value="title">
+			Title
+		</option>
+		<option value="subject">
+			Subject
+		</option>
+	</select>
+	<input type="text" name="keyword" th:value="${keyword}"/>
+	<input type="submit" value="Submit"/>
+	</form>
+	<div th:if="${results != null and not results.isEmpty()}" class="search-results">
+		<table>
+			<thead>
+				<tr>
+					<th style="width: 50px; font-weight: bold;">
+						#
+					</th>
+					<th>
+						Author
+					</th>
+					<th>
+						Title
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="item, count : ${results}">
+					<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+					<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+					</td>
+					<td>
+						<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+	<div th:unless="${ results != null and not results.isEmpty()}">
+		No results!
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/shopping-cart.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/shopping-cart.html
new file mode 100644
index 0000000..751cae9
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/shopping-cart.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Shopping cart</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${errors.isEmpty()}">
+		<div class="jumbotron">
+			<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+		</div>
+		<div class="promotional">
+			<div class="pull-left" th:each="item : ${promotional}">
+				<a th:href="@{'/product-detail?I_ID=' + ${item.IId}}">
+					<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+				</a>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		
+		<hr />
+		<div th:if="${cart.shoppingCartLines != null}">
+			<form action="" method="get">
+				<table class="table">
+					<thead>
+						<tr>
+							<th>
+								QTY
+							</th>
+							<th>
+								Product
+							</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr th:each="line, i : ${cart.shoppingCartLines}">
+							<td>
+								<input type="hidden" th:name="'I_ID_' + ${i.index}" th:value="${line.item.IId}" />
+								<input th:name="'QTY_' + ${i.index}" size="3" th:value="${line.sclQty}" />
+							</td>
+							<td>
+								Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+								<span th:text="${line.item.IBacking}"></span><br />
+								SRP. $<span th:text="${line.item.ISrp}"></span>
+								<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<strong>Subtotal: <span th:text="${subTotal}"></span></strong>
+				<div style="text-align: center">
+					<a class="btn" th:href="@{${checkoutUrl}}">Checkout</a>
+					<a class="btn" th:href="@{${homeUrl}}">Home</a>
+				</div>
+				<p style="text-align:center">
+					If you have changed the quantities and/or taken anything out<br />
+					of your shopping cart, click here to refresh your shopping cart:
+				</p>
+				<input type="hidden" name="ADD_FLAG" value="N" />
+				<input type="hidden" name="SHOPPING_ID" th:value="${cart.scId}" />
+				<input th:if="${customerId}" type="hidden" name="C_ID" th:value="${customerId}"/>
+				<input type="submit" value="Update" class="btn" />
+			</form>
+		</div>
+		<div th:unless="${cart.shoppingCartLines != null}">
+			Empty cart!
+		</div>
+		
+	</div>
+	<div th:unless="${errors.isEmpty()}">
+		<div class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="error"></div>
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/templates/layout.html b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/templates/layout.html
new file mode 100644
index 0000000..6f0319e
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/views/templates/layout.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>TPC-W</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap.min.css' }"/>
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap-responsive.min.css'}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+        
+        .footer{
+        	padding: 6px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a th:href="@{${searchUrl}}">Search</a></li>
+		  <li><a th:href="@{${shoppingCartUrl}}">Shopping cart</a></li>
+		  <li><a th:href="@{${orderInquiryUrl}}">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{${imgResourceUrl} + '/logo-CloudScale-aws.png'}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div layout:fragment="content"></div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/web.xml b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..60ac94c
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+  <context-param>
+    <param-name>contextConfigLocation</param-name>
+    <param-value>classpath:app-context.xml</param-value>
+  </context-param>
+  <listener>
+    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+  </listener>
+  <servlet>
+    <servlet-name>appServlet</servlet-name>
+    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+    <init-param>
+      <param-name>contextConfigLocation</param-name>
+      <param-value></param-value>
+    </init-param>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>appServlet</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/deployment-scripts/scripts/software/showcase/src/test/resources/log4j.xml b/deployment-scripts/scripts/software/showcase/src/test/resources/log4j.xml
new file mode 100644
index 0000000..b424beb
--- /dev/null
+++ b/deployment-scripts/scripts/software/showcase/src/test/resources/log4j.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appenders -->
+	<appender name="console" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
+		</layout>
+	</appender>
+	
+	<!-- Application Loggers -->
+	<logger name="eu.cloudscale.showcase">
+		<level value="info" />
+	</logger>
+	
+	<!-- 3rdparty Loggers -->
+	<logger name="org.springframework.core">
+		<level value="info" />
+	</logger>	
+	
+	<logger name="org.springframework.beans">
+		<level value="info" />
+	</logger>
+	
+	<logger name="org.springframework.context">
+		<level value="info" />
+	</logger>
+
+	<logger name="org.springframework.web">
+		<level value="info" />
+	</logger>
+
+	<!-- Root Logger -->
+	<root>
+		<priority value="info" />
+		<appender-ref ref="console" />
+	</root>
+	
+</log4j:configuration>
diff --git a/deployment-scripts/scripts/software/start-mysql-galera-first-node.sh b/deployment-scripts/scripts/software/start-mysql-galera-first-node.sh
new file mode 100644
index 0000000..98858ae
--- /dev/null
+++ b/deployment-scripts/scripts/software/start-mysql-galera-first-node.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+echo "NOTE: starting mysql service"
+service mysql start --wsrep-new-cluster --wsrep_cluster_address="gcomm://"
+
+# wait for mysql to start
+RETRIES=100
+COUNTER=0
+false
+while [ $? -ne 0 ]
+do
+    let COUNTER=COUNTER+1
+    if [ $COUNTER -gt $RETRIES ]
+    then
+        echo "ERROR: Could not connect to mysql server in $RETRIES tries!"
+        exit 1
+    fi
+    sleep 3
+    echo "NOTE: $COUNTER. try to connect to mysql server."
+    mysqladmin ping --host=127.0.0.1 > /dev/null 2>&1
+done
+echo "NOTE: Connected to mysql server"
+
+
+echo "NOTE: finished"
diff --git a/deployment-scripts/scripts/software/start-mysql-galera-other-nodes.sh b/deployment-scripts/scripts/software/start-mysql-galera-other-nodes.sh
new file mode 100644
index 0000000..3f0ba00
--- /dev/null
+++ b/deployment-scripts/scripts/software/start-mysql-galera-other-nodes.sh
@@ -0,0 +1,50 @@
+
+echo "NOTE: wait for first node to start"
+RETRIES=400
+COUNTER=0
+false
+while [ $? -ne 0 ]
+do
+    let COUNTER=COUNTER+1
+    if [ $COUNTER -gt $RETRIES ]
+    then
+        echo "ERROR: Could not connect to first node in $RETRIES tries!"
+        exit 1
+    fi
+    sleep 3
+    echo "NOTE: $COUNTER. try to connect to first node."
+    mysqladmin ping --host=$FIRST_NODE_IP > /dev/null 2>&1
+done
+echo "NOTE: Connected to first node"
+
+
+
+echo "NOTE: starting mysql service"
+service mysql start --wsrep_cluster_address="gcomm://$FIRST_NODE_IP"
+
+echo "NOTE: wait for mysql to start"
+RETRIES=400
+COUNTER=0
+false
+
+while [ $? -ne 0 ]
+do
+    let COUNTER=COUNTER+1
+    if [ $COUNTER -gt $RETRIES ]
+    then
+        echo "ERROR: Could not connect to mysql server in $RETRIES tries!"
+        exit 1
+    fi
+    sleep 3
+    if [ $(( $COUNTER % 40 )) -eq 0 ]
+    then
+        echo "NOTE: starting mysql service again"
+        service mysql start --wsrep_cluster_address="gcomm://$FIRST_NODE_IP"
+    fi
+    echo "NOTE: $COUNTER. try to connect to mysql server."
+    mysqladmin ping --host=127.0.0.1 > /dev/null 2>&1
+done
+echo "NOTE: Connected to mysql server"
+
+
+echo "NOTE: finished"
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap.css b/deployment-scripts/static/css/bootstrap/bootstrap.css
new file mode 100644
index 0000000..2a967cc
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap.css
@@ -0,0 +1,6203 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
+html {
+  font-family: sans-serif;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  margin: .67em 0;
+  font-size: 2em;
+}
+mark {
+  color: #000;
+  background: #ff0;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -.5em;
+}
+sub {
+  bottom: -.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  height: 0;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  margin: 0;
+  font: inherit;
+  color: inherit;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  padding: .35em .625em .75em;
+  margin: 0 2px;
+  border: 1px solid #c0c0c0;
+}
+legend {
+  padding: 0;
+  border: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+td,
+th {
+  padding: 0;
+}
+@media print {
+  * {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  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;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  select {
+    background: #fff !important;
+  }
+  .navbar {
+    display: none;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+
+  src: url('../../fonts/glyphicons-halflings-regular.eot');
+  src: url('../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\2a";
+}
+.glyphicon-plus:before {
+  content: "\2b";
+}
+.glyphicon-euro:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+* {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333;
+  background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #428bca;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #2a6496;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  display: inline-block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+  padding: 4px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all .2s ease-in-out;
+       -o-transition: all .2s ease-in-out;
+          transition: all .2s ease-in-out;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 30px;
+}
+h3,
+.h3 {
+  font-size: 24px;
+}
+h4,
+.h4 {
+  font-size: 18px;
+}
+h5,
+.h5 {
+  font-size: 14px;
+}
+h6,
+.h6 {
+  font-size: 12px;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+@media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
+}
+small,
+.small {
+  font-size: 85%;
+}
+cite {
+  font-style: normal;
+}
+mark,
+.mark {
+  padding: .2em;
+  background-color: #fcf8e3;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #777;
+}
+.text-primary {
+  color: #428bca;
+}
+a.text-primary:hover {
+  color: #3071a9;
+}
+.text-success {
+  color: #3c763d;
+}
+a.text-success:hover {
+  color: #2b542c;
+}
+.text-info {
+  color: #31708f;
+}
+a.text-info:hover {
+  color: #245269;
+}
+.text-warning {
+  color: #8a6d3b;
+}
+a.text-warning:hover {
+  color: #66512c;
+}
+.text-danger {
+  color: #a94442;
+}
+a.text-danger:hover {
+  color: #843534;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #428bca;
+}
+a.bg-primary:hover {
+  background-color: #3071a9;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #d9edf7;
+}
+a.bg-info:hover {
+  background-color: #afd9ee;
+}
+.bg-warning {
+  background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+  background-color: #f7ecb5;
+}
+.bg-danger {
+  background-color: #f2dede;
+}
+a.bg-danger:hover {
+  background-color: #e4b9b9;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  margin-left: -5px;
+  list-style: none;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 1.42857143;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    overflow: hidden;
+    clear: left;
+    text-align: right;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #fff;
+  background-color: #333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.42857143;
+  color: #333;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0;
+  }
+}
+table {
+  background-color: transparent;
+}
+th {
+  text-align: left;
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover > td,
+.table-hover > tbody > tr:hover > th {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  display: table-column;
+  float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  display: table-cell;
+  float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-x: auto;
+    overflow-y: hidden;
+    -webkit-overflow-scrolling: touch;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #ddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+  color: #777;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #777;
+}
+.form-control::-webkit-input-placeholder {
+  color: #777;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+  background-color: #eee;
+  opacity: 1;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  line-height: 34px;
+  line-height: 1.42857143 \0;
+}
+input[type="date"].input-sm,
+input[type="time"].input-sm,
+input[type="datetime-local"].input-sm,
+input[type="month"].input-sm {
+  line-height: 30px;
+}
+input[type="date"].input-lg,
+input[type="time"].input-lg,
+input[type="datetime-local"].input-lg,
+input[type="month"].input-lg {
+  line-height: 46px;
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  min-height: 20px;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  vertical-align: middle;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-sm,
+.form-horizontal .form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.input-lg,
+.form-horizontal .form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 25px;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+}
+.input-lg + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+  color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #a94442;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
+}
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  top: 0;
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 14.3px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+  }
+}
+.btn {
+  display: inline-block;
+  padding: 6px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  pointer-events: none;
+  cursor: not-allowed;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+          box-shadow: none;
+  opacity: .65;
+}
+.btn-default {
+  color: #333;
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default .badge {
+  color: #fff;
+  background-color: #333;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #428bca;
+  border-color: #357ebd;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #3071a9;
+  border-color: #285e8e;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #428bca;
+  border-color: #357ebd;
+}
+.btn-primary .badge {
+  color: #428bca;
+  background-color: #fff;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #fff;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #fff;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #fff;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #fff;
+}
+.btn-link {
+  font-weight: normal;
+  color: #428bca;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #2a6496;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity .15s linear;
+       -o-transition: opacity .15s linear;
+          transition: opacity .15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height .35s ease;
+       -o-transition: height .35s ease;
+          transition: height .35s ease;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px solid;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  font-size: 14px;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  color: #262626;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #fff;
+  text-decoration: none;
+  background-color: #428bca;
+  outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #777;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px solid;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    right: auto;
+    left: 0;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: 0;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  display: table-cell;
+  float: none;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  position: absolute;
+  z-index: -1;
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555;
+  text-align: center;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  margin-left: -1px;
+}
+.nav {
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.nav > li.disabled > a {
+  color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777;
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eee;
+  border-color: #428bca;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555;
+  cursor: default;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #428bca;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+  overflow-x: visible;
+  -webkit-overflow-scrolling: touch;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  -webkit-transform: translate3d(0, 0, 0);
+       -o-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  height: 50px;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-right: 15px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+  .navbar-nav.navbar-right:last-child {
+    margin-right: -15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+  }
+}
+.navbar-form {
+  padding: 10px 15px;
+  margin-top: 8px;
+  margin-right: -15px;
+  margin-bottom: 8px;
+  margin-left: -15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+@media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-form.navbar-right:last-child {
+    margin-right: -15px;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-right: 15px;
+    margin-left: 15px;
+  }
+  .navbar-text.navbar-right:last-child {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #f8f8f8;
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+  color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #777;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #333;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #555;
+    background-color: #e7e7e7;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #777;
+}
+.navbar-default .navbar-link:hover {
+  color: #333;
+}
+.navbar-default .btn-link {
+  color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
+}
+.navbar-inverse {
+  background-color: #222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #777;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #777;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #777;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #fff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #777;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #fff;
+}
+.navbar-inverse .btn-link {
+  color: #777;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/\00a0";
+}
+.breadcrumb > .active {
+  color: #777;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 20px 0;
+  border-radius: 4px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 12px;
+  margin-left: -1px;
+  line-height: 1.42857143;
+  color: #428bca;
+  text-decoration: none;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  color: #2a6496;
+  background-color: #eee;
+  border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 2;
+  color: #fff;
+  cursor: default;
+  background-color: #428bca;
+  border-color: #428bca;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+.label-primary {
+  background-color: #428bca;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #3071a9;
+}
+.label-success {
+  background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
+}
+.label-info {
+  background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
+}
+.label-warning {
+  background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
+}
+.label-danger {
+  background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+a.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #428bca;
+  background-color: #fff;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container .jumbotron {
+  border-radius: 6px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container .jumbotron {
+    padding-right: 60px;
+    padding-left: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all .2s ease-in-out;
+       -o-transition: all .2s ease-in-out;
+          transition: all .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-right: auto;
+  margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #428bca;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #2b542c;
+}
+.alert-info {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info hr {
+  border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+  color: #245269;
+}
+.alert-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.alert-warning hr {
+  border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+  color: #66512c;
+}
+.alert-danger {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.alert-danger hr {
+  border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+  color: #843534;
+}
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #fff;
+  text-align: center;
+  background-color: #428bca;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+  -webkit-transition: width .6s ease;
+       -o-transition: width .6s ease;
+          transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar[aria-valuenow="1"],
+.progress-bar[aria-valuenow="2"] {
+  min-width: 30px;
+}
+.progress-bar[aria-valuenow="0"] {
+  min-width: 30px;
+  color: #777;
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media,
+.media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+.media,
+.media .media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media-object {
+  display: block;
+}
+.media-heading {
+  margin: 0 0 5px;
+}
+.media > .pull-left {
+  margin-right: 10px;
+}
+.media > .pull-right {
+  margin-left: 10px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+a.list-group-item {
+  color: #555;
+}
+a.list-group-item .list-group-item-heading {
+  color: #333;
+}
+a.list-group-item:hover,
+a.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  color: #777;
+  background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #428bca;
+  border-color: #428bca;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #e1edf7;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+a.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+a.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive {
+  border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body {
+  border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #ddd;
+}
+.panel-default {
+  border-color: #ddd;
+}
+.panel-default > .panel-heading {
+  color: #333;
+  background-color: #f5f5f5;
+  border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ddd;
+}
+.panel-primary {
+  border-color: #428bca;
+}
+.panel-primary > .panel-heading {
+  color: #fff;
+  background-color: #428bca;
+  border-color: #428bca;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #428bca;
+}
+.panel-primary > .panel-heading .badge {
+  color: #428bca;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #428bca;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
+}
+.panel-warning {
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
+}
+.panel-danger {
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+.embed-responsive.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+.close:hover,
+.close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+button.close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transition: -webkit-transform .3s ease-out;
+       -o-transition:      -o-transform .3s ease-out;
+          transition:         transform .3s ease-out;
+  -webkit-transform: translate3d(0, -25%, 0);
+       -o-transform: translate3d(0, -25%, 0);
+          transform: translate3d(0, -25%, 0);
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate3d(0, 0, 0);
+       -o-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  outline: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
+}
+.modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.modal-header {
+  min-height: 16.42857143px;
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-size: 12px;
+  line-height: 1.4;
+  visibility: visible;
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  text-align: left;
+  white-space: normal;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+.popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: #fff;
+  border-bottom-width: 0;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+.popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: #fff;
+  border-left-width: 0;
+}
+.popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: #fff;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: .6s ease-in-out left;
+       -o-transition: .6s ease-in-out left;
+          transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 15%;
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control.right {
+  right: 0;
+  left: auto;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #fff;
+  text-decoration: none;
+  filter: alpha(opacity=90);
+  outline: 0;
+  opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  margin-top: -10px;
+  font-family: serif;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+  border: 1px solid #fff;
+  border-radius: 10px;
+}
+.carousel-indicators .active {
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  background-color: #fff;
+}
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -15px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -15px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -15px;
+  }
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+  visibility: hidden !important;
+}
+.affix {
+  position: fixed;
+  -webkit-transform: translate3d(0, 0, 0);
+       -o-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap.css.map b/deployment-scripts/static/css/bootstrap/bootstrap.css.map
new file mode 100644
index 0000000..bfb5616
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EA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A;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3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AAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA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","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n  * {\n    text-shadow: none !important;\n    color: #000 !important; // Black prints faster: h5bp.com/s\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n\n  // Don't show links for images, or javascript/internal links\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n\n  thead {\n    display: table-header-group; // h5bp.com/t\n  }\n\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n\n  img {\n    max-width: 100% !important;\n  }\n\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n\n  // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n  // Once fixed, we can just straight up remove this.\n  select {\n    background: #fff !important;\n  }\n\n  // Bootstrap components\n  .navbar {\n    display: none;\n  }\n  .table {\n    td,\n    th {\n      background-color: #fff !important;\n    }\n  }\n  .btn,\n  .dropup > .btn {\n    > .caret {\n      border-top-color: #000 !important;\n    }\n  }\n  .label {\n    border: 1px solid #000;\n  }\n\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered {\n    th,\n    td {\n      border: 1px solid #ddd !important;\n    }\n  }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  &::-moz-placeholder           { color: @color;   // Firefox\n                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  width: 100% \\9; // Force IE10 and below to size SVG images correctly\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n  font-style: normal;\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: auto;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: @input-height-base;\n  // IE8+ misaligns the text within date inputs, so we reset\n  line-height: @line-height-base ~\"\\0\";\n\n  &.input-sm {\n    line-height: @input-height-small;\n  }\n  &.input-lg {\n    line-height: @input-height-large;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: not-allowed;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: (@line-height-computed + 5); // Height of the `label` and its margin\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Reposition feedback icon if label is hidden with \"screenreader only\" state\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n    .form-control {\n      &:extend(.input-lg);\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n    .form-control {\n      &:extend(.input-sm);\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: 0;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `opacity`. We cannot\n// use `display: none;` or `visibility: hidden;` as that also hides the popover.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 for more.\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  position: absolute;\n  z-index: -1;\n  .opacity(0);\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n  .translate3d(0, 0, 0);\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n  .translate3d(0, 0, 0);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n  \n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  a.list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n// Account for lower percentages\n.progress-bar {\n  &[aria-valuenow=\"1\"],\n  &[aria-valuenow=\"2\"] {\n    min-width: 30px;\n  }\n\n  &[aria-valuenow=\"0\"] {\n    color: @gray-light;\n    min-width: 30px;\n    background-color: transparent;\n    background-image: none;\n    box-shadow: none;\n  }\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n\n  // Align badges within list items\n  > .badge {\n    float: right;\n  }\n  > .badge + .badge {\n    margin-right: 5px;\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n    + .panel-collapse > .panel-body {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n\n  // Modifier class for 16:9 aspect ratio\n  &.embed-responsive-16by9 {\n    padding-bottom: 56.25%;\n  }\n\n  // Modifier class for 4:3 aspect ratio\n  &.embed-responsive-4by3 {\n    padding-bottom: 75%;\n  }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate3d(0, -25%, 0);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate3d(0, 0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  font-size: @font-size-small;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  text-align: left; // Reset given new insertion method\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap.min.css b/deployment-scripts/static/css/bootstrap/bootstrap.min.css
new file mode 100644
index 0000000..85b72a9
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}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}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../../fonts/glyphicons-halflings-regular.eot);src:url(../../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap-theme.css b/deployment-scripts/static/css/bootstrap/bootstrap-theme.css
new file mode 100644
index 0000000..f860bbc
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap-theme.css
@@ -0,0 +1,442 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default:disabled,
+.btn-default[disabled] {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image:      -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
+  background-image:         linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #2d6ca2;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #2d6ca2;
+  border-color: #2b669a;
+}
+.btn-primary:disabled,
+.btn-primary[disabled] {
+  background-color: #2d6ca2;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success:disabled,
+.btn-success[disabled] {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info:disabled,
+.btn-info[disabled] {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning:disabled,
+.btn-warning[disabled] {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger:disabled,
+.btn-danger[disabled] {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #357ebd;
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image:      -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
+  background-image:         linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+}
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
+  background-image:      -o-linear-gradient(top, #222 0%, #282828 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
+  background-image:         linear-gradient(to bottom, #222 0%, #282828 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image:      -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
+  background-image:         linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #3071a9;
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image:      -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
+  background-image:         linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #3278b3;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image:      -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
+  background-image:         linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap-theme.css.map b/deployment-scripts/static/css/bootstrap/bootstrap-theme.css.map
new file mode 100644
index 0000000..4cc41ab
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  &::-moz-placeholder           { color: @color;   // Firefox\n                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
\ No newline at end of file
diff --git a/deployment-scripts/static/css/bootstrap/bootstrap-theme.min.css b/deployment-scripts/static/css/bootstrap/bootstrap-theme.min.css
new file mode 100644
index 0000000..2e97597
--- /dev/null
+++ b/deployment-scripts/static/css/bootstrap/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/deployment-scripts/static/css/main.css b/deployment-scripts/static/css/main.css
new file mode 100644
index 0000000..28e3ab0
--- /dev/null
+++ b/deployment-scripts/static/css/main.css
@@ -0,0 +1,175 @@
+/* style.css */
+/* BASIC STYLINGS
+============================================================================= */
+body {
+    padding-top: 20px;
+}
+
+.provider {
+    background-color: #f5f5f5;
+    border: 1px solid #ccc;
+    border-radius: 4px;
+    padding: 10px;
+    margin-bottom: 10px;
+}
+
+.provider:hover {
+    background-color: #e3e3e3;
+    border-color: #cccccc;
+    border-size: 1px;
+    padding: 10px;
+}
+
+.dropzone{
+    margin: auto;
+    background-color: #efefef;
+    border: 2px dotted #cccccc;
+    /*width: 300px;*/
+    height: 200px;
+    text-align: center;
+}
+
+.dz-error-mark{
+    display: none;
+}
+.dz-success-mark{
+    display:none;
+}
+/* form styling */
+#form-container {
+    /*background: #2f2f2f;*/
+    margin-bottom: 20px;
+    border-radius: 5px;
+    /*text-align: center;*/
+}
+
+#form-container .page-header {
+    /*background: #151515;*/
+    margin: 0;
+    /*padding: 30px;*/
+    border-top-left-radius: 5px;
+    border-top-right-radius: 5px;
+}
+
+/* numbered buttons */
+
+#status-buttons a {
+    /*color: #FFF;*/
+    display: inline-block;
+    font-size: 18px;
+    margin-right: 10px;
+    text-align: center;
+    text-transform: uppercase;
+}
+
+#status-buttons a:hover {
+    text-decoration: none;
+}
+
+/* we will style the span as the circled number */
+#status-buttons span {
+    /*background: #080808;*/
+    display: block;
+    height: 40px;
+    margin: 0 auto 10px;
+    padding-top: 9px;
+    width: 40px;
+    border-radius: 50%;
+    /*border: 1px solid #28a4c9;*/
+}
+
+/* active buttons turn light green-blue*/
+#status-buttons a.active span {
+    background: #28a4c9;
+    color: white;
+    font-weight: bold;
+}
+
+/* style.css */
+/* ANIMATION STYLINGS
+============================================================================= */
+#signup-form {
+    position: relative;
+    min-height: 300px;
+    overflow: hidden;
+    /*padding: 30px;*/
+}
+
+#form-views {
+    width: auto;
+}
+
+/* basic styling for entering and leaving */
+/* left and right added to ensure full width */
+#form-views.ng-enter,
+#form-views.ng-leave {
+    position: absolute;
+    left: 30px;
+    right: 30px;
+    transition: 0.5s all ease;
+    -moz-transition: 0.5s all ease;
+    -webkit-transition: 0.5s all ease;
+}
+
+/* enter animation */
+#form-views.ng-enter {
+    -webkit-animation: slideInRight 0.5s both ease;
+    -moz-animation: slideInRight 0.5s both ease;
+    animation: slideInRight 0.5s both ease;
+}
+
+/* leave animation */
+#form-views.ng-leave {
+    -webkit-animation: slideOutLeft 0.5s both ease;
+    -moz-animation: slideOutLeft 0.5s both ease;
+    animation: slideOutLeft 0.5s both ease;
+}
+
+/* ANIMATIONS
+============================================================================= */
+/* slide out to the left */
+@keyframes slideOutLeft {
+    to {
+        transform: translateX(-200%);
+    }
+}
+
+@-moz-keyframes slideOutLeft {
+    to {
+        -moz-transform: translateX(-200%);
+    }
+}
+
+@-webkit-keyframes slideOutLeft {
+    to {
+        -webkit-transform: translateX(-200%);
+    }
+}
+
+/* slide in from the right */
+@keyframes slideInRight {
+    from {
+        transform: translateX(200%);
+    }
+    to {
+        transform: translateX(0);
+    }
+}
+
+@-moz-keyframes slideInRight {
+    from {
+        -moz-transform: translateX(200%);
+    }
+    to {
+        -moz-transform: translateX(0);
+    }
+}
+
+@-webkit-keyframes slideInRight {
+    from {
+        -webkit-transform: translateX(200%);
+    }
+    to {
+        -webkit-transform: translateX(0);
+    }
+}
diff --git a/deployment-scripts/static/fonts/glyphicons-halflings-regular.eot b/deployment-scripts/static/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/static/fonts/glyphicons-halflings-regular.eot
diff --git a/deployment-scripts/static/fonts/glyphicons-halflings-regular.svg b/deployment-scripts/static/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..e3e2dc7
--- /dev/null
+++ b/deployment-scripts/static/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
+<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
+<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/deployment-scripts/static/fonts/glyphicons-halflings-regular.ttf b/deployment-scripts/static/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/static/fonts/glyphicons-halflings-regular.ttf
diff --git a/deployment-scripts/static/fonts/glyphicons-halflings-regular.woff b/deployment-scripts/static/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/deployment-scripts/static/fonts/glyphicons-halflings-regular.woff
diff --git a/deployment-scripts/static/images/amazon-web-services.jpg b/deployment-scripts/static/images/amazon-web-services.jpg
new file mode 100644
index 0000000..2cbb7b9
Binary files /dev/null and b/deployment-scripts/static/images/amazon-web-services.jpg differ
diff --git a/deployment-scripts/static/images/mongodb.png b/deployment-scripts/static/images/mongodb.png
new file mode 100644
index 0000000..2e0ac0d
Binary files /dev/null and b/deployment-scripts/static/images/mongodb.png differ
diff --git a/deployment-scripts/static/images/mysql.png b/deployment-scripts/static/images/mysql.png
new file mode 100644
index 0000000..500d5d0
Binary files /dev/null and b/deployment-scripts/static/images/mysql.png differ
diff --git a/deployment-scripts/static/images/openstack-logo512.jpg b/deployment-scripts/static/images/openstack-logo512.jpg
new file mode 100644
index 0000000..73c5725
Binary files /dev/null and b/deployment-scripts/static/images/openstack-logo512.jpg differ
diff --git a/deployment-scripts/static/js/angular/angular.min.js b/deployment-scripts/static/js/angular/angular.min.js
new file mode 100644
index 0000000..472a3fc
--- /dev/null
+++ b/deployment-scripts/static/js/angular/angular.min.js
@@ -0,0 +1,223 @@
+/*
+ AngularJS v1.3.0-beta.14
+ (c) 2010-2014 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(M,U,r){'use strict';function G(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.0-beta.14/"+(b?b+"/":"")+a;for(c=1;c<arguments.length;c++)a=a+(1==c?"?":"&")+"p"+(c-1)+"="+encodeURIComponent("function"==typeof arguments[c]?arguments[c].toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof arguments[c]?"undefined":"string"!=typeof arguments[c]?JSON.stringify(arguments[c]):arguments[c]);return Error(a)}}function db(b){if(null==b||Oa(b))return!1;
+var a=b.length;return 1===b.nodeType&&a?!0:v(b)||L(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function q(b,a,c){var d,e;if(b)if(P(b))for(d in b)"prototype"==d||("length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d))||a.call(c,b[d],d);else if(L(b)||db(b))for(d=0,e=b.length;d<e;d++)a.call(c,b[d],d);else if(b.forEach&&b.forEach!==q)b.forEach(a,c);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d);return b}function Wb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}
+function id(b,a,c){for(var d=Wb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function Xb(b){return function(a,c){b(c,a)}}function jd(){return++eb}function Yb(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function z(b){var a=b.$$hashKey;q(arguments,function(a){a!==b&&q(a,function(a,c){b[c]=a})});Yb(b,a);return b}function Y(b){return parseInt(b,10)}function Zb(b,a){return z(new (z(function(){},{prototype:b})),a)}function A(){}function Ea(b){return b}function da(b){return function(){return b}}function w(b){return"undefined"===
+typeof b}function E(b){return"undefined"!==typeof b}function S(b){return null!=b&&"object"===typeof b}function v(b){return"string"===typeof b}function Fa(b){return"number"===typeof b}function ra(b){return"[object Date]"===ya.call(b)}function P(b){return"function"===typeof b}function fb(b){return"[object RegExp]"===ya.call(b)}function Oa(b){return b&&b.window===b}function kd(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function ld(b){var a={};b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=
+!0;return a}function md(b,a,c){var d=[];q(b,function(b,f,g){d.push(a.call(c,b,f,g))});return d}function Pa(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Ga(b,a){var c=Pa(b,a);0<=c&&b.splice(c,1);return a}function za(b,a,c,d){if(Oa(b)||b&&b.$evalAsync&&b.$watch)throw Qa("cpws");if(a){if(b===a)throw Qa("cpi");c=c||[];d=d||[];if(S(b)){var e=Pa(c,b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(L(b))for(var f=a.length=0;f<b.length;f++)e=za(b[f],
+null,c,d),S(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;q(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=za(b[f],null,c,d),S(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);Yb(a,g)}}else if(a=b)L(b)?a=za(b,[],c,d):ra(b)?a=new Date(b.getTime()):fb(b)?a=RegExp(b.source):S(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=za(b,e,c,d));return a}function ka(b,a){var c=0;if(L(b))for(a=a||[];c<b.length;c++)a[c]=b[c];else if(S(b)){a=a||{};for(var d=Object.keys(b),e=d.length;c<
+e;c++){var f=d[c];if("$"!==f.charAt(0)||"$"!==f.charAt(1))a[f]=b[f]}}return a||b}function Aa(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(L(b)){if(!L(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!Aa(b[d],a[d]))return!1;return!0}}else{if(ra(b))return ra(a)&&b.getTime()==a.getTime();if(fb(b)&&fb(a))return b.toString()==a.toString();if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||Oa(b)||Oa(a)||L(a))return!1;
+c={};for(d in b)if("$"!==d.charAt(0)&&!P(b[d])){if(!Aa(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==r&&!P(a[d]))return!1;return!0}return!1}function $b(){return U.securityPolicy&&U.securityPolicy.isActive||U.querySelector&&!(!U.querySelector("[ng-csp]")&&!U.querySelector("[data-ng-csp]"))}function Ab(b,a){var c=2<arguments.length?la.call(arguments,2):[];return!P(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(la.call(arguments,
+0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}}function nd(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)?c=r:Oa(a)?c="$WINDOW":a&&U===a?c="$DOCUMENT":a&&(a.$evalAsync&&a.$watch)&&(c="$SCOPE");return c}function sa(b,a){return"undefined"===typeof b?r:JSON.stringify(b,nd,a?"  ":null)}function ac(b){return v(b)?JSON.parse(b):b}function ha(b){b=D(b).clone();try{b.empty()}catch(a){}var c=D("<div>").append(b).html();try{return 3===b[0].nodeType?
+K(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+K(b)})}catch(d){return K(c)}}function bc(b){try{return decodeURIComponent(b)}catch(a){}}function cc(b){var a={},c,d;q((b||"").split("&"),function(b){b&&(c=b.split("="),d=bc(c[0]),E(d)&&(b=E(c[1])?bc(c[1]):!0,a[d]?L(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Bb(b){var a=[];q(b,function(b,d){L(b)?q(b,function(b){a.push(Ba(d,!0)+(!0===b?"":"="+Ba(b,!0)))}):a.push(Ba(d,!0)+(!0===b?"":"="+Ba(b,!0)))});return a.length?
+a.join("&"):""}function gb(b){return Ba(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ba(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function od(b,a){var c,d,e=dc.length;b=D(b);for(d=0;d<e;++d)if(c=dc[d]+a,v(c=b.attr(c)))return c;return null}function pd(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g={},h=["ng:app","ng-app","x-ng-app","data-ng-app"],n=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
+q(h,function(a){h[a]=!0;c(U.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(q(b.querySelectorAll("."+a),c),q(b.querySelectorAll("."+a+"\\:"),c),q(b.querySelectorAll("["+a+"]"),c))});q(d,function(a){if(!e){var b=n.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):q(a.attributes,function(b){!e&&h[b.name]&&(e=a,f=b.value)})}});e&&(g.strictDi=null!==od(e,"strict-di"),a(e,f?[f]:[],g))}function ec(b,a,c){S(c)||(c={});c=z({strictDi:!1},c);var d=function(){b=D(b);if(b.injector()){var d=
+b[0]===U?"document":ha(b);throw Qa("btstrpd",d);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");d=Cb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=/^NG_DEFER_BOOTSTRAP!/;if(M&&!e.test(M.name))return d();M.name=M.name.replace(e,"");Ra.resumeBootstrap=function(b){q(b,function(b){a.push(b)});d()}}function hb(b,a){a=a||"_";return b.replace(qd,function(b,
+d){return(d?a:"")+b.toLowerCase()})}function rd(){var b;(ta=M.jQuery)&&ta.fn.on?(D=ta,z(ta.fn,{scope:Ha.scope,isolateScope:Ha.isolateScope,controller:Ha.controller,injector:Ha.injector,inheritedData:Ha.inheritedData}),b=ta.cleanData,b=b.$$original||b,ta.cleanData=function(a){for(var c=0,d;null!=(d=a[c]);c++)ta(d).triggerHandler("$destroy");b(a)},ta.cleanData.$$original=b):D=Q;Ra.element=D}function Db(b,a,c){if(!b)throw Qa("areq",a||"?",c||"required");return b}function Sa(b,a,c){c&&L(b)&&(b=b[b.length-
+1]);Db(P(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ca(b,a){if("hasOwnProperty"===b)throw Qa("badname",a);}function fc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&P(b)?Ab(e,b):b}function Eb(b){var a=b[0];b=b[b.length-1];if(a===b)return D(a);var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return D(c)}function sd(b){var a=G("$injector"),c=G("ng");b=b.angular||
+(b.angular={});b.$$minErr=b.$$minErr||G;return b.module||(b.module=function(){var b={};return function(e,f,g){if("hasOwnProperty"===e)throw c("badname","module");f&&b.hasOwnProperty(e)&&(b[e]=null);return b[e]||(b[e]=function(){function b(a,d,e,f){f||(f=c);return function(){f[e||"push"]([a,d,arguments]);return k}}if(!f)throw a("nomod",e);var c=[],d=[],m=[],p=b("$injector","invoke","push",d),k={_invokeQueue:c,_configBlocks:d,_runBlocks:m,requires:f,name:e,provider:b("$provide","provider"),factory:b("$provide",
+"factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide","constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:p,run:function(a){m.push(a);return this}};g&&p(g);return k}())}}())}function td(b){z(b,{bootstrap:ec,copy:za,extend:z,equals:Aa,element:D,forEach:q,injector:Cb,noop:A,bind:Ab,toJson:sa,fromJson:ac,identity:Ea,
+isUndefined:w,isDefined:E,isString:v,isFunction:P,isObject:S,isNumber:Fa,isElement:kd,isArray:L,version:ud,isDate:ra,lowercase:K,uppercase:ib,callbacks:{counter:0},$$minErr:G,$$csp:$b});Ta=sd(M);try{Ta("ngLocale")}catch(a){Ta("ngLocale",[]).provider("$locale",vd)}Ta("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:wd});a.provider("$compile",gc).directive({a:xd,input:hc,textarea:hc,form:yd,script:zd,select:Ad,style:Bd,option:Cd,ngBind:Dd,ngBindHtml:Ed,ngBindTemplate:Fd,ngClass:Gd,
+ngClassEven:Hd,ngClassOdd:Id,ngCloak:Jd,ngController:Kd,ngForm:Ld,ngHide:Md,ngIf:Nd,ngInclude:Od,ngInit:Pd,ngNonBindable:Qd,ngPluralize:Rd,ngRepeat:Sd,ngShow:Td,ngStyle:Ud,ngSwitch:Vd,ngSwitchWhen:Wd,ngSwitchDefault:Xd,ngOptions:Yd,ngTransclude:Zd,ngModel:$d,ngList:ae,ngChange:be,pattern:ic,ngPattern:ic,required:jc,ngRequired:jc,minlength:kc,ngMinlength:kc,maxlength:lc,ngMaxlength:lc,ngValue:ce,ngModelOptions:de}).directive({ngInclude:ee}).directive(jb).directive(mc);a.provider({$anchorScroll:fe,
+$animate:ge,$browser:he,$cacheFactory:ie,$controller:je,$document:ke,$exceptionHandler:le,$filter:nc,$interpolate:me,$interval:ne,$http:oe,$httpBackend:pe,$location:qe,$log:re,$parse:se,$rootScope:te,$q:ue,$$q:ve,$sce:we,$sceDelegate:xe,$sniffer:ye,$templateCache:ze,$timeout:Ae,$window:Be,$$rAF:Ce,$$asyncCallback:De})}])}function Ua(b){return b.replace(Ee,function(a,b,d,e){return e?d.toUpperCase():d}).replace(Fe,"Moz$1")}function Ge(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Fb.test(b)){c=
+c||e.appendChild(a.createElement("div"));d=(He.exec(b)||["",""])[1].toLowerCase();d=fa[d]||fa._default;c.innerHTML=d[1]+b.replace(Ie,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=f.concat(la.call(c.childNodes,void 0));c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";q(f,function(a){e.appendChild(a)});return e}function Q(b){if(b instanceof Q)return b;v(b)&&(b=aa(b));if(!(this instanceof Q)){if(v(b)&&"<"!=b.charAt(0))throw Gb("nosel");return new Q(b)}if(v(b)){var a;
+a=U;var c;b=(c=Je.exec(b))?[a.createElement(c[1])]:(c=Ge(b,a))?c.childNodes:[]}oc(this,b)}function Hb(b){return b.cloneNode(!0)}function Ia(b){pc(b);for(var a=0,c=b.children,d=c&&c.length||0;a<d;a++)b=c[a],Ia(b)}function qc(b,a,c,d){if(E(d))throw Gb("offargs");var e=ma(b,"events");ma(b,"handle")&&(w(a)?q(e,function(a,c){Va(b,c,a);delete e[c]}):q(a.split(" "),function(a){w(c)?(Va(b,a,e[a]),delete e[a]):Ga(e[a]||[],c)}))}function pc(b,a){var c=b.ng339,d=Wa[c];d&&(a?delete Wa[c].data[a]:(d.handle&&(d.events.$destroy&&
+d.handle({},"$destroy"),qc(b)),delete Wa[c],b.ng339=r))}function ma(b,a,c){var d=b.ng339,d=Wa[d||-1];if(E(c))d||(b.ng339=d=++Ke,d=Wa[d]={}),d[a]=c;else return d&&d[a]}function rc(b,a,c){if(!b.nodeType||1===b.nodeType||9===b.nodeType){var d=ma(b,"data"),e=E(c),f=!e&&E(a),g=f&&!S(a);d||g||ma(b,"data",d={});if(e)d[a]=c;else if(f){if(g)return d&&d[a];z(d,a)}else return d}}function Ib(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function kb(b,
+a){a&&b.setAttribute&&q(a.split(" "),function(a){b.setAttribute("class",aa((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+aa(a)+" "," ")))})}function lb(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(a.split(" "),function(a){a=aa(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",aa(c))}}function oc(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;"number"===typeof c&&a.window!==a?c&&(a.item&&
+(a=la.call(a)),sc.apply(b,a)):b[b.length++]=a}}function tc(b,a){return mb(b,"$"+(a||"ngController")+"Controller")}function mb(b,a,c){b=D(b);9==b[0].nodeType&&(b=b.find("html"));for(a=L(a)?a:[a];b.length;){for(var d=b[0],e=0,f=a.length;e<f;e++)if((c=b.data(a[e]))!==r)return c;b=D(d.parentNode||11===d.nodeType&&d.host)}}function uc(b){for(var a=0,c=b.childNodes;a<c.length;a++)Ia(c[a]);for(;b.firstChild;)b.removeChild(b.firstChild)}function vc(b,a){var c=nb[a.toLowerCase()];return c&&wc[na(b)]&&c}function Le(b,
+a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&xc[a]}function Me(b,a){var c=function(c,e){c.preventDefault||(c.preventDefault=function(){c.returnValue=!1});c.stopPropagation||(c.stopPropagation=function(){c.cancelBubble=!0});c.target||(c.target=c.srcElement||U);if(w(c.defaultPrevented)){var f=c.preventDefault;c.preventDefault=function(){c.defaultPrevented=!0;f.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented||!1===c.returnValue};var g=ka(a[e||c.type]||
+[]);q(g,function(a){a.call(b,c)});8>=W?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ja(b,a){var c=typeof b,d;"function"==c||"object"==c&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():d===r&&(d=b.$$hashKey=(a||jd)()):d=b;return c+":"+d}function Xa(b,a){if(a){var c=0;this.nextUid=function(){return++c}}q(b,this.put,this)}function Ne(b){return(b=b.toString().replace(yc,
+"").match(zc))?"function("+(b[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function Jb(b,a,c){var d;if("function"===typeof b){if(!(d=b.$inject)){d=[];if(b.length){if(a)throw v(c)&&c||(c=b.name||Ne(b)),Ka("strictdi",c);a=b.toString().replace(yc,"");a=a.match(zc);q(a[1].split(Oe),function(a){a.replace(Pe,function(a,b,c){d.push(c)})})}b.$inject=d}}else L(b)?(a=b.length-1,Sa(b[a],"fn"),d=b.slice(0,a)):Sa(b,"fn",!0);return d}function Cb(b,a){function c(a){return function(b,c){if(S(b))q(b,Xb(a));else return a(b,
+c)}}function d(a,b){Ca(a,"service");if(P(b)||L(b))b=k.instantiate(b);if(!b.$get)throw Ka("pget",a);return p[a+n]=b}function e(a,b){return d(a,{$get:b})}function f(a){var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=k.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{v(a)?(c=Ta(a),b=b.concat(f(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):P(a)?b.push(k.invoke(a)):L(a)?b.push(k.invoke(a)):Sa(a,"module")}catch(e){throw L(a)&&
+(a=a[a.length-1]),e.message&&(e.stack&&-1==e.stack.indexOf(e.message))&&(e=e.message+"\n"+e.stack),Ka("modulerr",a,e.stack||e.message||e);}}});return b}function g(b,c){function d(a){if(b.hasOwnProperty(a)){if(b[a]===h)throw Ka("cdep",a+" <- "+l.join(" <- "));return b[a]}try{return l.unshift(a),b[a]=h,b[a]=c(a)}catch(e){throw b[a]===h&&delete b[a],e;}finally{l.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[];g=Jb(b,a,g);var n,k,l;k=0;for(n=g.length;k<n;k++){l=g[k];if("string"!==
+typeof l)throw Ka("itkn",l);h.push(f&&f.hasOwnProperty(l)?f[l]:d(l))}L(b)&&(b=b[n]);return b.apply(c,h)}return{invoke:e,instantiate:function(a,b,c){var d=function(){};d.prototype=(L(a)?a[a.length-1]:a).prototype;d=new d;a=e(a,d,b,c);return S(a)||P(a)?a:d},get:d,annotate:Jb,has:function(a){return p.hasOwnProperty(a+n)||b.hasOwnProperty(a)}}}a=!0===a;var h={},n="Provider",l=[],m=new Xa([],!0),p={$provide:{provider:c(d),factory:c(e),service:c(function(a,b){return e(a,["$injector",function(a){return a.instantiate(b)}])}),
+value:c(function(a,b){return e(a,da(b))}),constant:c(function(a,b){Ca(a,"constant");p[a]=b;t[a]=b}),decorator:function(a,b){var c=k.get(a+n),d=c.$get;c.$get=function(){var a=s.invoke(d,c);return s.invoke(b,null,{$delegate:a})}}}},k=p.$injector=g(p,function(){throw Ka("unpr",l.join(" <- "));},a),t={},s=t.$injector=g(t,function(a){var b=k.get(a+n);return s.invoke(b.$get,b,r,a)},a);q(f(b),function(a){s.invoke(a||A)});return s}function fe(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=
+["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;q(a,function(a){b||"a"!==na(a)||(b=a)});return b}function f(){var b=c.hash(),d;b?(d=g.getElementById(b))?d.scrollIntoView():(d=e(g.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var g=a.document;b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(f)});return f}]}function De(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,
+0,!1)}}]}function Qe(b,a,c,d){function e(a){try{a.apply(null,la.call(arguments,1))}finally{if(s--,0===s)for(;I.length;)try{I.pop()()}catch(b){c.error(b)}}}function f(a,b){(function Re(){q(y,function(a){a()});F=b(Re,a)})()}function g(){x=null;B!=h.url()&&(B=h.url(),q(X,function(a){a(h.url())}))}var h=this,n=a[0],l=b.location,m=b.history,p=b.setTimeout,k=b.clearTimeout,t={};h.isMock=!1;var s=0,I=[];h.$$completeOutstandingRequest=e;h.$$incOutstandingRequestCount=function(){s++};h.notifyWhenNoOutstandingRequests=
+function(a){q(y,function(a){a()});0===s?a():I.push(a)};var y=[],F;h.addPollFn=function(a){w(F)&&f(100,p);y.push(a);return a};var B=l.href,u=a.find("base"),x=null;h.url=function(a,c){l!==b.location&&(l=b.location);m!==b.history&&(m=b.history);if(a){if(B!=a)return B=a,d.history?c?m.replaceState(null,"",a):(m.pushState(null,"",a),u.attr("href",u.attr("href"))):(x=a,c?l.replace(a):l.href=a),h}else return x||l.href.replace(/%27/g,"'")};var X=[],N=!1;h.onUrlChange=function(a){if(!N){if(d.history)D(b).on("popstate",
+g);if(d.hashchange)D(b).on("hashchange",g);else h.addPollFn(g);N=!0}X.push(a);return a};h.baseHref=function(){var a=u.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var T={},O="",V=h.baseHref();h.cookies=function(a,b){var d,e,f,g;if(a)b===r?n.cookie=escape(a)+"=;path="+V+";expires=Thu, 01 Jan 1970 00:00:00 GMT":v(b)&&(d=(n.cookie=escape(a)+"="+escape(b)+";path="+V).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));
+else{if(n.cookie!==O)for(O=n.cookie,d=O.split("; "),T={},f=0;f<d.length;f++)e=d[f],g=e.indexOf("="),0<g&&(a=unescape(e.substring(0,g)),T[a]===r&&(T[a]=unescape(e.substring(g+1))));return T}};h.defer=function(a,b){var c;s++;c=p(function(){delete t[c];e(a)},b||0);t[c]=!0;return c};h.defer.cancel=function(a){return t[a]?(delete t[a],k(a),e(A),!0):!1}}function he(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new Qe(b,d,a,c)}]}function ie(){this.$get=function(){function b(b,
+d){function e(a){a!=p&&(k?k==a&&(k=a.n):k=a,f(a.n,a.p),f(a,p),p=a,p.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw G("$cacheFactory")("iid",b);var g=0,h=z({},d,{id:b}),n={},l=d&&d.capacity||Number.MAX_VALUE,m={},p=null,k=null;return a[b]={put:function(a,b){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!w(b))return a in n||g++,n[a]=b,g>l&&this.remove(k.key),b},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return n[a]},remove:function(a){if(l<
+Number.MAX_VALUE){var b=m[a];if(!b)return;b==p&&(p=b.p);b==k&&(k=b.n);f(b.n,b.p);delete m[a]}delete n[a];g--},removeAll:function(){n={};g=0;m={};p=k=null},destroy:function(){m=h=n=null;delete a[b]},info:function(){return z({},h,{size:g})}}}var a={};b.info=function(){var b={};q(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function ze(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function gc(b,a){var c={},d="Directive",e=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,
+f=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,g=ld("ngSrc,ngSrcset,src,srcset"),h=/^(on[a-z]+|formaction)$/;this.directive=function l(a,e){Ca(a,"directive");v(a)?(Db(e,"directiveFactory"),c.hasOwnProperty(a)||(c[a]=[],b.factory(a+d,["$injector","$exceptionHandler",function(b,d){var e=[];q(c[a],function(c,f){try{var g=b.invoke(c);P(g)?g={compile:da(g)}:!g.compile&&g.link&&(g.compile=da(g.link));g.priority=g.priority||0;g.index=f;g.name=g.name||a;g.require=g.require||g.controller&&g.name;g.restrict=g.restrict||
+"A";e.push(g)}catch(h){d(h)}});return e}])),c[a].push(e)):q(a,Xb(l));return this};this.aHrefSanitizationWhitelist=function(b){return E(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return E(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",
+function(a,b,p,k,t,s,I,y,F,B,u,x){function X(a,b,c,d,e){a instanceof D||(a=D(a));q(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=D(b).wrap("<span></span>").parent()[0])});var f=T(a,b,a,c,d,e);N(a,"ng-scope");return function(b,c,d,e){Db(b,"scope");var g=c?Ha.clone.call(a):a;q(d,function(a,b){g.data("$"+b+"Controller",a)});d=0;for(var h=g.length;d<h;d++){var k=g[d].nodeType;1!==k&&9!==k||g.eq(d).data("$scope",b)}c&&c(g,b);f&&f(b,g,g,e);return g}}function N(a,b){try{a.addClass(b)}catch(c){}}
+function T(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,t,F;f=c.length;var s=Array(f);for(p=0;p<f;p++)s[p]=c[p];F=p=0;for(t=h.length;p<t;F++)k=s[F],c=h[p++],f=h[p++],l=D(k),c?(c.scope?(m=a.$new(),l.data("$scope",m)):m=a,l=c.transcludeOnThisElement?O(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?O(a,b):null,c(f,m,k,d,l)):f&&f(a,k.childNodes,r,e)}for(var h=[],k,l,m,p,t=0;t<a.length;t++)k=new Kb,l=V(a[t],[],k,0===t?d:r,e),(f=l.length?J(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&N(D(a[t]),"ng-scope"),
+k=f&&f.terminal||!(m=a[t].childNodes)||!m.length?null:T(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b),h.push(f,k),p=p||f||k,f=null;return p?g:null}function O(a,b,c){return function(d,e,f){var g=!1;d||(d=a.$new(),g=d.$$transcluded=!0);e=b(d,e,f,c);if(g)e.on("$destroy",function(){d.$destroy()});return e}}function V(a,b,c,d,g){var h=c.$attr,k;switch(a.nodeType){case 1:ua(b,pa(na(a)),"E",d,g);for(var l,m,p,t=a.attributes,F=0,s=t&&t.length;F<s;F++){var I=!1,B=!1;l=t[F];if(!W||
+8<=W||l.specified){k=l.name;m=aa(l.value);l=pa(k);if(p=Da.test(l))k=hb(l.substr(6),"-");var y=l.replace(/(Start|End)$/,"");l===y+"Start"&&(I=k,B=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6));l=pa(k.toLowerCase());h[l]=k;if(p||!c.hasOwnProperty(l))c[l]=m,vc(a,l)&&(c[l]=!0);Z(a,b,m,l);ua(b,l,"A",d,g,I,B)}}a=a.className;if(v(a)&&""!==a)for(;k=f.exec(a);)l=pa(k[2]),ua(b,l,"C",d,g)&&(c[l]=aa(k[3])),a=a.substr(k.index+k[0].length);break;case 3:G(b,a.nodeValue);break;case 8:try{if(k=e.exec(a.nodeValue))l=
+pa(k[1]),ua(b,l,"M",d,g)&&(c[l]=aa(k[2]))}catch(u){}}b.sort(w);return b}function C(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return D(d)}function $(a,b,c){return function(d,e,f,g,h){e=C(e[0],b,c);return a(d,e,f,g,h)}}function J(a,c,d,e,f,g,h,k,l){function t(a,b,c,d){if(a){c&&(a=$(a,c,d));a.require=H.require;a.directiveName=z;if(x===
+H||H.$$isolateScope)a=Bc(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=$(b,c,d));b.require=H.require;b.directiveName=z;if(x===H||H.$$isolateScope)b=Bc(b,{isolateScope:!0});k.push(b)}}function F(a,b,c,d){var e,f="data",g=!1;if(v(b)){for(;"^"==(e=b.charAt(0))||"?"==e;)b=b.substr(1),"^"==e&&(f="inheritedData"),g=g||"?"==e;e=null;d&&"data"===f&&(e=d[b]);e=e||c[f]("$"+b+"Controller");if(!e&&!g)throw ia("ctreq",b,a);}else L(b)&&(e=[],q(b,function(b){e.push(F(a,b,c,d))}));return e}function B(a,e,f,g,l){function t(a,
+b){var c;2>arguments.length&&(b=a,a=r);w&&(c=V);return l(a,b,c)}var y,u,Ac,C,X,J,V={},$;y=c===f?d:ka(d,new Kb(D(f),d.$attr));u=y.$$element;if(x){var Se=/^\s*([@=&])(\??)\s*(\w*)\s*$/;g=D(f);J=e.$new(!0);!T||T!==x&&T!==x.$$originalDirective?g.data("$isolateScopeNoTemplate",J):g.data("$isolateScope",J);N(g,"ng-isolate-scope");q(x.scope,function(a,c){var d=a.match(Se)||[],f=d[3]||c,g="?"==d[2],d=d[1],h,k,l,p;J.$$isolateBindings[c]=d+f;switch(d){case "@":y.$observe(f,function(a){J[c]=a});y.$$observers[f].$$scope=
+e;y[f]&&(J[c]=b(y[f])(e));break;case "=":if(g&&!y[f])break;k=s(y[f]);p=k.literal?Aa:function(a,b){return a===b};l=k.assign||function(){h=J[c]=k(e);throw ia("nonassign",y[f],x.name);};h=J[c]=k(e);J.$watch(function Te(){var a=k(e);p(a,J[c])||(p(a,h)?l(e,a=J[c]):J[c]=a);Te.$$unwatch=k.$$unwatch;return h=a},null,k.literal);break;case "&":k=s(y[f]);J[c]=function(a){return k(e,a)};break;default:throw ia("iscp",x.name,c,a);}})}$=l&&t;O&&q(O,function(a){var b={$scope:a===x||a.$$isolateScope?J:e,$element:u,
+$attrs:y,$transclude:$},c;X=a.controller;"@"==X&&(X=y[a.name]);c=I(X,b);V[a.name]=c;w||u.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});g=0;for(Ac=h.length;g<Ac;g++)try{C=h[g],C(C.isolateScope?J:e,u,y,C.require&&F(C.directiveName,C.require,u,V),$)}catch(oa){p(oa,ha(u))}g=e;x&&(x.template||null===x.templateUrl)&&(g=J);a&&a(g,f.childNodes,r,l);for(g=k.length-1;0<=g;g--)try{C=k[g],C(C.isolateScope?J:e,u,y,C.require&&F(C.directiveName,C.require,u,V),$)}catch(R){p(R,ha(u))}}
+l=l||{};for(var y=-Number.MAX_VALUE,u,O=l.controllerDirectives,x=l.newIsolateScopeDirective,T=l.templateDirective,J=l.nonTlbTranscludeDirective,ua=!1,Ya=!1,w=l.hasElementTranscludeDirective,Z=d.$$element=D(c),H,z,R,K=e,G,M=0,Q=a.length;M<Q;M++){H=a[M];var Da=H.$$start,ob=H.$$end;Da&&(Z=C(c,Da,ob));R=r;if(y>H.priority)break;if(R=H.scope)H.templateUrl||(S(R)?(La("new/isolated scope",x||u,H,Z),x=H):La("new/isolated scope",x,H,Z)),u=u||H;z=H.name;!H.templateUrl&&H.controller&&(R=H.controller,O=O||{},
+La("'"+z+"' controller",O[z],H,Z),O[z]=H);if(R=H.transclude)ua=!0,H.$$tlb||(La("transclusion",J,H,Z),J=H),"element"==R?(w=!0,y=H.priority,R=C(c,Da,ob),Z=d.$$element=D(U.createComment(" "+z+": "+d[z]+" ")),c=Z[0],pb(f,D(la.call(R,0)),c),K=X(R,e,y,g&&g.name,{nonTlbTranscludeDirective:J})):(R=D(Hb(c)).contents(),Z.empty(),K=X(R,e));if(H.template)if(Ya=!0,La("template",T,H,Z),T=H,R=P(H.template)?H.template(Z,d):H.template,R=Cc(R),H.replace){g=H;R=Fb.test(R)?D(Dc(H.type,aa(R))):[];c=R[0];if(1!=R.length||
+1!==c.nodeType)throw ia("tplrt",z,"");pb(f,Z,c);Q={$attr:{}};R=V(c,[],Q);var W=a.splice(M+1,a.length-(M+1));x&&E(R);a=a.concat(R).concat(W);oa(d,Q);Q=a.length}else Z.html(R);if(H.templateUrl)Ya=!0,La("template",T,H,Z),T=H,H.replace&&(g=H),B=A(a.splice(M,a.length-M),Z,d,f,ua&&K,h,k,{controllerDirectives:O,newIsolateScopeDirective:x,templateDirective:T,nonTlbTranscludeDirective:J}),Q=a.length;else if(H.compile)try{G=H.compile(Z,d,K),P(G)?t(null,G,Da,ob):G&&t(G.pre,G.post,Da,ob)}catch(Y){p(Y,ha(Z))}H.terminal&&
+(B.terminal=!0,y=Math.max(y,H.priority))}B.scope=u&&!0===u.scope;B.transcludeOnThisElement=ua;B.templateOnThisElement=Ya;B.transclude=K;l.hasElementTranscludeDirective=w;return B}function E(a){for(var b=0,c=a.length;b<c;b++)a[b]=Zb(a[b],{$$isolateScope:!0})}function ua(b,e,f,g,h,k,m){if(e===h)return null;h=null;if(c.hasOwnProperty(e)){var t;e=a.get(e+d);for(var F=0,s=e.length;F<s;F++)try{t=e[F],(g===r||g>t.priority)&&-1!=t.restrict.indexOf(f)&&(k&&(t=Zb(t,{$$start:k,$$end:m})),b.push(t),h=t)}catch(y){p(y)}}return h}
+function oa(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,f){"class"==f?(N(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function A(a,b,c,d,e,f,g,h){var l=[],m,p,F=b[0],s=a.shift(),y=z({},s,{templateUrl:null,transclude:null,replace:null,
+$$originalDirective:s}),u=P(s.templateUrl)?s.templateUrl(b,c):s.templateUrl,I=s.type;b.empty();k.get(B.getTrustedResourceUrl(u),{cache:t}).success(function(k){var t,B;k=Cc(k);if(s.replace){k=Fb.test(k)?D(Dc(I,aa(k))):[];t=k[0];if(1!=k.length||1!==t.nodeType)throw ia("tplrt",s.name,u);k={$attr:{}};pb(d,b,t);var x=V(t,[],k);S(s.scope)&&E(x);a=x.concat(a);oa(c,k)}else t=F,b.html(k);a.unshift(y);m=J(a,t,c,e,b,s,f,g,h);q(d,function(a,c){a==t&&(d[c]=b[0])});for(p=T(b[0].childNodes,e);l.length;){k=l.shift();
+B=l.shift();var C=l.shift(),X=l.shift(),x=b[0];if(B!==F){var $=B.className;h.hasElementTranscludeDirective&&s.replace||(x=Hb(t));pb(C,D(B),x);N(D(x),$)}B=m.transcludeOnThisElement?O(k,m.transclude,X):X;m(p,k,x,d,B)}l=null}).error(function(a,b,c,d){throw ia("tpload",d.url);});return function(a,b,c,d,e){a=e;l?(l.push(b),l.push(c),l.push(d),l.push(a)):(m.transcludeOnThisElement&&(a=O(b,m.transclude,e)),m(p,b,c,d,a))}}function w(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?
+-1:1:a.index-b.index}function La(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,ha(d));}function G(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){var e=a.parent().length;e&&N(a.parent(),"ng-binding");return function(a,f){var g=f.parent(),h=g.data("$binding")||[];d=b(c);h.push(d);g.data("$binding",h);e||N(g,"ng-binding");a.$watch(d,function(a){f[0].nodeValue=a})}}})}function Dc(a,b){a=K(a||"html");switch(a){case "svg":case "math":var c=U.createElement("div");c.innerHTML="<"+a+">"+
+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Ya(a,b){if("srcdoc"==b)return B.HTML;var c=na(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return B.RESOURCE_URL}function Z(a,c,d,e){var f=b(d,!0);if(f){if("multiple"===e&&"select"===na(a))throw ia("selmulti",ha(a));c.push({priority:100,compile:function(){return{pre:function(c,d,k){d=k.$$observers||(k.$$observers={});if(h.test(e))throw ia("nodomevents");if(f=b(k[e],!0,Ya(a,e),g[e]))k[e]=f(c),
+(d[e]||(d[e]=[])).$$inter=!0,(k.$$observers&&k.$$observers[e].$$scope||c).$watch(f,function(a,b){"class"===e&&a!=b?k.$updateClass(a,b):k.$set(e,a)})}}}})}}function pb(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;break}f&&f.replaceChild(c,d);a=U.createDocumentFragment();a.appendChild(d);c[D.expando]=d[D.expando];d=1;for(e=b.length;d<e;d++)f=b[d],D(f).remove(),a.appendChild(f),
+delete b[d];b[0]=c;b.length=1}function Bc(a,b){return z(function(){return a.apply(null,arguments)},a,b)}var Kb=function(a,b){this.$$element=a;this.$attr=b||{}};Kb.prototype={$normalize:pa,$addClass:function(a){a&&0<a.length&&u.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&u.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Ec(a,b),d=Ec(b,a);0===c.length?u.removeClass(this.$$element,d):0===d.length?u.addClass(this.$$element,c):u.setClass(this.$$element,c,d)},$set:function(a,
+b,c,d){var e=this.$$element[0],f=vc(e,a),g=Le(e,a),e=a;f?(this.$$element.prop(a,b),d=f):g&&(this[g]=b,e=g);this[a]=b;d?this.$attr[a]=d:(d=this.$attr[a])||(this.$attr[a]=d=hb(a,"-"));f=na(this.$$element);if("a"===f&&"href"===a||"img"===f&&"src"===a)this[a]=b=x(b,"src"===a);!1!==c&&(null===b||b===r?this.$$element.removeAttr(d):this.$$element.attr(d,b));(a=this.$$observers)&&q(a[e],function(a){try{a(b)}catch(c){p(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=
+[]);e.push(b);y.$evalAsync(function(){e.$$inter||b(c[a])});return function(){Ga(e,b)}}};var M=b.startSymbol(),Q=b.endSymbol(),Cc="{{"==M||"}}"==Q?Ea:function(a){return a.replace(/\{\{/g,M).replace(/}}/g,Q)},Da=/^ngAttr[A-Z]/;return X}]}function pa(b){return Ua(b.replace(Ue,""))}function Ec(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],h=0;h<e.length;h++)if(g==e[h])continue a;c+=(0<c.length?" ":"")+g}return c}function je(){var b={},a=/^(\S+)(\s+as\s+(\w+))?$/;
+this.register=function(a,d){Ca(a,"controller");S(a)?z(b,a):b[a]=d};this.$get=["$injector","$window",function(c,d){return function(e,f){var g,h,n;v(e)&&(g=e.match(a),h=g[1],n=g[3],e=b.hasOwnProperty(h)?b[h]:fc(f.$scope,h,!0)||fc(d,h,!0),Sa(e,h,!0));g=c.instantiate(e,f,h);if(n){if(!f||"object"!==typeof f.$scope)throw G("$controller")("noscp",h||e.name,n);f.$scope[n]=g}return g}}]}function ke(){this.$get=["$window",function(b){return D(b.document)}]}function le(){this.$get=["$log",function(b){return function(a,
+c){b.error.apply(b,arguments)}}]}function Fc(b){var a={},c,d,e;if(!b)return a;q(b.split("\n"),function(b){e=b.indexOf(":");c=K(aa(b.substr(0,e)));d=aa(b.substr(e+1));c&&(a[c]=a[c]?a[c]+(", "+d):d)});return a}function Gc(b){var a=S(b)?b:r;return function(c){a||(a=Fc(b));return c?a[K(c)]||null:a}}function Hc(b,a,c){if(P(c))return c(b,a);q(c,function(c){b=c(b,a)});return b}function oe(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults=
+{transformResponse:[function(d){v(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=ac(d)));return d}],transformRequest:[function(a){return S(a)&&"[object File]"!==ya.call(a)&&"[object Blob]"!==ya.call(a)?sa(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ka(d),put:ka(d),patch:ka(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,m,p){function k(a){function b(a){var d=
+z({},a,{data:Hc(a.data,a.headers,c.transformResponse)});return 200<=a.status&&300>a.status?d:m.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){function b(a){var c;q(a,function(b,d){P(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=z({},a.headers),f,g,c=z({},c.common,c[K(a.method)]);b(c);b(d);a:for(f in c){a=K(f);for(g in d)if(K(g)===a)continue a;d[f]=c[f]}return d}(a);z(c,a);c.headers=d;c.method=ib(c.method);var f=[function(a){d=
+a.headers;var c=Hc(a.data,Gc(d),a.transformRequest);w(a.data)&&q(d,function(a,b){"content-type"===K(b)&&delete d[b]});w(a.withCredentials)&&!w(e.withCredentials)&&(a.withCredentials=e.withCredentials);return t(a,c,d).then(b,b)},r],g=m.when(c);for(q(y,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}g.success=function(a){g.then(function(b){a(b.data,b.status,
+b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function t(c,f,n){function t(a,b,c,e){V&&(200<=a&&300>a?V.put($,[a,b,Fc(c),e]):V.remove($));p(b,a,c,e);d.$$phase||d.$apply()}function p(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?q.resolve:q.reject)({data:a,status:b,headers:Gc(d),config:c,statusText:e})}function y(){var a=Pa(k.pendingRequests,c);-1!==a&&k.pendingRequests.splice(a,1)}var q=m.defer(),O=q.promise,V,C,$=s(c.url,c.params);
+k.pendingRequests.push(c);O.then(y,y);(c.cache||e.cache)&&(!1!==c.cache&&"GET"==c.method)&&(V=S(c.cache)?c.cache:S(e.cache)?e.cache:I);if(V)if(C=V.get($),E(C)){if(C.then)return C.then(y,y),C;L(C)?p(C[1],C[0],ka(C[2]),C[3]):p(C,200,{},"OK")}else V.put($,O);w(C)&&((C=Lb(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:r)&&(n[c.xsrfHeaderName||e.xsrfHeaderName]=C),a(c.method,$,f,t,n,c.timeout,c.withCredentials,c.responseType));return O}function s(a,b){if(!b)return a;var c=[];id(b,function(a,b){null===
+a||w(a)||(L(a)||(a=[a]),q(a,function(a){S(a)&&(a=sa(a));c.push(Ba(b)+"="+Ba(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var I=c("$http"),y=[];q(f,function(a){y.unshift(v(a)?p.get(a):p.invoke(a))});k.pendingRequests=[];(function(a){q(arguments,function(a){k[a]=function(b,c){return k(z(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){k[a]=function(b,c,d){return k(z(d||{},{method:a,url:b,data:c}))}})})("post","put","patch");
+k.defaults=e;return k}]}function Ve(b){if(8>=W&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!M.XMLHttpRequest))return new M.ActiveXObject("Microsoft.XMLHTTP");if(M.XMLHttpRequest)return new M.XMLHttpRequest;throw G("$httpBackend")("noxhr");}function pe(){this.$get=["$browser","$window","$document",function(b,a,c){return We(b,Ve,b.defer,a.angular.callbacks,c[0])}]}function We(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),g=null;f.type="text/javascript";f.src=a;f.async=!0;g=function(a){Va(f,
+"load",g);Va(f,"error",g);e.body.removeChild(f);f=null;var h=-1,s="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),s=a.type,h="error"===a.type?404:200);c&&c(h,s)};qb(f,"load",g);qb(f,"error",g);e.body.appendChild(f);return g}var g=-1;return function(e,n,l,m,p,k,t,s){function I(){F=g;u&&u();x&&x.abort()}function y(a,d,e,f,g){N&&c.cancel(N);u=x=null;0===d&&(d=e?200:"file"==va(n).protocol?404:0);a(1223===d?204:d,e,f,g||"");b.$$completeOutstandingRequest(A)}var F;b.$$incOutstandingRequestCount();
+n=n||b.url();if("jsonp"==K(e)){var B="_"+(d.counter++).toString(36);d[B]=function(a){d[B].data=a;d[B].called=!0};var u=f(n.replace("JSON_CALLBACK","angular.callbacks."+B),B,function(a,b){y(m,a,d[B].data,"",b);d[B]=A})}else{var x=a(e);x.open(e,n,!0);q(p,function(a,b){E(a)&&x.setRequestHeader(b,a)});x.onreadystatechange=function(){if(x&&4==x.readyState){var a=null,b=null,c="";F!==g&&(a=x.getAllResponseHeaders(),b="response"in x?x.response:x.responseText);F===g&&10>W||(c=x.statusText);y(m,F||x.status,
+b,a,c)}};t&&(x.withCredentials=!0);if(s)try{x.responseType=s}catch(X){if("json"!==s)throw X;}x.send(l||null)}if(0<k)var N=c(I,k);else k&&k.then&&k.then(I)}}function me(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,t,s){s=!!s;for(var I,y,F=0,B=[],u=[],x=[],X=f.length,N=!1,T=!1,O=[],V={},C={};F<X;)if(-1!=(I=f.indexOf(b,
+F))&&-1!=(y=f.indexOf(a,I+h)))F!==I&&(T=!0),B.push(f.substring(F,I)),F=f.substring(I+h,y),u.push(F),x.push(c(F)),F=y+n,N=!0;else{F!==X&&(T=!0,B.push(f.substring(F)));break}q(B,function(c,d){B[d]=B[d].replace(l,b).replace(m,a)});B.length===u.length&&B.push("");if(t&&N&&(T||1<u.length))throw Ic("noconcat",f);if(!g||N){O.length=B.length+u.length;var $=function(a){for(var b=0,c=u.length;b<c;b++)O[2*b]=B[b],O[2*b+1]=a[b];O[2*c]=B[c];return O.join("")},J=function(a){return a=t?e.getTrusted(t,a):e.valueOf(a)},
+D=function(a){if(null==a)return"";switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=sa(a)}return a};return z(function oa(a){var b=a&&a.$id||"notAScope",c=V[b],e=C[b],g=0,h=u.length,k=Array(h),n,l=e===r?!0:!1;c||(c=[],l=!0,a&&a.$on&&a.$on("$destroy",function(){V[b]=null;C[b]=null}));try{for(oa.$$unwatch=!0;g<h;g++){n=J(x[g](a));if(s&&w(n)){oa.$$unwatch=r;return}n=D(n);n!==c[g]&&(l=!0);k[g]=n;oa.$$unwatch=oa.$$unwatch&&x[g].$$unwatch}l&&(V[b]=k,C[b]=e=$(k))}catch(t){a=Ic("interr",
+f,t.toString()),d(a)}return e},{exp:f,separators:B,expressions:u})}}var h=b.length,n=a.length,l=RegExp(b.replace(/./g,f),"g"),m=RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function ne(){this.$get=["$rootScope","$window","$q","$$q",function(b,a,c,d){function e(e,h,n,l){var m=a.setInterval,p=a.clearInterval,k=0,t=E(l)&&!l,s=(t?d:c).defer(),I=s.promise;n=E(n)?n:0;I.then(null,null,e);I.$$intervalId=m(function(){s.notify(k++);0<n&&k>=n&&
+(s.resolve(k),p(I.$$intervalId),delete f[I.$$intervalId]);t||b.$apply()},h);f[I.$$intervalId]=s;return I}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]}function vd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,
+posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",
+longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Mb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=gb(b[a]);return b.join("/")}function Jc(b,a,c){b=va(b,c);a.$$protocol=b.protocol;a.$$host=b.hostname;a.$$port=Y(b.port)||Xe[b.protocol]||null}function Kc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=va(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):
+b.pathname);a.$$search=cc(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function qa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Za(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Nb(b){return b.substr(0,Za(b).lastIndexOf("/")+1)}function Lc(b,a){this.$$html5=!0;a=a||"";var c=Nb(b);Jc(b,this,b);this.$$parse=function(a){var e=qa(c,a);if(!v(e))throw Ob("ipthprfx",a,c);Kc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};
+this.$$compose=function(){var a=Bb(this.$$search),b=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=Mb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=qa(b,d))!==r)return d=e,(e=qa(a,e))!==r?c+(qa("/",e)||e):b+d;if((e=qa(c,d))!==r)return c+e;if(c==d+"/")return c}}function Pb(b,a){var c=Nb(b);Jc(b,this,b);this.$$parse=function(d){var e=qa(b,d)||qa(c,d),e="#"==e.charAt(0)?qa(a,e):this.$$html5?e:"";if(!v(e))throw Ob("ihshprfx",d,a);Kc(e,this,b);
+d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=Mb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Za(b)==Za(a))return a}}function Qb(b,a){this.$$html5=!0;Pb.apply(this,arguments);var c=Nb(b);this.$$rewrite=function(d){var e;if(b==Za(d))return d;if(e=
+qa(c,d))return b+a+e;if(c===d+"/")return c};this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=Mb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function rb(b){return function(){return this[b]}}function Mc(b,a){return function(c){if(w(c))return this[b];this[b]=a(c);this.$$compose();return this}}function qe(){var b="",a=!1;this.hashPrefix=function(a){return E(a)?(b=a,this):b};this.html5Mode=function(b){return E(b)?(a=b,this):a};this.$get=["$rootScope",
+"$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,n,l=d.baseHref(),m=d.url(),p;a?(p=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(l||"/"),n=e.history?Lc:Qb):(p=Za(m),n=Pb);h=new n(p,"#"+b);h.$$parse(h.$$rewrite(m));f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var e=D(a.target);"a"!==na(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href");S(g)&&"[object SVGAnimatedString]"===g.toString()&&
+(g=va(g.animVal).href);if(n===Qb){var k=e.attr("href")||e.attr("xlink:href");if(0>k.indexOf("://"))if(g="#"+b,"/"==k[0])g=p+g+k;else if("#"==k[0])g=p+g+(h.path()||"/")+k;else{for(var l=h.path().split("/"),k=k.split("/"),m=0;m<k.length;m++)"."!=k[m]&&(".."==k[m]?l.pop():k[m].length&&l.push(k[m]));g=p+g+l.join("/")}}l=h.$$rewrite(g);g&&(!e.attr("target")&&l&&!a.isDefaultPrevented())&&(a.preventDefault(),l!=d.url()&&(h.$$parse(l),c.$apply(),M.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=m&&
+d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var k=0;c.$watch(function(){var a=d.url(),b=h.$$replace;k&&a==h.absUrl()||(k++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),g(a))}));h.$$replace=!1;return k});return h}]}function re(){var b=
+!0,a=this;this.debugEnabled=function(a){return E(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(n){}return a?function(){var a=[];q(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),
+info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function ea(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ja("isecfld",a);return b}function Ma(b,a){if(b){if(b.constructor===b)throw ja("isecfn",a);if(b.window===b)throw ja("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ja("isecdom",a);if(b===Object)throw ja("isecobj",
+a);}return b}function sb(b,a,c,d){a=a.split(".");for(var e,f=0;1<a.length;f++){e=ea(a.shift(),d);var g=b[e];g||(g={},b[e]=g);b=g}e=ea(a.shift(),d);Ma(b,d);Ma(b[e],d);return b[e]=c}function Nc(b,a,c,d,e,f){ea(b,f);ea(a,f);ea(c,f);ea(d,f);ea(e,f);return function(f,h){var n=h&&h.hasOwnProperty(b)?h:f;if(null==n)return n;n=n[b];if(!a)return n;if(null==n)return r;n=n[a];if(!c)return n;if(null==n)return r;n=n[c];if(!d)return n;if(null==n)return r;n=n[d];return e?null==n?r:n=n[e]:n}}function Ye(b,a){ea(b,
+a);return function(a,d){return null==a?r:(d&&d.hasOwnProperty(b)?d:a)[b]}}function Ze(b,a,c){ea(b,c);ea(a,c);return function(c,e){if(null==c)return r;c=(e&&e.hasOwnProperty(b)?e:c)[b];return null==c?r:c[a]}}function Oc(b,a,c){if(Rb.hasOwnProperty(b))return Rb[b];var d=b.split("."),e=d.length;if(1===e)a=Ye(d[0],c);else if(2===e)a=Ze(d[0],d[1],c);else if(a.csp)a=6>e?Nc(d[0],d[1],d[2],d[3],d[4],c):function(a,b){var f=0,l;do l=Nc(d[f++],d[f++],d[f++],d[f++],d[f++],c)(a,b),b=r,a=l;while(f<e);return l};
+else{var f="var p;\n";q(d,function(a,b){ea(a,c);f+="if(s == null) return undefined;\ns="+(b?"s":'((k&&k.hasOwnProperty("'+a+'"))?k:s)')+'["'+a+'"];\n'});f+="return s;";a=new Function("s","k",f);a.toString=da(f)}"hasOwnProperty"!==b&&(Rb[b]=a);return a}function se(){var b={},a={csp:!1};this.$get=["$filter","$sniffer",function(c,d){a.csp=d.csp;return function(d){function f(a){function b(e,f){c||(d=a.constant&&d?d:a(e,f),b.$$unwatch=E(d),b.$$unwatch&&(e&&e.$$postDigestQueue)&&e.$$postDigestQueue.push(function(){!(c=
+E(d))||null!==d&&d.$$unwrapTrustedValue||(d=za(d,null))}));return d}var c=!1,d;b.literal=a.literal;b.constant=a.constant;b.assign=a.assign;return b}var g,h;switch(typeof d){case "string":d=aa(d);":"===d.charAt(0)&&":"===d.charAt(1)&&(h=!0,d=d.substring(2));if(b.hasOwnProperty(d))return h?f(b[d]):b[d];g=new Sb(a);g=(new $a(g,c,a)).parse(d);"hasOwnProperty"!==d&&(b[d]=g);return h||g.constant?f(g):g;case "function":return d;default:return A}}}]}function ue(){this.$get=["$rootScope","$exceptionHandler",
+function(b,a){return Pc(function(a){b.$evalAsync(a)},a)}]}function ve(){this.$get=["$browser","$exceptionHandler",function(b,a){return Pc(function(a){b.defer(a)},a)}]}function Pc(b,a){function c(a){return a}function d(a){return g(a)}var e=function(){var g=[],l,m;return m={resolve:function(a){if(g){var c=g;g=r;l=f(a);c.length&&b(function(){for(var a,b=0,d=c.length;b<d;b++)a=c[b],l.then(a[0],a[1],a[2])})}},reject:function(a){m.resolve(h(a))},notify:function(a){if(g){var c=g;g.length&&b(function(){for(var b,
+d=0,e=c.length;d<e;d++)b=c[d],b[2](a)})}},promise:{then:function(b,f,h){var m=e(),I=function(d){try{m.resolve((P(b)?b:c)(d))}catch(e){m.reject(e),a(e)}},y=function(b){try{m.resolve((P(f)?f:d)(b))}catch(c){m.reject(c),a(c)}},F=function(b){try{m.notify((P(h)?h:c)(b))}catch(d){a(d)}};g?g.push([I,y,F]):l.then(I,y,F);return m.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();c?d.resolve(a):d.reject(a);return d.promise}function d(e,f){var g=null;try{g=
+(a||c)()}catch(h){return b(h,!1)}return g&&P(g.then)?g.then(function(){return b(e,f)},function(a){return b(a,!1)}):b(e,f)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},f=function(a){return a&&P(a.then)?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},g=function(a){var b=e();b.reject(a);return b.promise},h=function(c){return{then:function(f,g){var h=e();b(function(){try{h.resolve((P(g)?g:d)(c))}catch(b){h.reject(b),a(b)}});return h.promise}}};
+return{defer:e,reject:g,when:function(h,l,m,p){var k=e(),t,s=function(b){try{return(P(l)?l:c)(b)}catch(d){return a(d),g(d)}},I=function(b){try{return(P(m)?m:d)(b)}catch(c){return a(c),g(c)}},y=function(b){try{return(P(p)?p:c)(b)}catch(d){a(d)}};b(function(){f(h).then(function(a){t||(t=!0,k.resolve(f(a).then(s,I,y)))},function(a){t||(t=!0,k.resolve(I(a)))},function(a){t||k.notify(y(a))})});return k.promise},all:function(a){var b=e(),c=0,d=L(a)?[]:{};q(a,function(a,e){c++;f(a).then(function(a){d.hasOwnProperty(e)||
+(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise}}}function Ce(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};
+f.supported=e;return f}]}function te(){var b=10,a=G("$rootScope"),c=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,f,g){function h(){this.$id=++eb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this["this"]=this.$root=this;this.$$destroyed=!1;this.$$asyncQueue=[];this.$$postDigestQueue=[];this.$$listeners={};this.$$listenerCount={};
+this.$$isolateBindings={}}function n(b){if(k.$$phase)throw a("inprog",k.$$phase);k.$$phase=b}function l(a,b){var c=f(a);Sa(c,b);return c}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function p(){}h.prototype={constructor:h,$new:function(a){a?(a=new h,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(this.$$childScopeClass||(this.$$childScopeClass=function(){this.$$watchers=this.$$nextSibling=
+this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=++eb;this.$$childScopeClass=null},this.$$childScopeClass.prototype=this),a=new this.$$childScopeClass);a["this"]=a;a.$parent=this;a.$$prevSibling=this.$$childTail;this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,d){var e=l(a,"watch"),f=this.$$watchers,g={fn:b,last:p,get:e,exp:a,eq:!!d};c=null;if(!P(b)){var h=l(b||A,"listener");
+g.fn=function(a,b,c){h(c)}}f||(f=this.$$watchers=[]);f.unshift(g);return function(){Ga(f,g);c=null}},$watchGroup:function(a,b){function c(){return h}var d=Array(a.length),e=Array(a.length),g=[],h=0,k=this,l=Array(a.length),n=a.length;q(a,function(a,b){var c=f(a);g.push(k.$watch(c,function(a,f){e[b]=a;d[b]=f;h++;l[b]&&!c.$$unwatch&&n++;!l[b]&&c.$$unwatch&&n--;l[b]=c.$$unwatch}))},this);g.push(k.$watch(c,function(){b(e,d,k);c.$$unwatch=0===n?!0:!1}));return function(){q(g,function(a){a()})}},$watchCollection:function(a,
+b){function c(){e=n(d);var a,b;if(S(e))if(db(e))for(g!==m&&(g=m,C=g.length=0,l++),a=e.length,C!==a&&(l++,g.length=C=a),b=0;b<a;b++)g[b]!==g[b]&&e[b]!==e[b]||g[b]===e[b]||(l++,g[b]=e[b]);else{g!==p&&(g=p={},C=0,l++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g.hasOwnProperty(b)?g[b]!==e[b]&&(l++,g[b]=e[b]):(C++,g[b]=e[b],l++));if(C>a)for(b in l++,g)g.hasOwnProperty(b)&&!e.hasOwnProperty(b)&&(C--,delete g[b])}else g!==e&&(g=e,l++);c.$$unwatch=n.$$unwatch;return l}var d=this,e,g,h,k=1<b.length,l=0,n=f(a),
+m=[],p={},q=!0,C=0;return this.$watch(c,function(){q?(q=!1,b(e,e,d)):b(e,h,d);if(k)if(S(e))if(db(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)Qc.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var d,f,g,h,l=this.$$asyncQueue,m=this.$$postDigestQueue,u,q,r=b,N,T=[],O=[],D,C,E;n("$digest");c=null;do{q=!1;for(N=this;l.length;){try{E=l.shift(),E.scope.$eval(E.expression)}catch(J){k.$$phase=null,e(J)}c=null}a:do{if(h=N.$$watchers)for(u=h.length;u--;)try{if(d=h[u])if((f=
+d.get(N))!==(g=d.last)&&!(d.eq?Aa(f,g):"number"===typeof f&&"number"===typeof g&&isNaN(f)&&isNaN(g)))q=!0,c=d,d.last=d.eq?za(f,null):f,d.fn(f,g===p?f:g,N),5>r&&(D=4-r,T[D]||(T[D]=[]),C=P(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,C+="; newVal: "+sa(f)+"; oldVal: "+sa(g),T[D].push(C)),d.get.$$unwatch&&O.push({watch:d,array:h});else if(d===c){q=!1;break a}}catch(v){k.$$phase=null,e(v)}if(!(u=N.$$childHead||N!==this&&N.$$nextSibling))for(;N!==this&&!(u=N.$$nextSibling);)N=N.$parent}while(N=u);
+if((q||l.length)&&!r--)throw k.$$phase=null,a("infdig",b,sa(T));}while(q||l.length);for(k.$$phase=null;m.length;)try{m.shift()()}catch(z){e(z)}for(u=O.length-1;0<=u;--u)d=O[u],d.watch.get.$$unwatch&&Ga(d.array,d.watch)},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this!==k&&(q(this.$$listenerCount,Ab(null,m,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&
+(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=A,this.$on=this.$watch=this.$watchGroup=function(){return A})}},$eval:function(a,b){return f(a)(this,b)},$evalAsync:function(a){k.$$phase||k.$$asyncQueue.length||
+g.defer(function(){k.$$asyncQueue.length&&k.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return n("$apply"),this.$eval(a)}catch(b){e(b)}finally{k.$$phase=null;try{k.$digest()}catch(c){throw e(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[Pa(c,
+b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(la.call(arguments,1)),l,n;do{d=f.$$listeners[a]||c;h.currentScope=f;l=0;for(n=d.length;l<n;l++)if(d[l])try{d[l].apply(null,k)}catch(m){e(m)}else d.splice(l,1),l--,n--;if(g)return h.currentScope=null,h;f=f.$parent}while(f);h.currentScope=null;return h},$broadcast:function(a,b){for(var c=this,d=this,
+f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(la.call(arguments,1)),h,k;c=d;){f.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){e(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}f.currentScope=null;return f}};var k=new h;return k}]}function wd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,
+a=/^\s*(https?|ftp|file|blob):|data:image\//;this.aHrefSanitizationWhitelist=function(a){return E(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return E(b)?(a=b,this):a};this.$get=function(){return function(c,d){var e=d?a:b,f;if(!W||8<=W)if(f=va(c).href,""!==f&&!f.match(e))return"unsafe:"+f;return c}}}function $e(b){if("self"===b)return b;if(v(b)){if(-1<b.indexOf("***"))throw wa("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",
+".*").replace("\\*","[^:/.?&;]*");return RegExp("^"+b+"$")}if(fb(b))return RegExp("^"+b.source+"$");throw wa("imatcher");}function Rc(b){var a=[];E(b)&&q(b,function(b){a.push($e(b))});return a}function xe(){this.SCE_CONTEXTS=ga;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=Rc(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=Rc(b));return a};this.$get=["$injector",function(c){function d(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};
+a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var e=function(a){throw wa("unsafe");};c.has("$sanitize")&&(e=c.get("$sanitize"));var f=d(),g={};g[ga.HTML]=d(f);g[ga.CSS]=d(f);g[ga.URL]=d(f);g[ga.JS]=d(f);g[ga.RESOURCE_URL]=d(g[ga.URL]);return{trustAs:function(a,b){var c=g.hasOwnProperty(a)?g[a]:null;if(!c)throw wa("icontext",a,b);if(null===b||b===r||""===b)return b;if("string"!==
+typeof b)throw wa("itype",a);return new c(b)},getTrusted:function(c,d){if(null===d||d===r||""===d)return d;var f=g.hasOwnProperty(c)?g[c]:null;if(f&&d instanceof f)return d.$$unwrapTrustedValue();if(c===ga.RESOURCE_URL){var f=va(d.toString()),m,p,k=!1;m=0;for(p=b.length;m<p;m++)if("self"===b[m]?Lb(f):b[m].exec(f.href)){k=!0;break}if(k)for(m=0,p=a.length;m<p;m++)if("self"===a[m]?Lb(f):a[m].exec(f.href)){k=!1;break}if(k)return d;throw wa("insecurl",d.toString());}if(c===ga.HTML)return e(d);throw wa("unsafe");
+},valueOf:function(a){return a instanceof f?a.$$unwrapTrustedValue():a}}}]}function we(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw wa("iequirks");var e=ka(ga);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Ea);e.parseAs=function(b,c){var d=a(c);return d.literal&&
+d.constant?d:function k(a,c){var f=e.getTrusted(b,d(a,c));k.$$unwatch=d.$$unwatch;return f}};var f=e.parseAs,g=e.getTrusted,h=e.trustAs;q(ga,function(a,b){var c=K(b);e[Ua("parse_as_"+c)]=function(b){return f(a,b)};e[Ua("get_trusted_"+c)]=function(b){return g(a,b)};e[Ua("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function ye(){this.$get=["$window","$document",function(b,a){var c={},d=Y((/android (\d+)/.exec(K((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),
+f=a[0]||{},g=f.documentMode,h,n=/^(Moz|webkit|O|ms)(?=[A-Z])/,l=f.body&&f.body.style,m=!1,p=!1;if(l){for(var k in l)if(m=n.exec(k)){h=m[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");m=!!("transition"in l||h+"Transition"in l);p=!!("animation"in l||h+"Animation"in l);!d||m&&p||(m=v(f.body.style.webkitTransition),p=v(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||7<g),hasEvent:function(a){if("input"==
+a&&9==W)return!1;if(w(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:$b(),vendorPrefix:h,transitions:m,animations:p,android:d,msie:W,msieDocumentMode:g}}]}function Ae(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,n,l){var m=E(l)&&!l,p=(m?d:c).defer(),k=p.promise;n=a.defer(function(){try{p.resolve(f())}catch(a){p.reject(a),e(a)}finally{delete g[k.$$timeoutId]}m||b.$apply()},n);k.$$timeoutId=n;g[n]=p;return k}var g={};f.cancel=
+function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function va(b,a){var c=b;W&&(ba.setAttribute("href",c),c=ba.href);ba.setAttribute("href",c);return{href:ba.href,protocol:ba.protocol?ba.protocol.replace(/:$/,""):"",host:ba.host,search:ba.search?ba.search.replace(/^\?/,""):"",hash:ba.hash?ba.hash.replace(/^#/,""):"",hostname:ba.hostname,port:ba.port,pathname:"/"===ba.pathname.charAt(0)?ba.pathname:"/"+
+ba.pathname}}function Lb(b){b=v(b)?va(b):b;return b.protocol===Sc.protocol&&b.host===Sc.host}function Be(){this.$get=da(M)}function nc(b){function a(d,e){if(S(d)){var f={};q(d,function(b,c){f[c]=a(c,b)});return f}return b.factory(d+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Tc);a("date",Uc);a("filter",af);a("json",bf);a("limitTo",cf);a("lowercase",df);a("number",Vc);a("orderBy",Wc);a("uppercase",ef)}function af(){return function(b,
+a,c){if(!L(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;b<e.length;b++)if(!e[b](a))return!1;return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return Ra.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Qc.call(a,d)&&c(a[d],b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,
+b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a={$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var h=
+b[g];e.check(h)&&d.push(h)}return d}}function Tc(b){var a=b.NUMBER_FORMATS;return function(b,d){w(d)&&(d=a.CURRENCY_SYM);return Xc(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\u00A4/g,d)}}function Vc(b){var a=b.NUMBER_FORMATS;return function(b,d){return Xc(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function Xc(b,a,c,d,e){if(null==b||!isFinite(b)||S(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",h="",n=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&
+m[3]>e+1?(g="0",b=0):(h=g,l=!0)}if(l)0<e&&(-1<b&&1>b)&&(h=b.toFixed(e));else{g=(g.split(Yc)[1]||"").length;w(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);b=(""+b).split(Yc);g=b[0];b=b[1]||"";var m=0,p=a.lgSize,k=a.gSize;if(g.length>=p+k)for(m=g.length-p,l=0;l<m;l++)0===(m-l)%k&&0!==l&&(h+=c),h+=g.charAt(l);for(l=m;l<g.length;l++)0===(g.length-l)%p&&0!==l&&(h+=c),h+=g.charAt(l);for(;b.length<e;)b+="0";e&&"0"!==e&&(h+=d+b.substr(0,e))}n.push(f?
+a.negPre:a.posPre);n.push(h);n.push(f?a.negSuf:a.posSuf);return n.join("")}function tb(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function ca(b,a,c,d){c=c||0;return function(e){e=e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return tb(e,a,d)}}function ub(b,a){return function(c,d){var e=c["get"+b](),f=ib(a?"SHORT"+b:b);return d[f][e]}}function Zc(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function $c(b){return function(a){var c=
+Zc(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return tb(a,b)}}function Uc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,n=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Y(b[9]+b[10]),g=Y(b[9]+b[11]));h.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));f=Y(b[4]||0)-f;g=Y(b[5]||0)-g;h=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));n.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+return function(c,e){var f="",g=[],h,n;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;v(c)&&(c=ff.test(c)?Y(c):a(c));Fa(c)&&(c=new Date(c));if(!ra(c))return c;for(;e;)(n=gf.exec(e))?(g=g.concat(la.call(n,1)),e=g.pop()):(g.push(e),e=null);q(g,function(a){h=hf[a];f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function bf(){return function(b){return sa(b,!0)}}function cf(){return function(b,a){if(!L(b)&&!v(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):Y(a);
+if(v(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function Wc(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?("string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!L(a)||!c)return a;c=L(c)?c:[c];c=md(c,function(a){var c=!1,d=a||Ea;if(v(a)){if("+"==
+a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);d=b(a);if(d.constant){var g=d();return e(function(a,b){return f(a[g],b[g])},c)}}return e(function(a,b){return f(d(a),d(b))},c)});for(var g=[],h=0;h<a.length;h++)g.push(a[h]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function xa(b){P(b)&&(b={link:b});b.restrict=b.restrict||"AC";return da(b)}function ad(b,a,c,d){function e(a,c){c=c?"-"+hb(c,"-"):"";d.removeClass(b,(a?vb:
+wb)+c);d.addClass(b,(a?wb:vb)+c)}var f=this,g=b.parent().controller("form")||xb,h=0,n=f.$error={},l=[];f.$name=a.name||a.ngForm;f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;g.$addControl(f);b.addClass(Na);e(!0);f.$commitViewValue=function(){q(l,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ca(a.$name,"input");l.push(a);a.$name&&(f[a.$name]=a)};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];q(n,function(b,c){f.$setValidity(c,!0,a)});Ga(l,a)};f.$setValidity=
+function(a,b,c){var d=n[a];if(b)d&&(Ga(d,c),d.length||(h--,h||(e(b),f.$valid=!0,f.$invalid=!1),n[a]=!1,e(!0,a),g.$setValidity(a,!0,f)));else{h||e(b);if(d){if(-1!=Pa(d,c))return}else n[a]=d=[],h++,e(!1,a),g.$setValidity(a,!1,f);d.push(c);f.$valid=!1;f.$invalid=!0}};f.$setDirty=function(){d.removeClass(b,Na);d.addClass(b,yb);f.$dirty=!0;f.$pristine=!1;g.$setDirty()};f.$setPristine=function(){d.removeClass(b,yb);d.addClass(b,Na);f.$dirty=!1;f.$pristine=!0;q(l,function(a){a.$setPristine()})}}function Tb(b,
+a,c,d){b.$setValidity(a,c);return c?d:r}function bd(b,a){var c,d;if(a)for(c=0;c<a.length;++c)if(d=a[c],b[d])return!0;return!1}function jf(b,a,c,d,e){S(e)&&(b.$$hasNativeValidators=!0,b.$parsers.push(function(f){if(b.$error[a]||bd(e,d)||!bd(e,c))return f;b.$setValidity(a,!1)}))}function ab(b,a,c,d,e,f){var g=a.prop(kf),h=a[0].placeholder,n={};d.$$validityState=g;if(!e.android){var l=!1;a.on("compositionstart",function(a){l=!0});a.on("compositionend",function(){l=!1;m()})}var m=function(e){if(!l){var f=
+a.val(),k=e&&e.type;if(W&&"input"===(e||n).type&&a[0].placeholder!==h)h=a[0].placeholder;else{c.ngTrim&&"false"===c.ngTrim||(f=aa(f));var m=g&&d.$$hasNativeValidators;if(d.$viewValue!==f||""===f&&m)b.$$phase?d.$setViewValue(f,k,m):b.$apply(function(){d.$setViewValue(f,k,m)})}}};if(e.hasEvent("input"))a.on("input",m);else{var p,k=function(a){p||(p=f.defer(function(){m(a);p=null}))};a.on("keydown",function(a){var b=a.keyCode;91===b||(15<b&&19>b||37<=b&&40>=b)||k(a)});if(e.hasEvent("paste"))a.on("paste cut",
+k)}a.on("change",m);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}}function zb(b,a){return function(c){var d;return ra(c)?c:v(c)&&(b.lastIndex=0,c=b.exec(c))?(c.shift(),d={yyyy:0,MM:1,dd:1,HH:0,mm:0},q(c,function(b,c){c<a.length&&(d[a[c]]=+b)}),new Date(d.yyyy,d.MM-1,d.dd,d.HH,d.mm)):NaN}}function bb(b,a,c,d){return function(e,f,g,h,n,l,m){ab(e,f,g,h,n,l);h.$parsers.push(function(d){if(h.$isEmpty(d))return h.$setValidity(b,!0),null;if(a.test(d))return h.$setValidity(b,!0),c(d);
+h.$setValidity(b,!1);return r});h.$formatters.push(function(a){return ra(a)?m("date")(a,d):""});g.min&&(e=function(a){var b=h.$isEmpty(a)||c(a)>=c(g.min);h.$setValidity("min",b);return b?a:r},h.$parsers.push(e),h.$formatters.push(e));g.max&&(e=function(a){var b=h.$isEmpty(a)||c(a)<=c(g.max);h.$setValidity("max",b);return b?a:r},h.$parsers.push(e),h.$formatters.push(e))}}function Ub(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],
+m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!L(a)){if(v(a))return a.split(" ");if(S(a)){var b=[];q(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,h){function n(a,b){var c=g.data("$classCounts")||{},d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var k=e(b||[]);if(!m){var l=n(k,1);h.$addClass(l)}else if(!Aa(b,
+m)){var q=e(m),l=d(k,q),k=d(q,k),k=n(k,-1),l=n(l,1);0===l.length?c.removeClass(g,k):0===k.length?c.addClass(g,l):c.setClass(g,l,k)}}m=ka(b)}var m;f.$watch(h[b],l,!0);h.$observe("class",function(a){l(f.$eval(h[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=e(f.$eval(h[b]));g===a?(g=n(l,1),h.$addClass(g)):(g=n(l,-1),h.$removeClass(g))}})}}}]}var lf=/^\/(.+)\/([a-z]*)$/,kf="validity",K=function(b){return v(b)?b.toLowerCase():b},Qc=Object.prototype.hasOwnProperty,
+ib=function(b){return v(b)?b.toUpperCase():b},W,D,ta,la=[].slice,sc=[].push,ya=Object.prototype.toString,Qa=G("ng"),Ra=M.angular||(M.angular={}),Ta,na,eb=0;W=Y((/msie (\d+)/.exec(K(navigator.userAgent))||[])[1]);isNaN(W)&&(W=Y((/trident\/.*; rv:(\d+)/.exec(K(navigator.userAgent))||[])[1]));A.$inject=[];Ea.$inject=[];var L=function(){return P(Array.isArray)?Array.isArray:function(b){return"[object Array]"===ya.call(b)}}(),aa=function(){return String.prototype.trim?function(b){return v(b)?b.trim():
+b}:function(b){return v(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();na=9>W?function(b){b=b.nodeName?b:b[0];return K(b.scopeName&&"HTML"!=b.scopeName?b.scopeName+":"+b.nodeName:b.nodeName)}:function(b){return K(b.nodeName?b.nodeName:b[0].nodeName)};var dc=["ng-","data-ng-","ng:","x-ng-"],qd=/[A-Z]/g,ud={full:"1.3.0-beta.14",major:1,minor:3,dot:0,codeName:"harmonious-cacophonies"};Q.expando="ng339";var Wa=Q.cache={},Ke=1,qb=M.document.addEventListener?function(b,a,c){b.addEventListener(a,c,
+!1)}:function(b,a,c){b.attachEvent("on"+a,c)},Va=M.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};Q._data=function(b){return this.cache[b[this.expando]]||{}};var Ee=/([\:\-\_]+(.))/g,Fe=/^moz([A-Z])/,Gb=G("jqLite"),Je=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Fb=/<|&#?\w+;/,He=/<([\w:]+)/,Ie=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,fa={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>",
+"</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};fa.optgroup=fa.option;fa.tbody=fa.tfoot=fa.colgroup=fa.caption=fa.thead;fa.th=fa.td;var Ha=Q.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===U.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),Q(M).on("load",a))},toString:function(){var b=[];q(this,function(a){b.push(""+a)});return"["+b.join(", ")+
+"]"},eq:function(b){return 0<=b?D(this[b]):D(this[this.length+b])},length:0,push:sc,sort:[].sort,splice:[].splice},nb={};q("multiple selected checked disabled readOnly required open".split(" "),function(b){nb[K(b)]=b});var wc={};q("input select option textarea button form details".split(" "),function(b){wc[b]=!0});var xc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngPattern:"pattern"};q({data:rc,inheritedData:mb,scope:function(b){return D(b).data("$scope")||mb(b.parentNode||b,["$isolateScope",
+"$scope"])},isolateScope:function(b){return D(b).data("$isolateScope")||D(b).data("$isolateScopeNoTemplate")},controller:tc,injector:function(b){return mb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ib,css:function(b,a,c){a=Ua(a);if(E(c))b.style[a]=c;else{var d;8>=W&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=W&&(d=""===d?r:d);return d}},attr:function(b,a,c){var d=K(a);if(nb[d])if(E(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));
+else return b[a]||(b.attributes.getNamedItem(a)||A).specified?d:r;else if(E(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?r:b},prop:function(b,a,c){if(E(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(w(b)){var d=a.nodeType;return 1===d||3===d?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(w(a)){if(b.multiple&&"select"===na(b)){var c=[];q(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?
+null:c}return b.value}b.value=a},html:function(b,a){if(w(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)Ia(d[c]);b.innerHTML=a},empty:uc},function(b,a){Q.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==uc&&(2==b.length&&b!==Ib&&b!==tc?a:d)===r){if(S(a)){for(e=0;e<g;e++)if(b===rc)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;g=e===r?Math.min(g,1):g;for(f=0;f<g;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});q({removeData:pc,
+dealoc:Ia,on:function a(c,d,e,f){if(E(f))throw Gb("onargs");if(!c.nodeType||1===c.nodeType||9===c.nodeType){var g=ma(c,"events"),h=ma(c,"handle");g||ma(c,"events",g={});h||ma(c,"handle",h=Me(c,g));q(d.split(" "),function(d){var f=g[d];if(!f){if("mouseenter"==d||"mouseleave"==d){var m=U.body.contains||U.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!!(e&&1===e.nodeType&&(d.contains?d.contains(e):a.compareDocumentPosition&&a.compareDocumentPosition(e)&
+16))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[];a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===this||m(this,c))||h(a,d)})}else qb(c,d,h),g[d]=[];f=g[d]}f.push(e)})}},off:qc,one:function(a,c,d){a=D(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;Ia(a);q(new Q(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=
+[];q(a.childNodes,function(a){1===a.nodeType&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){q(new Q(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;q(new Q(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){Ia(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,
+c){var d=a,e=a.parentNode;q(new Q(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},addClass:lb,removeClass:kb,toggleClass:function(a,c,d){c&&q(c.split(" "),function(c){var f=d;w(f)&&(f=!Ib(a,c));(f?lb:kb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},
+clone:Hb,triggerHandler:function(a,c,d){c=(ma(a,"events")||{})[c];d=d||[];var e=[{preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopPropagation:A}];q(c,function(c){c.apply(a,e.concat(d))})}},function(a,c){Q.prototype[c]=function(c,e,f){for(var g,h=0;h<this.length;h++)w(g)?(g=a(this[h],c,e,f),E(g)&&(g=D(g))):oc(g,a(this[h],c,e,f));return E(g)?g:this};Q.prototype.bind=Q.prototype.on;Q.prototype.unbind=Q.prototype.off});Xa.prototype=
+{put:function(a,c){this[Ja(a,this.nextUid)]=c},get:function(a){return this[Ja(a,this.nextUid)]},remove:function(a){var c=this[a=Ja(a,this.nextUid)];delete this[a];return c}};var zc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Oe=/,/,Pe=/^\s*(_?)(\S+?)\1\s*$/,yc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ka=G("$injector");Cb.$$annotate=Jb;var mf=G("$animate"),ge=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw mf("notcsel",c);this.$$selectors[c.substr(1)]=
+e;a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$timeout","$$asyncCallback",function(a,d){return{enter:function(a,c,g,h){g?g.after(a):c.prepend(a);h&&d(h)},leave:function(a,c){a.remove();c&&d(c)},move:function(a,c,d,h){this.enter(a,c,d,h)},addClass:function(a,c,g){c=v(c)?c:L(c)?c.join(" "):"";q(a,function(a){lb(a,c)});g&&d(g)},removeClass:function(a,c,g){c=v(c)?c:L(c)?c.join(" "):
+"";q(a,function(a){kb(a,c)});g&&d(g)},setClass:function(a,c,g,h){q(a,function(a){lb(a,c);kb(a,g)});h&&d(h)},enabled:A}}]}],ia=G("$compile");gc.$inject=["$provide","$$sanitizeUriProvider"];var Ue=/^(x[\:\-_]|data[\:\-_])/i,Ic=G("$interpolate"),nf=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,Xe={http:80,https:443,ftp:21},Ob=G("$location");Qb.prototype=Pb.prototype=Lc.prototype={$$html5:!1,$$replace:!1,absUrl:rb("$$absUrl"),url:function(a,c){if(w(a))return this.$$url;var d=nf.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));
+(d[2]||d[1])&&this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:rb("$$protocol"),host:rb("$$host"),port:rb("$$port"),path:Mc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(v(a))this.$$search=cc(a);else if(S(a))this.$$search=a;else throw Ob("isrcharg");break;default:w(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Mc("$$hash",Ea),replace:function(){this.$$replace=
+!0;return this}};var ja=G("$parse"),of=Function.prototype.call,pf=Function.prototype.apply,qf=Function.prototype.bind,cb={"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:A,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return E(d)?E(e)?d+e:d:E(e)?e:r},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(E(d)?d:0)-(E(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,
+c,d,e){return d(a,c)^e(a,c)},"=":A,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,
+c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},rf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Sb=function(a){this.options=a};Sb.prototype={constructor:Sb,lex:function(a){this.text=a;this.index=0;this.ch=r;for(this.tokens=[];this.index<this.text.length;)if(this.ch=this.text.charAt(this.index),this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent();
+else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else if(this.isWhitespace(this.ch))this.index++;else{a=this.ch+this.peek();var c=a+this.peek(2),d=cb[this.ch],e=cb[a],f=cb[c];f?(this.tokens.push({index:this.index,text:c,fn:f}),this.index+=3):e?(this.tokens.push({index:this.index,text:a,fn:e}),this.index+=2):d?(this.tokens.push({index:this.index,text:this.ch,fn:d}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},
+is:function(a){return-1!==a.indexOf(this.ch)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=E(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,
+d)+"]":" "+d;throw ja("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=K(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,
+text:a,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a=this,c="",d=this.index,e,f,g,h;this.index<this.text.length;){h=this.text.charAt(this.index);if("."===h||this.isIdent(h)||this.isNumber(h))"."===h&&(e=this.index),c+=h;else break;this.index++}if(e)for(f=this.index;f<this.text.length;){h=this.text.charAt(f);if("("===h){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(h))f++;else break}d={index:d,text:c};if(cb.hasOwnProperty(c))d.fn=cb[c],d.constant=
+!0;else{var n=Oc(c,this.options,this.text);d.fn=z(function(a,c){return n(a,c)},{assign:function(d,e){return sb(d,c,e,a.text)}})}this.tokens.push(d);g&&(this.tokens.push({index:e,text:"."}),this.tokens.push({index:e+1,text:g}))},readString:function(a){var c=this.index;this.index++;for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(g=this.text.substring(this.index+1,this.index+5),g.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+
+g+"]"),this.index+=4,d+=String.fromCharCode(parseInt(g,16))):d=(f=rf[g])?d+f:d+g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,string:d,constant:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};var $a=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};$a.ZERO=z(function(){return 0},{constant:!0});$a.prototype={constructor:$a,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();
+0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.constant&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,
+d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw ja("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw ja("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},expect:function(a,c,d,e){return(a=
+this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return z(function(d,e){return a(d,e,c)},{constant:c.constant})},ternaryFn:function(a,c,d){return z(function(e,f){return a(e,f)?c(e,f):d(e,f)},{constant:a.constant&&c.constant&&d.constant})},binaryFn:function(a,c,d){return z(function(e,f){return c(e,f,a,d)},{constant:a.constant&&d.constant})},statements:function(){for(var a=[];;)if(0<
+this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0;f<a.length;f++){var g=a[f];g&&(e=g(c,d))}return e}},filterChain:function(){for(var a=this.expression(),c;;)if(c=this.expect("|"))a=this.binaryFn(a,c.fn,this.filter());else return a},filter:function(){for(var a=this.expect(),c=this.$filter(a.text),d=[];this.expect(":");)d.push(this.expression());return da(function(a,f,g){g=[g];for(var h=0;h<d.length;h++)g.push(d[h](a,
+f));return c.apply(a,g)})},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),function(d,f){return a.assign(d,c(d,f),f)}):a},ternary:function(){var a=this.logicalOR(),c,d;if(this.expect("?")){c=this.ternary();if(d=this.expect(":"))return this.ternaryFn(a,c,this.ternary());this.throwError("expected :",
+d)}else return a},logicalOR:function(){for(var a=this.logicalAND(),c;;)if(c=this.expect("||"))a=this.binaryFn(a,c.fn,this.logicalAND());else return a},logicalAND:function(){var a=this.equality(),c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND());return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,
+c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn($a.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=
+this,d=this.expect().text,e=Oc(d,this.options,this.text);return z(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){return sb(a(e,h),d,g,c.text)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return z(function(e,f){var g=a(e,f),h=d(e,f);ea(h,c.text);return g?Ma(g[h],c.text):r},{assign:function(e,f,g){var h=d(e,g);return Ma(a(e,g),c.text)[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))
+}this.consume(")");var e=this;return function(f,g){for(var h=[],n=c?c(f,g):f,l=0;l<d.length;l++)h.push(d[l](f,g));l=a(f,g,n)||A;Ma(n,e.text);var m=e.text;if(l){if(l.constructor===l)throw ja("isecfn",m);if(l===of||l===pf||l===qf)throw ja("isecff",m);}h=l.apply?l.apply(n,h):l(h[0],h[1],h[2],h[3],h[4]);return Ma(h,e.text)}},arrayDeclaration:function(){var a=[],c=!0;if("]"!==this.peekToken().text){do{if(this.peek("]"))break;var d=this.expression();a.push(d);d.constant||(c=!1)}while(this.expect(","))}this.consume("]");
+return z(function(c,d){for(var g=[],h=0;h<a.length;h++)g.push(a[h](c,d));return g},{literal:!0,constant:c})},object:function(){var a=[],c=!0;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect(),d=d.string||d.text;this.consume(":");var e=this.expression();a.push({key:d,value:e});e.constant||(c=!1)}while(this.expect(","))}this.consume("}");return z(function(c,d){for(var e={},n=0;n<a.length;n++){var l=a[n];e[l.key]=l.value(c,d)}return e},{literal:!0,constant:c})}};var Rb={},
+wa=G("$sce"),ga={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ba=U.createElement("a"),Sc=va(M.location.href,!0);nc.$inject=["$provide"];Tc.$inject=["$locale"];Vc.$inject=["$locale"];var Yc=".",hf={yyyy:ca("FullYear",4),yy:ca("FullYear",2,0,!0),y:ca("FullYear",1),MMMM:ub("Month"),MMM:ub("Month",!0),MM:ca("Month",2,1),M:ca("Month",1,1),dd:ca("Date",2),d:ca("Date",1),HH:ca("Hours",2),H:ca("Hours",1),hh:ca("Hours",2,-12),h:ca("Hours",1,-12),mm:ca("Minutes",2),m:ca("Minutes",1),
+ss:ca("Seconds",2),s:ca("Seconds",1),sss:ca("Milliseconds",3),EEEE:ub("Day"),EEE:ub("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(tb(Math[0<a?"floor":"ceil"](a/60),2)+tb(Math.abs(a%60),2))},ww:$c(2),w:$c(1)},gf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,ff=/^\-?\d+$/;Uc.$inject=["$locale"];var df=da(K),ef=da(ib);Wc.$inject=["$parse"];var xd=da({restrict:"E",compile:function(a,
+c){8>=W&&(c.href||c.name||c.$set("href",""),a.append(U.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===ya.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),jb={};q(nb,function(a,c){if("multiple"!=a){var d=pa("ng-"+c);jb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});q(xc,function(a,c){jb[c]=function(){return{priority:100,
+link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(lf))){f.$set("ngPattern",RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});q(["src","srcset","href"],function(a){var c=pa("ng-"+a);jb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===ya.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null);f.$observe(c,function(a){a&&(f.$set(h,a),W&&g&&e.prop(g,f[h]))})}}}});var xb=
+{$addControl:A,$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A};ad.$inject=["$element","$attrs","$scope","$animate"];var cd=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:ad,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(c){a.$apply(function(){g.$commitViewValue()});c.preventDefault?c.preventDefault():c.returnValue=!1};qb(e[0],"submit",h);e.on("$destroy",function(){c(function(){Va(e[0],"submit",h)},0,!1)})}var n=
+e.parent().controller("form"),l=f.name||f.ngForm;l&&sb(a,l,g,l);if(n)e.on("$destroy",function(){n.$removeControl(g);l&&sb(a,l,r,l);z(g,xb)})}}}}}]},yd=cd(),Ld=cd(!0),sf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,tf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,uf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,dd=/^(\d{4})-(\d{2})-(\d{2})$/,ed=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)$/,Vb=/^(\d{4})-W(\d\d)$/,fd=/^(\d{4})-(\d\d)$/,gd=/^(\d\d):(\d\d)$/,vf=
+/(\s+|^)default(\s+|$)/,hd={text:ab,date:bb("date",dd,zb(dd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":bb("datetimelocal",ed,zb(ed,["yyyy","MM","dd","HH","mm"]),"yyyy-MM-ddTHH:mm"),time:bb("time",gd,zb(gd,["HH","mm"]),"HH:mm"),week:bb("week",Vb,function(a){if(ra(a))return a;if(v(a)){Vb.lastIndex=0;var c=Vb.exec(a);if(c){a=+c[1];var d=+c[2],c=Zc(a),d=7*(d-1);return new Date(a,0,c.getDate()+d)}}return NaN},"yyyy-Www"),month:bb("month",fd,zb(fd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,
+e,f,g){ab(a,c,d,e,f,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||uf.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return r});jf(e,"number",wf,null,e.$$validityState);e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);return Tb(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return Tb(e,"max",e.$isEmpty(a)||
+a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return Tb(e,"number",e.$isEmpty(a)||Fa(a),a)})},url:function(a,c,d,e,f,g){ab(a,c,d,e,f,g);e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||sf.test(d)}},email:function(a,c,d,e,f,g){ab(a,c,d,e,f,g);e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||tf.test(d)}},radio:function(a,c,d,e){w(d.name)&&c.attr("name",++eb);c.on("click",function(f){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value,
+f&&f.type)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;v(f)||(f=!0);v(g)||(g=!1);c.on("click",function(d){a.$apply(function(){e.$setViewValue(c[0].checked,d&&d.type)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a===f});e.$parsers.push(function(a){return a?f:g})},hidden:A,button:A,submit:A,reset:A,file:A},wf=
+["badInput"],hc=["$browser","$sniffer","$filter",function(a,c,d){return{restrict:"E",require:["?ngModel"],link:function(e,f,g,h){h[0]&&(hd[K(g.type)]||hd.text)(e,f,g,h[0],c,a,d)}}}],wb="ng-valid",vb="ng-invalid",Na="ng-pristine",yb="ng-dirty",xf=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout",function(a,c,d,e,f,g,h){function n(a,c){c=c?"-"+hb(c,"-"):"";g.removeClass(e,(a?vb:wb)+c);g.addClass(e,(a?wb:vb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$validators=
+{};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var l=f(d.ngModel),m=l.assign,p=null,k=this;if(!m)throw G("ngModel")("nonassign",d.ngModel,ha(e));this.$render=A;this.$isEmpty=function(a){return w(a)||""===a||null===a||a!==a};var t=e.inheritedData("$formController")||xb,s=0,I=this.$error={};e.addClass(Na).addClass("ng-untouched");n(!0);this.$setValidity=function(a,
+c){I[a]!==!c&&(c?(I[a]&&s--,s||(n(!0),k.$valid=!0,k.$invalid=!1)):(n(!1),k.$invalid=!0,k.$valid=!1,s++),I[a]=!c,n(c,a),t.$setValidity(a,c,k))};this.$setPristine=function(){k.$dirty=!1;k.$pristine=!0;g.removeClass(e,yb);g.addClass(e,Na)};this.$setUntouched=function(){k.$touched=!1;k.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){k.$touched=!0;k.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){h.cancel(p);k.$viewValue=
+k.$$lastCommittedViewValue;k.$render()};this.$validate=function(){this.$$runValidators(k.$modelValue,k.$viewValue)};this.$$runValidators=function(a,c){q(k.$validators,function(d,e){k.$setValidity(e,d(a,c))})};this.$commitViewValue=function(d){var f=k.$viewValue;h.cancel(p);if(d||k.$$lastCommittedViewValue!==f){k.$$lastCommittedViewValue=f;k.$pristine&&(k.$dirty=!0,k.$pristine=!1,g.removeClass(e,Na),g.addClass(e,yb),t.$setDirty());var l=f;q(k.$parsers,function(a){l=a(l)});k.$modelValue===l||!w(k.$$invalidModelValue)&&
+k.$$invalidModelValue==l||(k.$$runValidators(l,f),k.$modelValue=k.$valid?l:r,k.$$invalidModelValue=k.$valid?r:l,m(a,k.$modelValue),q(k.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))}};this.$setViewValue=function(a,c,d){k.$viewValue=a;k.$options&&!k.$options.updateOnDefault||k.$$debounceViewValueCommit(c,d)};this.$$debounceViewValueCommit=function(a,c){var d=0,e=k.$options;e&&E(e.debounce)&&(e=e.debounce,Fa(e)?d=e:Fa(e[a])?d=e[a]:Fa(e["default"])&&(d=e["default"]));h.cancel(p);d?p=h(function(){k.$commitViewValue(c)},
+d):k.$commitViewValue(c)};a.$watch(function(){var c=l(a);if(k.$modelValue!==c&&(w(k.$$invalidModelValue)||k.$$invalidModelValue!=c)){for(var d=k.$formatters,e=d.length,f=c;e--;)f=d[e](f);k.$$runValidators(c,f);k.$modelValue=k.$valid?c:r;k.$$invalidModelValue=k.$valid?r:c;k.$viewValue!==f&&(k.$viewValue=k.$$lastCommittedViewValue=f,k.$render())}return c})}],$d=function(){return{require:["ngModel","^?form","^?ngModelOptions"],controller:xf,link:{pre:function(a,c,d,e){e[2]&&(e[0].$options=e[2].$options);
+var f=e[0],g=e[1]||xb;g.$addControl(f);a.$on("$destroy",function(){g.$removeControl(f)})},post:function(a,c,d,e){var f=e[0];if(f.$options&&f.$options.updateOn)c.on(f.$options.updateOn,function(c){a.$apply(function(){f.$$debounceViewValueCommit(c&&c.type)})});c.on("blur",function(c){a.$apply(function(){f.$setTouched()})})}}}},be=da({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),jc=function(){return{require:"?ngModel",link:function(a,c,d,e){e&&
+(d.required=!0,e.$validators.required=function(a,c){return!d.required||!e.$isEmpty(c)},d.$observe("required",function(){e.$validate()}))}}},ic=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){v(a)&&0<a.length&&(a=RegExp(a));if(a&&!a.test)throw G("ngPattern")("noregexp",g,a,ha(c));f=a||r;e.$validate()});e.$validators.pattern=function(a){return e.$isEmpty(a)||w(f)||f.test(a)}}}}},lc=function(){return{require:"?ngModel",
+link:function(a,c,d,e){if(e){var f=0;d.$observe("maxlength",function(a){f=Y(a)||0;e.$validate()});e.$validators.maxlength=function(a){return e.$isEmpty(a)||a.length<=f}}}}},kc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=Y(a)||0;e.$validate()});e.$validators.minlength=function(a){return e.$isEmpty(a)||a.length>=f}}}}},ae=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||
+",";e.$parsers.push(function(a){if(!w(a)){var c=[];a&&q(a.split(f),function(a){a&&c.push(aa(a))});return c}});e.$formatters.push(function(a){return L(a)?a.join(", "):r});e.$isEmpty=function(a){return!a||!a.length}}}},yf=/^(true|false|\d+)$/,ce=function(){return{priority:100,compile:function(a,c){return yf.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},de=function(){return{controller:["$scope","$attrs",function(a,
+c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==r?(this.$options.updateOnDefault=!1,this.$options.updateOn=aa(this.$options.updateOn.replace(vf,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Dd=xa({compile:function(a){a.addClass("ng-binding");return function(a,d,e){d.data("$binding",e.ngBind);a.$watch(e.ngBind,function(a){d.text(a==r?"":a)})}}}),Fd=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));
+d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],Ed=["$sce","$parse",function(a,c){return function(d,e,f){function g(){var a=h(d);g.$$unwatch=h.$$unwatch;return(a||"").toString()}e.addClass("ng-binding").data("$binding",f.ngBindHtml);var h=c(f.ngBindHtml);d.$watch(g,function(c){e.html(a.getTrustedHtml(h(d))||"")})}}],Gd=Ub("",!0),Id=Ub("Odd",0),Hd=Ub("Even",1),Jd=xa({compile:function(a,c){c.$set("ngCloak",r);a.removeClass("ng-cloak")}}),Kd=[function(){return{scope:!0,
+controller:"@",priority:500}}],mc={};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=pa("ng-"+a);mc[c]=["$parse",function(d){return{compile:function(e,f){var g=d(f[c]);return function(c,d){d.on(K(a),function(a){c.$apply(function(){g(c,{$event:a})})})}}}}]});var Nd=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,
+d,e,f,g){var h,n,l;c.$watch(e.ngIf,function(c){c?n||g(function(c,f){n=f;c[c.length++]=U.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(l&&(l.remove(),l=null),n&&(n.$destroy(),n=null),h&&(l=Eb(h.clone),a.leave(l,function(){l=null}),h=null))})}}}],Od=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ra.noop,compile:function(g,h){var n=h.ngInclude||h.src,l=h.onload||
+"",m=h.autoscroll;return function(g,h,q,s,I){var y=0,r,B,u,x=function(){B&&(B.remove(),B=null);r&&(r.$destroy(),r=null);u&&(e.leave(u,function(){B=null}),B=u,u=null)};g.$watch(f.parseAsResourceUrl(n),function(f){var n=function(){!E(m)||m&&!g.$eval(m)||d()},q=++y;f?(a.get(f,{cache:c}).success(function(a){if(q===y){var c=g.$new();s.template=a;a=I(c,function(a){x();e.enter(a,null,h,n)});r=c;u=a;r.$emit("$includeContentLoaded");g.$eval(l)}}).error(function(){q===y&&(x(),g.$emit("$includeContentError"))}),
+g.$emit("$includeContentRequested")):(x(),s.template=null)})}}}}],ee=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){d.html(f.template);a(d.contents())(c)}}}],Pd=xa({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Qd=xa({terminal:!0,priority:1E3}),Rd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var h=g.count,n=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=
+e.$eval(n)||{},p={},k=c.startSymbol(),t=c.endSymbol(),s=/^when(Minus)?(.+)$/;q(g,function(a,c){s.test(c)&&(m[K(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});q(m,function(a,e){p[e]=c(a.replace(d,k+h+"-"+l+t))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-l));return p[c](e)},function(a){f.text(a)})}}}],Sd=["$parse","$animate",function(a,c){var d=G("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,link:function(e,
+f,g,h,n){var l=g.ngRepeat,m=l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),p,k,t,s,r,y,F={$id:Ja};if(!m)throw d("iexp",l);g=m[1];h=m[2];(m=m[3])?(p=a(m),k=function(a,c,d){y&&(F[y]=a);F[r]=c;F.$index=d;return p(e,F)}):(t=function(a,c){return Ja(c)},s=function(a){return a});m=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!m)throw d("iidexp",g);r=m[3]||m[1];y=m[2];var B={};e.$watchCollection(h,function(a){var e,g,h=f[0],m,p={},F,C,E,J,v,z,w,A=[],R=function(a,
+c){a[r]=E;y&&(a[y]=C);a.$index=c;a.$first=0===c;a.$last=c===F-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};if(db(a))z=a,v=k||t;else{v=k||s;z=[];for(g in a)a.hasOwnProperty(g)&&"$"!=g.charAt(0)&&z.push(g);z.sort()}F=z.length;g=A.length=z.length;for(e=0;e<g;e++)if(C=a===z?e:z[e],E=a[C],J=v(C,E,e),Ca(J,"`track by` id"),B.hasOwnProperty(J))w=B[J],delete B[J],p[J]=w,A[e]=w;else{if(p.hasOwnProperty(J))throw q(A,function(a){a&&a.scope&&(B[a.id]=a)}),d("dupes",l,J);A[e]={id:J};p[J]=!1}for(m in B)B.hasOwnProperty(m)&&
+(w=B[m],g=Eb(w.clone),c.leave(g),q(g,function(a){a.$$NG_REMOVED=!0}),w.scope.$destroy());e=0;for(g=z.length;e<g;e++)if(C=a===z?e:z[e],E=a[C],w=A[e],A[e-1]&&(h=A[e-1].clone[A[e-1].clone.length-1]),w.scope){m=h;do m=m.nextSibling;while(m&&m.$$NG_REMOVED);w.clone[0]!=m&&c.move(Eb(w.clone),null,D(h));h=w.clone[w.clone.length-1];R(w.scope,e)}else n(function(a,d){w.scope=d;a[a.length++]=U.createComment(" end ngRepeat: "+l+" ");c.enter(a,null,D(h));h=a;w.clone=a;p[w.id]=w;R(w.scope,e)});B=p})}}}],Td=["$animate",
+function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide")})}}],Md=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide")})}}],Ud=xa(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&q(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),Vd=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=
+[],h=[],n=[],l=[];c.$watch(e.ngSwitch||e.on,function(d){var p,k;p=0;for(k=n.length;p<k;++p)n[p].remove();p=n.length=0;for(k=l.length;p<k;++p){var t=h[p];l[p].$destroy();n[p]=t;a.leave(t,function(){n.splice(p,1)})}h.length=0;l.length=0;if(g=f.cases["!"+d]||f.cases["?"])c.$eval(e.change),q(g,function(d){var e=c.$new();l.push(e);d.transclude(e,function(c){var e=d.element;h.push(c);a.enter(c,e.parent(),e)})})})}}}],Wd=xa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["!"+
+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),Xd=xa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),Zd=xa({link:function(a,c,d,e,f){if(!f)throw G("ngTransclude")("orphan",ha(c));f(function(a){c.empty();c.append(a)})}}),zd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&
+a.put(d.id,c[0].text)}}}],zf=G("ngOptions"),Yd=da({terminal:!0}),Ad=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:A};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var n=this,l={},m=e,p;n.databound=d.ngModel;n.init=function(a,c,
+d){m=a;p=d};n.addOption=function(c){Ca(c,'"option value"');l[c]=!0;m.$viewValue==c&&(a.val(c),p.parent()&&p.remove())};n.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))};n.renderUnknownOption=function(c){c="? "+Ja(c)+" ?";p.val(c);a.prepend(p);a.val(c);p.prop("selected",!0)};n.hasOption=function(a){return l.hasOwnProperty(a)};c.$on("$destroy",function(){n.renderUnknownOption=A})}],link:function(e,g,h,n){function l(a,c,d,e){d.$render=function(){var a=
+d.$viewValue;e.hasOption(a)?(u.parent()&&u.remove(),c.val(a),""===a&&y.prop("selected",!0)):w(a)&&y?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){u.parent()&&u.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new Xa(d.$viewValue);q(c.find("option"),function(c){c.selected=E(a.get(c.value))})};a.$watch(function(){Aa(e,d.$viewValue)||(e=ka(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=[];q(c.find("option"),
+function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function p(e,f,g){function h(){var a={"":[]},c=[""],d,k,r,s,w;s=g.$modelValue;w=y(e)||[];var C=n?Wb(w):w,D,v,A;v={};r=!1;var G,K;if(t)if(u&&L(s))for(r=new Xa([]),A=0;A<s.length;A++)v[m]=s[A],r.put(u(e,v),s[A]);else r=new Xa(s);for(A=0;D=C.length,A<D;A++){k=A;if(n){k=C[A];if("$"===k.charAt(0))continue;v[n]=k}v[m]=w[k];d=p(e,v)||"";(k=a[d])||(k=a[d]=[],c.push(d));t?d=E(r.remove(u?u(e,v):q(e,v))):(u?(d={},d[m]=s,d=u(e,d)===u(e,v)):d=s===
+q(e,v),r=r||d);G=l(e,v);G=E(G)?G:"";k.push({id:u?u(e,v):n?C[A]:A,label:G,selected:d})}t||(z||null===s?a[""].unshift({id:"",label:"",selected:!r}):r||a[""].unshift({id:"?",label:"",selected:!0}));v=0;for(C=c.length;v<C;v++){d=c[v];k=a[d];x.length<=v?(s={element:B.clone().attr("label",d),label:k.label},w=[s],x.push(w),f.append(s.element)):(w=x[v],s=w[0],s.label!=d&&s.element.attr("label",s.label=d));G=null;A=0;for(D=k.length;A<D;A++)r=k[A],(d=w[A+1])?(G=d.element,d.label!==r.label&&G.text(d.label=r.label),
+d.id!==r.id&&G.val(d.id=r.id),d.selected!==r.selected&&G.prop("selected",d.selected=r.selected)):(""===r.id&&z?K=z:(K=F.clone()).val(r.id).prop("selected",r.selected).text(r.label),w.push({element:K,label:r.label,id:r.id,selected:r.selected}),G?G.after(K):s.element.append(K),G=K);for(A++;w.length>A;)w.pop().element.remove()}for(;x.length>v;)x.pop()[0].element.remove()}var k;if(!(k=s.match(d)))throw zf("iexp",s,ha(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],p=c(k[3]||""),q=c(k[2]?k[1]:m),y=c(k[7]),
+u=k[8]?c(k[8]):null,x=[[{element:f,label:""}]];z&&(a(z)(e),z.removeClass("ng-scope"),z.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=y(e)||[],d={},h,k,l,p,s,w,v;if(t)for(k=[],p=0,w=x.length;p<w;p++)for(a=x[p],l=1,s=a.length;l<s;l++){if((h=a[l].element)[0].selected){h=h.val();n&&(d[n]=h);if(u)for(v=0;v<c.length&&(d[m]=c[v],u(e,d)!=h);v++);else d[m]=c[h];k.push(q(e,d))}}else{h=f.val();if("?"==h)k=r;else if(""===h)k=null;else if(u)for(v=0;v<c.length;v++){if(d[m]=c[v],u(e,d)==
+h){k=q(e,d);break}}else d[m]=c[h],n&&(d[n]=h),k=q(e,d);1<x[0].length&&x[0][1].id!==h&&(x[0][1].selected=!1)}g.$setViewValue(k)})});g.$render=h;e.$watch(h)}if(n[1]){var k=n[0];n=n[1];var t=h.multiple,s=h.ngOptions,z=!1,y,F=D(U.createElement("option")),B=D(U.createElement("optgroup")),u=F.clone();h=0;for(var x=g.children(),v=x.length;h<v;h++)if(""===x[h].value){y=z=x.eq(h);break}k.init(n,z,u);t&&(n.$isEmpty=function(a){return!a||0===a.length});s?p(e,g,n):t?m(e,g,n):l(e,g,n,k)}}}}],Cd=["$interpolate",
+function(a){var c={addOption:A,removeOption:A};return{restrict:"E",priority:100,compile:function(d,e){if(w(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound?d.prop("selected",!1):m=c;f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a)}):m.addOption(e.value);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Bd=da({restrict:"E",
+terminal:!1});M.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(rd(),td(Ra),D(U).ready(function(){pd(U,ec)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-animate){display:none !important;}ng\\:form{display:block;}</style>');
+//# sourceMappingURL=angular.min.js.map
diff --git a/deployment-scripts/static/js/angular/angular.min.js.map b/deployment-scripts/static/js/angular/angular.min.js.map
new file mode 100644
index 0000000..f7d2105
--- /dev/null
+++ b/deployment-scripts/static/js/angular/angular.min.js.map
@@ -0,0 +1,8 @@
+{
+"version":3,
+"file":"angular.min.js",
+"lineCount":222,
+"mappings":"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",
+"sources":["angular.js"],
+"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","sortedKeys","keys","push","sort","forEachSorted","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","arguments","int","str","parseInt","inherit","parent","extra","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isElement","node","nodeName","prop","attr","find","makeMap","items","split","map","results","index","list","indexOf","array","arrayRemove","splice","copy","source","destination","stackSource","stackDest","$evalAsync","$watch","ngMinErr","result","Date","getTime","RegExp","emptyObject","Object","create","getPrototypeOf","shallowCopy","src","l","charAt","equals","o1","o2","t1","t2","keySet","csp","securityPolicy","isActive","querySelector","bind","self","fn","curryArgs","slice","startIndex","apply","concat","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","element","jqLite","clone","empty","e","elemHtml","append","html","TEXT_NODE","lowercase","match","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ii","ngAttrPrefixes","angularInit","bootstrap","elements","appElement","module","config","names","NG_APP_CLASS_REGEXP","name","getElementById","querySelectorAll","exec","className","attributes","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","createInjector","invoke","scope","compile","$apply","data","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","$$original","jQuery.cleanData","elems","elem","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockElements","nodes","startNode","endNode","nextSibling","setupModuleLoader","$injectorMinErr","$$minErr","factory","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","run","block","publishExternalAPI","version","uppercase","angularModule","$LocaleProvider","ngModule","$$SanitizeUriProvider","$CompileProvider","directive","htmlAnchorDirective","inputDirective","formDirective","scriptDirective","selectDirective","styleDirective","optionDirective","ngBindDirective","ngBindHtmlDirective","ngBindTemplateDirective","ngClassDirective","ngClassEvenDirective","ngClassOddDirective","ngCloakDirective","ngControllerDirective","ngFormDirective","ngHideDirective","ngIfDirective","ngIncludeDirective","ngInitDirective","ngNonBindableDirective","ngPluralizeDirective","ngRepeatDirective","ngShowDirective","ngStyleDirective","ngSwitchDirective","ngSwitchWhenDirective","ngSwitchDefaultDirective","ngOptionsDirective","ngTranscludeDirective","ngModelDirective","ngListDirective","ngChangeDirective","patternDirective","requiredDirective","minlengthDirective","maxlengthDirective","ngValueDirective","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$AnchorScrollProvider","$AnimateProvider","$BrowserProvider","$CacheFactoryProvider","$ControllerProvider","$DocumentProvider","$ExceptionHandlerProvider","$FilterProvider","$InterpolateProvider","$IntervalProvider","$HttpProvider","$HttpBackendProvider","$LocationProvider","$LogProvider","$ParseProvider","$RootScopeProvider","$QProvider","$$QProvider","$SceProvider","$SceDelegateProvider","$SnifferProvider","$TemplateCacheProvider","$TimeoutProvider","$WindowProvider","$$RAFProvider","$$AsyncCallbackProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","jqLiteRemoveData","children","childElement","jqLiteOff","type","unsupported","events","jqLiteExpandoStore","handle","eventHandler","removeEventListenerFn","expandoId","ng339","expandoStore","jqCache","$destroy","jqId","jqLiteData","isSetter","keyDefined","isSimpleGetter","jqLiteHasClass","selector","getAttribute","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","item","jqLiteController","jqLiteInheritedData","parentNode","host","jqLiteEmpty","removeChild","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","nodeName_","getAliasedAttrName","ALIASED_ATTR","createEventHandler","event","preventDefault","event.preventDefault","returnValue","stopPropagation","event.stopPropagation","cancelBubble","target","srcElement","defaultPrevented","prevent","isDefaultPrevented","event.isDefaultPrevented","eventHandlersCopy","msie","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","factoryFn","loadModules","moduleFn","runInvokeQueue","invokeArgs","get","loadedModules","_runBlocks","_invokeQueue","_configBlocks","message","stack","createInternalInjector","cache","getService","serviceName","INSTANTIATING","err","shift","locals","Type","Constructor","prototype","instance","returnedValue","has","service","$injector","constant","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","instanceInjector","servicename","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","$window","$location","$rootScope","getFirstAnchor","scroll","hash","elm","scrollIntoView","getElementsByName","scrollTo","autoScrollWatch","autoScrollWatchAction","$$rAF","$timeout","supported","Browser","$log","$sniffer","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","setTimeout","check","pollFns","pollFn","pollTimeout","fireUrlChange","newLocation","lastBrowserUrl","url","urlChangeListeners","listener","rawDocument","location","history","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","self.url","replaceState","pushState","urlChangeInit","onUrlChange","self.onUrlChange","hashchange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","escape","warn","cookieArray","unescape","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","$document","this.$get","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$cacheFactory","$$sanitizeUriProvider","hasDirectives","Suffix","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","$exceptionHandler","directives","priority","require","restrict","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","$interpolate","$http","$templateCache","$parse","$controller","$sce","$animate","$$sanitizeUri","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","safeAddClass","publicLinkFn","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","$linkNode","eq","$element","addClass","nodeList","$rootElement","childLinkFn","$node","childScope","nodeListLength","stableNodeList","Array","linkFns","nodeLinkFn","$new","childBoundTranscludeFn","transcludeOnThisElement","createBoundTranscludeFn","transclude","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","terminal","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","scopeCreated","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","isNgAttr","nAttrs","j","jj","attrStartName","attrEndName","specified","ngAttrName","NG_ATTR_BINDING","substr","directiveNName","nName","addAttrInterpolateDirective","addTextInterpolateDirective","byPriority","groupScan","attrStart","attrEnd","depth","hasAttribute","$compileMinErr","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","directiveName","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","optional","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","$$element","LOCAL_REGEXP","templateDirective","$$originalDirective","definition","scopeName","attrName","mode","lastValue","parentGet","parentSet","compare","$$isolateBindings","$observe","$$observers","$$scope","literal","a","b","assign","parentValueWatch","parentValue","$$unwatch","controllerDirectives","controllerInstance","controllerAs","$scope","scopeToChild","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","wrapTemplate","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","success","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","oldClasses","response","code","headers","delayedNodeLinkFn","ignoreChildLinkFn","rootElement","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","hasCompileParent","textInterpolateLinkFn","bindings","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","attrInterpolatePreLinkFn","$$inter","newValue","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","$addClass","classVal","$removeClass","removeClass","newClasses","toAdd","tokenDifference","toRemove","setClass","writeAttr","booleanKey","aliasedKey","observer","removeAttr","listeners","startSymbol","endSymbol","PREFIX_REGEXP","str1","str2","values","tokens1","tokens2","token","CNTRL_REG","register","this.register","expression","identifier","exception","cause","parseHeaders","line","headersGetter","headersObj","transformData","fns","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","defaults","d","interceptorFactories","interceptors","$httpBackend","$browser","$q","requestConfig","transformResponse","resp","status","reject","transformRequest","mergeHeaders","execHeaders","headerContent","headerFn","header","defHeaders","reqHeaders","defHeaderName","reqHeaderName","common","lowercaseDefHeaderName","chain","serverRequest","reqData","withCredentials","sendReq","then","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","promise.success","promise.error","done","headersString","statusText","resolvePromise","$$phase","deferred","resolve","removePendingReq","idx","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","xsrfCookieName","xsrfHeaderName","timeout","responseType","v","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","ActiveXObject","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","script","async","body","called","addEventListenerFn","ABORTED","timeoutRequest","jsonpDone","xhr","abort","completeRequest","urlResolve","protocol","counter","open","setRequestHeader","onreadystatechange","xhr.onreadystatechange","readyState","responseHeaders","getAllResponseHeaders","responseText","send","this.startSymbol","this.endSymbol","ch","mustHaveExpression","trustedContext","allOrNothing","endIndex","separators","expressions","parseFns","textLength","hasInterpolation","hasText","startSymbolLength","exp","endSymbolLength","escapedStartRegexp","escapedEndRegexp","$interpolateMinErr","compute","getValue","getTrusted","valueOf","interpolationFn","scopeId","$id","lastValues","lastResult","inputsChanged","$on","newErr","$interpolate.startSymbol","$interpolate.endSymbol","$$q","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","short","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","stripHash","stripFile","lastIndexOf","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$rewrite","this.$$rewrite","appUrl","prevAppUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","this.hashPrefix","prefix","this.html5Mode","afterLocationChange","oldUrl","$broadcast","absUrl","LocationMode","initialUrl","ctrlKey","metaKey","which","absHref","animVal","rewrittenUrl","newUrl","$digest","changeCounter","$locationWatch","currentReplace","$$replace","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","setter","setValue","fullExp","propertyObj","cspSafeGetterFn","key0","key1","key2","key3","key4","cspSafeGetter","pathVal","simpleGetterFn1","simpleGetterFn2","getterFn","getterFnCache","pathKeys","pathKeysLength","evaledFnGetter","Function","$parseOptions","$filter","oneTimeWrapper","oneTimeParseFn","stable","$$postDigestQueue","$$unwrapTrustedValue","parsedExpression","oneTime","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","defaultCallback","defaultErrback","pending","ref","createInternalRejectedPromise","progress","errback","progressback","wrappedCallback","wrappedErrback","wrappedProgressback","catch","finally","makePromise","resolved","handleCallback","isResolved","callbackOutput","promises","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","id","timer","TTL","$rootScopeMinErr","lastDirtyWatch","digestTtl","this.digestTtl","Scope","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$destroyed","$$asyncQueue","$$listeners","$$listenerCount","beginPhase","phase","compileToFn","decrementListenerCount","current","initWatchVal","isolate","child","$$childScopeClass","this.$$childScopeClass","watchExp","objectEquality","watcher","listenFn","watcher.fn","newVal","oldVal","deregisterWatch","$watchGroup","watchExpressions","watchGroupFn","changeCount","oldValues","newValues","deregisterFns","unwatchFlags","unwatchCount","expr","exprFn","deregisterWatchGroup","$watchCollection","$watchCollectionWatch","objGetter","newLength","internalArray","oldLength","changeDetected","internalObject","veryOldValue","trackVeryOldValue","initRun","$watchCollectionAction","watch","watchers","asyncQueue","postDigestQueue","dirty","ttl","watchLog","stableWatchesCandidates","logIdx","logMsg","asyncTask","$eval","isNaN","next","candidate","this.$watchGroup","$$postDigest","namedListeners","$emit","listenerArgs","array1","currentScope","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","generateHolderType","Base","holderType","trustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","maybeTrusted","allowed","enabled","this.enabled","$sceDelegate","msieDocumentMode","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","sceParseAsTrusted","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","documentMode","vendorPrefix","vendorRegex","bodyStyle","style","transitions","animations","webkitTransition","webkitAnimation","hasEvent","divElm","deferreds","$$timeoutId","timeout.cancel","base","urlParsingNode","requestUrl","originUrl","filters","filter","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","predicates.check","objKey","filtered","$locale","formats","NUMBER_FORMATS","amount","currencySymbol","CURRENCY_SYM","formatNumber","PATTERNS","GROUP_SEP","DECIMAL_SEP","number","fractionSize","pattern","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","fractionLen","min","minFrac","maxFrac","round","fraction","lgroup","lgSize","group","gSize","negPre","posPre","negSuf","posSuf","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","DATETIME_FORMATS","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","object","input","limit","Infinity","out","sortPredicate","reverseOrder","reverseComparator","comp","descending","v1","v2","predicate","arrayCopy","ngDirective","FormController","toggleValidCss","isValid","validationErrorKey","INVALID_CLASS","VALID_CLASS","form","parentForm","nullFormCtrl","invalidCount","errors","$error","controls","$name","ngForm","$dirty","$pristine","$valid","$invalid","$addControl","PRISTINE_CLASS","$commitViewValue","form.$commitViewValue","control","form.$addControl","$removeControl","form.$removeControl","validationToken","$setValidity","form.$setValidity","$setDirty","form.$setDirty","DIRTY_CLASS","$setPristine","form.$setPristine","validate","ctrl","validatorName","validity","testFlags","flags","addNativeHtml5Validators","badFlags","ignoreFlags","$$hasNativeValidators","$parsers","validator","textInputType","VALIDITY_STATE_PROPERTY","placeholder","noevent","$$validityState","composing","ev","ngTrim","revalidate","$viewValue","$setViewValue","deferListener","keyCode","$render","ctrl.$render","$isEmpty","createDateParser","mapping","iso","lastIndex","part","yyyy","MM","dd","HH","mm","NaN","createDateInputType","parseDate","dynamicDateInputType","$formatters","minValidator","valid","maxValidator","classDirective","arrayDifference","arrayClasses","classes","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","REGEX_STRING_REGEXP","String","addEventListener","attachEvent","removeEventListener","detachEvent","_data","JQLite._data","optgroup","option","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeAttribute","css","currentStyle","lowercasedName","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","onFn","eventFns","contains","compareDocumentPosition","adown","documentElement","bup","eventmap","related","relatedTarget","one","off","replaceNode","insertBefore","contentDocument","prepend","wrapNode","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","eventName","eventData","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","$$asyncCallback","enter","leave","move","add","PATH_MATCH","paramValue","CALL","APPLY","BIND","OPERATORS","null","true","false","+","-","*","/","%","^","===","!==","==","!=","<",">","<=",">=","&&","||","&","|","!","ESCAPE","lex","tokens","is","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","chars","isExpOperator","start","end","colStr","peekCh","ident","lastDot","peekIndex","methodName","quote","rawString","hex","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","msg","peekToken","e1","e2","e3","e4","t","unaryFn","right","ternaryFn","left","middle","binaryFn","statement","argsFn","fnInvoke","assignment","ternary","logicalOR","logicalAND","equality","relational","additive","multiplicative","unary","field","indexFn","o","safe","contextGetter","fnPtr","elementFns","allConstant","elementFn","keyValues","ampmGetter","getHours","AMPMS","timeZoneGetter","zone","getTimezoneOffset","paddedZone","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngPattern","ngAttrAliasWatchAction","formDirectiveFactory","isNgForm","formElement","action","handleFormSubmission","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","weekParser","isoWeek","week","addDays","numberInputType","numberBadFlags","urlInputType","$validators","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","ctrls","NgModelController","$modelValue","$viewChangeListeners","$untouched","$touched","ngModelGet","ngModel","ngModelSet","pendingDebounce","this.$isEmpty","UNTOUCHED_CLASS","this.$setValidity","this.$setPristine","$setUntouched","this.$setUntouched","TOUCHED_CLASS","$setTouched","this.$setTouched","$rollbackViewValue","this.$rollbackViewValue","$$lastCommittedViewValue","$validate","this.$validate","$$runValidators","this.$$runValidators","this.$commitViewValue","$$invalidModelValue","this.$setViewValue","$options","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","modelCtrl","formCtrl","updateOn","ngChange","required","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","maxlength","ctrl.$validators.maxlength","minlength","ctrl.$validators.minlength","ngList","CONSTANT_VALUE_REGEXP","tpl","tplAttr","ngValue","ngValueConstantLink","ngValueLink","valueWatchAction","$attrs","that","ngModelOptions","templateElement","ngBind","ngBindWatchAction","ngBindTemplate","getStringValue","ngBindHtml","ngBindHtmlWatchAction","getTrustedHtml","ngEventHandler","$transclude","previousElements","ngIf","ngIfWatchAction","newScope","$anchorScroll","srcExp","ngInclude","onloadExp","onload","autoScrollExp","autoscroll","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","$compile","ngInit","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","ngPluralizeWatch","ngPluralizeWatchAction","ngRepeatMinErr","ngRepeat","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","valueIdentifier","keyIdentifier","hashFnLocals","lhs","rhs","trackByExp","lastBlockMap","ngRepeatAction","collection","previousNode","nextNode","nextBlockMap","arrayLength","trackById","trackByIdFn","collectionKeys","nextBlockOrder","updateScope","$first","$last","$middle","$odd","$even","itemKey","blockKey","ngShow","ngShowWatchAction","ngHide","ngHideWatchAction","ngStyle","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","selectedScopes","ngSwitch","ngSwitchWatchAction","change","selectedTransclude","selectedScope","caseElement","anchor","ngSwitchWhen","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","render","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","valuesFn","keyName","groupIndex","selectedSet","lastElement","trackFn","trackIndex","valueName","groupByFn","modelCast","label","displayFn","nullOption","groupLength","optionGroupsCache","optGroupTemplate","existingOption","optionTemplate","optionsExp","track","optionElement","ngOptions","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"]
+}
diff --git a/deployment-scripts/static/js/angular/angular-file-upload.min.js b/deployment-scripts/static/js/angular/angular-file-upload.min.js
new file mode 100644
index 0000000..151409c
--- /dev/null
+++ b/deployment-scripts/static/js/angular/angular-file-upload.min.js
@@ -0,0 +1,6 @@
+/*
+ angular-file-upload v1.0.1
+ https://github.com/nervgh/angular-file-upload
+*/
+!function(a,b){return"function"==typeof define&&define.amd?(define("angular-file-upload",["angular"],function(a){return b(a)}),void 0):b(a)}("undefined"==typeof angular?null:angular||null,function(a){var b=a.module("angularFileUpload",[]);return b.value("fileUploaderOptions",{url:"/",alias:"file",headers:{},queue:[],progress:0,autoUpload:!1,removeAfterUpload:!1,method:"POST",filters:[],formData:[],queueLimit:Number.MAX_VALUE,withCredentials:!1}).factory("FileUploader",["fileUploaderOptions","$rootScope","$http","$window","$compile",function(b,c,d,e,f){function g(c){var d=a.copy(b);a.extend(this,d,c,{isUploading:!1,_nextIndex:0,_failFilterIndex:-1,_directives:{select:[],drop:[],over:[]}}),this.filters.unshift({name:"queueLimit",fn:this._queueLimitFilter}),this.filters.unshift({name:"folder",fn:this._folderFilter})}function h(a){var b=a;this.lastModifiedDate=null,this.size=null,this.type="like/"+b.slice(b.lastIndexOf(".")+1).toLowerCase(),this.name=b.slice(b.lastIndexOf("/")+b.lastIndexOf("\\")+2)}function i(b,c,d,e){c=b._getFileOrFileLikeObject(c),a.extend(this,{url:b.url,alias:b.alias,headers:a.copy(b.headers),formData:a.copy(b.formData),removeAfterUpload:b.removeAfterUpload,withCredentials:b.withCredentials,method:b.method},d,{uploader:b,file:a.copy(c),isReady:!1,isUploading:!1,isUploaded:!1,isSuccess:!1,isCancel:!1,isError:!1,progress:0,index:null,_file:c}),e&&(this._input=a.element(e),this._replaceNode(this._input))}function j(b){a.extend(this,b),this.uploader._directives[this.prop].push(this),this._saveLinks(),this.bind()}function k(){k.super_.apply(this,arguments),this.uploader.isHTML5||this.element.removeAttr("multiple"),this.element.prop("value",null)}function l(){l.super_.apply(this,arguments)}function m(){m.super_.apply(this,arguments)}return g.prototype.isHTML5=!(!e.File||!e.FormData),g.prototype.addToQueue=function(b,c,d){var e=a.isElement(b)?[b]:b,f=this._getFilters(d),h=this.queue.length,i=[];a.forEach(e,function(a){var b=this._getFileOrFileLikeObject(a);if(this._isValidFile(b,f,c)){var d=this.isFile(b)?null:a,e=new g.FileItem(this,b,c,d);i.push(e),this.queue.push(e),this._onAfterAddingFile(e)}else{var h=this.filters[this._failFilterIndex];this._onWhenAddingFileFailed(b,h,c)}},this),this.queue.length!==h&&(this._onAfterAddingAll(i),this.progress=this._getTotalProgress()),this._render(),this.autoUpload&&this.uploadAll()},g.prototype.removeFromQueue=function(a){var b=this.getIndexOfItem(a),c=this.queue[b];c.isUploading&&c.cancel(),this.queue.splice(b,1),c._destroy(),this.progress=this._getTotalProgress()},g.prototype.clearQueue=function(){for(;this.queue.length;)this.queue[0].remove();this.progress=0},g.prototype.uploadItem=function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhrTransport":"_iframeTransport";c._prepareToUploading(),this.isUploading||(this.isUploading=!0,this[d](c))},g.prototype.cancelItem=function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhr":"_form";c&&c.isUploading&&c[d].abort()},g.prototype.uploadAll=function(){var b=this.getNotUploadedItems().filter(function(a){return!a.isUploading});b.length&&(a.forEach(b,function(a){a._prepareToUploading()}),b[0].upload())},g.prototype.cancelAll=function(){var b=this.getNotUploadedItems();a.forEach(b,function(a){a.cancel()})},g.prototype.isFile=function(a){var b=e.File;return b&&a instanceof b},g.prototype.isFileLikeObject=function(a){return a instanceof g.FileLikeObject},g.prototype.getIndexOfItem=function(b){return a.isNumber(b)?b:this.queue.indexOf(b)},g.prototype.getNotUploadedItems=function(){return this.queue.filter(function(a){return!a.isUploaded})},g.prototype.getReadyItems=function(){return this.queue.filter(function(a){return a.isReady&&!a.isUploading}).sort(function(a,b){return a.index-b.index})},g.prototype.destroy=function(){a.forEach(this._directives,function(b){a.forEach(this._directives[b],function(a){a.destroy()},this)},this)},g.prototype.onAfterAddingAll=function(){},g.prototype.onAfterAddingFile=function(){},g.prototype.onWhenAddingFileFailed=function(){},g.prototype.onBeforeUploadItem=function(){},g.prototype.onProgressItem=function(){},g.prototype.onProgressAll=function(){},g.prototype.onSuccessItem=function(){},g.prototype.onErrorItem=function(){},g.prototype.onCancelItem=function(){},g.prototype.onCompleteItem=function(){},g.prototype.onCompleteAll=function(){},g.prototype._getTotalProgress=function(a){if(this.removeAfterUpload)return a||0;var b=this.getNotUploadedItems().length,c=b?this.queue.length-b:this.queue.length,d=100/this.queue.length,e=(a||0)*d/100;return Math.round(c*d+e)},g.prototype._getFilters=function(b){if(a.isUndefined(b))return this.filters;if(a.isArray(b))return b;var c=b.split(/\s*,/);return this.filters.filter(function(a){return-1!==c.indexOf(a.name)},this)},g.prototype._render=function(){c.$$phase||c.$apply()},g.prototype._folderFilter=function(a){return!(!a.size&&!a.type)},g.prototype._queueLimitFilter=function(){return this.queue.length<this.queueLimit},g.prototype._isValidFile=function(a,b,c){return this._failFilterIndex=-1,b.length?b.every(function(b){return this._failFilterIndex++,b.fn.call(this,a,c)},this):!0},g.prototype._getFileOrFileLikeObject=function(a){return this.isFile(a)||this.isFileLikeObject(a)?a:new g.FileLikeObject(a.value)},g.prototype._isSuccessCode=function(a){return a>=200&&300>a||304===a},g.prototype._transformResponse=function(b){return a.forEach(d.defaults.transformResponse,function(a){b=a(b)}),b},g.prototype._parseHeaders=function(b){function c(a){return a.replace(/^\s+/,"").replace(/\s+$/,"")}function d(a){return a.toLowerCase()}var e,f,g,h={};return b?(a.forEach(b.split("\n"),function(a){g=a.indexOf(":"),e=d(c(a.substr(0,g))),f=c(a.substr(g+1)),e&&(h[e]=h[e]?h[e]+", "+f:f)}),h):h},g.prototype._xhrTransport=function(b){var c=b._xhr=new XMLHttpRequest,d=new FormData,e=this;e._onBeforeUploadItem(b),a.forEach(b.formData,function(b){a.forEach(b,function(a,b){d.append(b,a)})}),d.append(b.alias,b._file),c.upload.onprogress=function(a){var c=Math.round(a.lengthComputable?100*a.loaded/a.total:0);e._onProgressItem(b,c)},c.onload=function(){var a=e._parseHeaders(c.getAllResponseHeaders()),d=e._transformResponse(c.response),f=e._isSuccessCode(c.status)?"Success":"Error",g="_on"+f+"Item";e[g](b,d,c.status,a),e._onCompleteItem(b,d,c.status,a)},c.onerror=function(){var a=e._parseHeaders(c.getAllResponseHeaders()),d=e._transformResponse(c.response);e._onErrorItem(b,d,c.status,a),e._onCompleteItem(b,d,c.status,a)},c.onabort=function(){var a=e._parseHeaders(c.getAllResponseHeaders()),d=e._transformResponse(c.response);e._onCancelItem(b,d,c.status,a),e._onCompleteItem(b,d,c.status,a)},c.open(b.method,b.url,!0),c.withCredentials=b.withCredentials,a.forEach(b.headers,function(a,b){c.setRequestHeader(b,a)}),c.send(d),this._render()},g.prototype._iframeTransport=function(b){var c=a.element('<form style="display: none;" />'),d=a.element('<iframe name="iframeTransport'+Date.now()+'">'),e=b._input,f=this;b._form&&b._form.replaceWith(e),b._form=c,f._onBeforeUploadItem(b),e.prop("name",b.alias),a.forEach(b.formData,function(b){a.forEach(b,function(b,d){c.append(a.element('<input type="hidden" name="'+d+'" value="'+b+'" />'))})}),c.prop({action:b.url,method:"POST",target:d.prop("name"),enctype:"multipart/form-data",encoding:"multipart/form-data"}),d.bind("load",function(){try{var a=d[0].contentDocument.body.innerHTML}catch(c){}var e={response:a,status:200,dummy:!0},g=f._transformResponse(e.response),h={};f._onSuccessItem(b,g,e.status,h),f._onCompleteItem(b,g,e.status,h)}),c.abort=function(){var a,g={status:0,dummy:!0},h={};d.unbind("load").prop("src","javascript:false;"),c.replaceWith(e),f._onCancelItem(b,a,g.status,h),f._onCompleteItem(b,a,g.status,h)},e.after(c),c.append(e).append(d),c[0].submit(),this._render()},g.prototype._onWhenAddingFileFailed=function(a,b,c){this.onWhenAddingFileFailed(a,b,c)},g.prototype._onAfterAddingFile=function(a){this.onAfterAddingFile(a)},g.prototype._onAfterAddingAll=function(a){this.onAfterAddingAll(a)},g.prototype._onBeforeUploadItem=function(a){a._onBeforeUpload(),this.onBeforeUploadItem(a)},g.prototype._onProgressItem=function(a,b){var c=this._getTotalProgress(b);this.progress=c,a._onProgress(b),this.onProgressItem(a,b),this.onProgressAll(c),this._render()},g.prototype._onSuccessItem=function(a,b,c,d){a._onSuccess(b,c,d),this.onSuccessItem(a,b,c,d)},g.prototype._onErrorItem=function(a,b,c,d){a._onError(b,c,d),this.onErrorItem(a,b,c,d)},g.prototype._onCancelItem=function(a,b,c,d){a._onCancel(b,c,d),this.onCancelItem(a,b,c,d)},g.prototype._onCompleteItem=function(b,c,d,e){b._onComplete(c,d,e),this.onCompleteItem(b,c,d,e);var f=this.getReadyItems()[0];return this.isUploading=!1,a.isDefined(f)?(f.upload(),void 0):(this.onCompleteAll(),this.progress=this._getTotalProgress(),this._render(),void 0)},g.isFile=g.prototype.isFile,g.isFileLikeObject=g.prototype.isFileLikeObject,g.isHTML5=g.prototype.isHTML5,g.inherit=function(a,b){a.prototype=Object.create(b.prototype),a.prototype.constructor=a,a.super_=b},g.FileLikeObject=h,g.FileItem=i,g.FileDirective=j,g.FileSelect=k,g.FileDrop=l,g.FileOver=m,i.prototype.upload=function(){this.uploader.uploadItem(this)},i.prototype.cancel=function(){this.uploader.cancelItem(this)},i.prototype.remove=function(){this.uploader.removeFromQueue(this)},i.prototype.onBeforeUpload=function(){},i.prototype.onProgress=function(){},i.prototype.onSuccess=function(){},i.prototype.onError=function(){},i.prototype.onCancel=function(){},i.prototype.onComplete=function(){},i.prototype._onBeforeUpload=function(){this.isReady=!0,this.isUploading=!0,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!1,this.isError=!1,this.progress=0,this.onBeforeUpload()},i.prototype._onProgress=function(a){this.progress=a,this.onProgress(a)},i.prototype._onSuccess=function(a,b,c){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!0,this.isCancel=!1,this.isError=!1,this.progress=100,this.index=null,this.onSuccess(a,b,c)},i.prototype._onError=function(a,b,c){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!1,this.isCancel=!1,this.isError=!0,this.progress=0,this.index=null,this.onError(a,b,c)},i.prototype._onCancel=function(a,b,c){this.isReady=!1,this.isUploading=!1,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!0,this.isError=!1,this.progress=0,this.index=null,this.onCancel(a,b,c)},i.prototype._onComplete=function(a,b,c){this.onComplete(a,b,c),this.removeAfterUpload&&this.remove()},i.prototype._destroy=function(){this._input&&this._input.remove(),this._form&&this._form.remove(),delete this._form,delete this._input},i.prototype._prepareToUploading=function(){this.index=this.index||++this.uploader._nextIndex,this.isReady=!0},i.prototype._replaceNode=function(a){var b=f(a.clone())(a.scope());b.prop("value",null),a.css("display","none"),a.after(b)},j.prototype.events={},j.prototype.bind=function(){for(var a in this.events){var b=this.events[a];this.element.bind(a,this[b])}},j.prototype.unbind=function(){for(var a in this.events)this.element.unbind(a,this.events[a])},j.prototype.destroy=function(){var a=this.uploader._directives[this.prop].indexOf(this);this.uploader._directives[this.prop].splice(a,1),this.unbind()},j.prototype._saveLinks=function(){for(var a in this.events){var b=this.events[a];this[b]=this[b].bind(this)}},g.inherit(k,j),k.prototype.events={$destroy:"destroy",change:"onChange"},k.prototype.prop="select",k.prototype.getOptions=function(){},k.prototype.getFilters=function(){},k.prototype.onChange=function(){var a=this.uploader.isHTML5?this.element[0].files:this.element[0],b=this.getOptions(),c=this.getFilters();this.uploader.isHTML5||this.destroy(),this.uploader.addToQueue(a,b,c),this.uploader.isHTML5&&this.element.prop("value",null)},g.inherit(l,j),l.prototype.events={$destroy:"destroy",drop:"onDrop",dragover:"onDragOver",dragleave:"onDragLeave"},l.prototype.prop="drop",l.prototype.getOptions=function(){},l.prototype.getFilters=function(){},l.prototype.onDrop=function(b){var c=this._getTransfer(b);if(c){var d=this.getOptions(),e=this.getFilters();this._preventAndStop(b),a.forEach(this.uploader._directives.over,this._removeOverClass,this),this.uploader.addToQueue(c.files,d,e)}},l.prototype.onDragOver=function(b){var c=this._getTransfer(b);this._haveFiles(c.types)&&(c.dropEffect="copy",this._preventAndStop(b),a.forEach(this.uploader._directives.over,this._addOverClass,this))},l.prototype.onDragLeave=function(b){b.target===this.element[0]&&(this._preventAndStop(b),a.forEach(this.uploader._directives.over,this._removeOverClass,this))},l.prototype._getTransfer=function(a){return a.dataTransfer?a.dataTransfer:a.originalEvent.dataTransfer},l.prototype._preventAndStop=function(a){a.preventDefault(),a.stopPropagation()},l.prototype._haveFiles=function(a){return a?a.indexOf?-1!==a.indexOf("Files"):a.contains?a.contains("Files"):!1:!1},l.prototype._addOverClass=function(a){a.addOverClass()},l.prototype._removeOverClass=function(a){a.removeOverClass()},g.inherit(m,j),m.prototype.events={$destroy:"destroy"},m.prototype.prop="over",m.prototype.overClass="nv-file-over",m.prototype.addOverClass=function(){this.element.addClass(this.getOverClass())},m.prototype.removeOverClass=function(){this.element.removeClass(this.getOverClass())},m.prototype.getOverClass=function(){return this.overClass},g}]).directive("nvFileSelect",["$parse","FileUploader",function(a,b){return{link:function(c,d,e){var f=c.$eval(e.uploader);if(!(f instanceof b))throw new TypeError('"Uploader" must be an instance of FileUploader');var g=new b.FileSelect({uploader:f,element:d});g.getOptions=a(e.options).bind(g,c),g.getFilters=function(){return e.filters}}}}]).directive("nvFileDrop",["$parse","FileUploader",function(a,b){return{link:function(c,d,e){var f=c.$eval(e.uploader);if(!(f instanceof b))throw new TypeError('"Uploader" must be an instance of FileUploader');if(f.isHTML5){var g=new b.FileDrop({uploader:f,element:d});g.getOptions=a(e.options).bind(g,c),g.getFilters=function(){return e.filters}}}}}]).directive("nvFileOver",["FileUploader",function(a){return{link:function(b,c,d){var e=b.$eval(d.uploader);if(!(e instanceof a))throw new TypeError('"Uploader" must be an instance of FileUploader');var f=new a.FileOver({uploader:e,element:c});f.getOverClass=function(){return d.overClass||this.overClass}}}}]),b});
+//# sourceMappingURL=angular-file-upload.min.map
\ No newline at end of file
diff --git a/deployment-scripts/static/js/angular/ui-bootstrap-tpls-0.11.0.min.js b/deployment-scripts/static/js/angular/ui-bootstrap-tpls-0.11.0.min.js
new file mode 100644
index 0000000..fa6a861
--- /dev/null
+++ b/deployment-scripts/static/js/angular/ui-bootstrap-tpls-0.11.0.min.js
@@ -0,0 +1,10 @@
+/*
+ * angular-ui-bootstrap
+ * http://angular-ui.github.io/bootstrap/
+
+ * Version: 0.11.0 - 2014-05-01
+ * License: MIT
+ */
+angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition",function(a,b,c){function d(){e();var c=+a.interval;!isNaN(c)&&c>=0&&(g=b(f,c))}function e(){g&&(b.cancel(g),g=null)}function f(){h?(a.next(),d()):a.pause()}var g,h,i=this,j=i.slides=a.slides=[],k=-1;i.currentSlide=null;var l=!1;i.select=a.select=function(e,f){function g(){if(!l){if(i.currentSlide&&angular.isString(f)&&!a.noTransition&&e.$element){e.$element.addClass(f);{e.$element[0].offsetWidth}angular.forEach(j,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(e,{direction:f,active:!0,entering:!0}),angular.extend(i.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=c(e.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(e,i.currentSlide)}else h(e,i.currentSlide);i.currentSlide=e,k=m,d()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var m=j.indexOf(e);void 0===f&&(f=m>k?"next":"prev"),e&&e!==i.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){l=!0}),i.indexOfSlide=function(a){return j.indexOf(a)},a.next=function(){var b=(k+1)%j.length;return a.$currentTransition?void 0:i.select(j[b],"next")},a.prev=function(){var b=0>k-1?j.length-1:k-1;return a.$currentTransition?void 0:i.select(j[b],"prev")},a.isActive=function(a){return i.currentSlide===a},a.$watch("interval",d),a.$on("$destroy",e),a.play=function(){h||(h=!0,d())},a.pause=function(){a.noPause||(h=!1,e())},i.addSlide=function(b,c){b.$element=c,j.push(b),1===j.length||b.active?(i.select(j[j.length-1]),1==j.length&&a.play()):b.active=!1},i.removeSlide=function(a){var b=j.indexOf(a);j.splice(b,1),j.length>0&&a.active?i.select(b>=j.length?j[b-1]:j[b]):k>b&&k--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a,b,c){return 1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}this.parsers={};var d={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")}};this.createParser=function(a){var c=[],e=a.split("");return angular.forEach(d,function(b,d){var f=a.indexOf(d);if(f>-1){a=a.split(""),e[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+d.length;h>g;g++)e[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+e.join("")+"$"),map:b(c,"index")}},this.parse=function(b,d){if(!angular.isString(b))return b;d=a.DATETIME_FORMATS[d]||d,this.parsers[d]||(this.parsers[d]=this.createParser(d));var e=this.parsers[d],f=e.regex,g=e.map,h=b.match(f);if(h&&h.length){for(var i,j={year:1900,month:0,date:1,hours:0},k=1,l=h.length;l>k;k++){var m=g[k-1];m.apply&&m.apply.call(j,h[k])}return c(j.year,j.month,j.date)&&(i=new Date(j.year,j.month,j.date,j.hours)),i}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(b.initDate)?a.$parent.$eval(b.initDate):new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$modelValue){var a=new Date(j.$modelValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$modelValue?new Date(j.$modelValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$modelValue?new Date(j.$modelValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$modelValue?new Date(j.$modelValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=h(b.rows[0][0].date),p=b.rows.length;b.weekNumbers.push(o++)<p;);}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a){var b=e.activeDate.getDate();if("left"===a)b-=1;else if("up"===a)b-=7;else if("right"===a)b+=1;else if("down"===a)b+=7;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(c,1),b=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),b)}else"home"===a?b=1:"end"===a&&(b=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(b)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(a){if(angular.isDate(a)&&!isNaN(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=f.parse(a,n)||new Date(a);return isNaN(b)?void k.$setValidity("date",!1):(k.$setValidity("date",!0),b)}return void k.$setValidity("date",!1)}return k.$setValidity("date",!0),null}var n,o=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,p=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]},j.$observe("datepickerPopup",function(a){n=a||g.datepickerPopup,k.$render()});var q=angular.element("<div datepicker-popup-wrap><div datepicker></div></div>");q.attr({"ng-model":"date","ng-change":"dateSelection()"});var r=angular.element(q.children()[0]);j.datepickerOptions&&angular.forEach(h.$parent.$eval(j.datepickerOptions),function(a,b){r.attr(l(b),a)}),angular.forEach(["minDate","maxDate"],function(a){j[a]&&(h.$parent.$watch(b(j[a]),function(b){h[a]=b}),r.attr(l(a),a))}),j.dateDisabled&&r.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),k.$parsers.unshift(m),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a),k.$setViewValue(h.date),k.$render(),o&&(h.isOpen=!1,i[0].focus())},i.bind("input change keyup",function(){h.$apply(function(){h.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,n):"";i.val(a),h.date=m(k.$modelValue)};var s=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},t=function(a){h.keydown(a)};i.bind("keydown",t),h.keydown=function(a){27===a.which?(a.preventDefault(),a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=p?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",s)):c.unbind("click",s)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(k.$modelValue)?(a=new Date(k.$modelValue),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var u=a(q)(h);p?c.find("body").append(u):i.after(u),h.$on("$destroy",function(){u.remove(),i.unbind("keydown",t),c.unbind("click",s)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(a){var b=null;this.open=function(e){b||(a.bind("click",c),a.bind("keydown",d)),b&&b!==e&&(b.isOpen=!1),b=e},this.close=function(e){b===e&&(b=null,a.unbind("click",c),a.unbind("keydown",d))};var c=function(a){a&&a.isDefaultPrevented()||b.$apply(function(){b.isOpen=!1})},d=function(a){27===a.which&&(b.focusToggleElement(),c())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(a,b,c,d,e,f){var g,h=this,i=a.$new(),j=d.openClass,k=angular.noop,l=b.onToggle?c(b.onToggle):angular.noop;this.init=function(d){h.$element=d,b.isOpen&&(g=c(b.isOpen),k=g.assign,a.$watch(g,function(a){i.isOpen=!!a}))},this.toggle=function(a){return i.isOpen=arguments.length?!!a:!i.isOpen},this.isOpen=function(){return i.isOpen},i.focusToggleElement=function(){h.toggleElement&&h.toggleElement[0].focus()},i.$watch("isOpen",function(b,c){f[b?"addClass":"removeClass"](h.$element,j),b?(i.focusToggleElement(),e.open(i)):e.close(i),k(a,b),angular.isDefined(b)&&b!==c&&l(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){i.isOpen=!1}),a.$on("$destroy",function(){i.$destroy()})}]).directive("dropdown",function(){return{restrict:"CA",controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownToggle",function(){return{restrict:"CA",require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b==a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b==a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}).directive("modalBackdrop",["$timeout",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/modal/backdrop.html",link:function(b){b.animate=!1,a(function(){b.animate=!0})}}}]).directive("modalWindow",["$modalStack","$timeout",function(a,b){return{restrict:"EA",scope:{index:"@",animate:"="},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/modal/window.html"},link:function(c,d,e){d.addClass(e.windowClass||""),c.size=e.size,b(function(){c.animate=!0,d[0].focus()}),c.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!=c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))}}}}]).factory("$modalStack",["$transition","$timeout","$document","$compile","$rootScope","$$stackedMap",function(a,b,c,d,e,f){function g(){for(var a=-1,b=n.keys(),c=0;c<b.length;c++)n.get(b[c]).value.backdrop&&(a=c);return a}function h(a){var b=c.find("body").eq(0),d=n.get(a).value;n.remove(a),j(d.modalDomEl,d.modalScope,300,function(){d.modalScope.$destroy(),b.toggleClass(m,n.length()>0),i()})}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g,0)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){o.dismiss(b.key,"escape key press")})))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();h>=0&&!k&&(l=e.$new(!0),l.index=h,k=d("<div modal-backdrop></div>")(l),f.append(k));var i=angular.element("<div modal-window></div>");i.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:n.length()-1,animate:"animate"}).html(b.content);var j=d(i)(b.scope);n.top().value.modalDomEl=j,f.append(j),f.addClass(m)},o.close=function(a,b){var c=n.get(a).value;c&&(c.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a).value;c&&(c.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(f,g){e=f,this.config=g,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=g.itemsPerPage},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b){a.page!==b&&b>0&&b<=a.totalPages&&(e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages},a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";
+return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function(e,f,g,h,i,j,k){return function(e,l,m){function n(a){var b=a||o.trigger||m,d=c[b]||b;return{show:b,hide:d}}var o=angular.extend({},b,d),p=a(e),q=k.startSymbol(),r=k.endSymbol(),s="<div "+p+'-popup title="'+q+"tt_title"+r+'" content="'+q+"tt_content"+r+'" placement="'+q+"tt_placement"+r+'" animation="tt_animation" is-open="tt_isOpen"></div>';return{restrict:"EA",scope:!0,compile:function(){var a=f(s);return function(b,c,d){function f(){b.tt_isOpen?m():k()}function k(){(!y||b.$eval(d[l+"Enable"]))&&(b.tt_popupDelay?v||(v=g(p,b.tt_popupDelay,!1),v.then(function(a){a()})):p()())}function m(){b.$apply(function(){q()})}function p(){return v=null,u&&(g.cancel(u),u=null),b.tt_content?(r(),t.css({top:0,left:0,display:"block"}),w?i.find("body").append(t):c.after(t),z(),b.tt_isOpen=!0,b.$digest(),z):angular.noop}function q(){b.tt_isOpen=!1,g.cancel(v),v=null,b.tt_animation?u||(u=g(s,500)):s()}function r(){t&&s(),t=a(b,function(){}),b.$digest()}function s(){u=null,t&&(t.remove(),t=null)}var t,u,v,w=angular.isDefined(o.appendToBody)?o.appendToBody:!1,x=n(void 0),y=angular.isDefined(d[l+"Enable"]),z=function(){var a=j.positionElements(c,t,b.tt_placement,w);a.top+="px",a.left+="px",t.css(a)};b.tt_isOpen=!1,d.$observe(e,function(a){b.tt_content=a,!a&&b.tt_isOpen&&q()}),d.$observe(l+"Title",function(a){b.tt_title=a}),d.$observe(l+"Placement",function(a){b.tt_placement=angular.isDefined(a)?a:o.placement}),d.$observe(l+"PopupDelay",function(a){var c=parseInt(a,10);b.tt_popupDelay=isNaN(c)?o.popupDelay:c});var A=function(){c.unbind(x.show,k),c.unbind(x.hide,m)};d.$observe(l+"Trigger",function(a){A(),x=n(a),x.show===x.hide?c.bind(x.show,f):(c.bind(x.show,k),c.bind(x.hide,m))});var B=b.$eval(d[l+"Animation"]);b.tt_animation=angular.isDefined(B)?!!B:o.animation,d.$observe(l+"AppendToBody",function(a){w=angular.isDefined(a)?h(a)(b):w}),w&&b.$on("$locationChangeSuccess",function(){b.tt_isOpen&&q()}),b.$on("$destroy",function(){g.cancel(u),g.cancel(v),A(),s()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length?a.active=!0:a.active&&b.select(a)},b.removeTab=function(a){var d=c.indexOf(a);if(a.active&&c.length>1){var e=d==c.length-1?d-1:d+1;b.select(c[e])}c.splice(d,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){b.$watch("active",function(a){a&&f.select(b)}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),a.minutes="m"===b?d:i(d),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render;var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$modelValue?new Date(o.$modelValue):null;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=b(k.ngModel).assign,v=g.parse(k.typeahead),w=i.$new();i.$on("$destroy",function(){w.$destroy()});var x="typeahead-"+w.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":x});var y=angular.element("<div typeahead-popup></div>");y.attr({id:x,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&y.attr("template-url",k.typeaheadTemplateUrl);var z=function(){w.matches=[],w.activeIdx=-1,j.attr("aria-expanded",!1)},A=function(a){return x+"-option-"+a};w.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",A(a))});var B=function(a){var b={$viewValue:a};q(i,!0),c.when(v.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c.length>0){w.activeIdx=0,w.matches.length=0;for(var e=0;e<c.length;e++)b[v.itemName]=c[e],w.matches.push({id:A(e),label:v.viewMapper(w,b),model:c[e]});w.query=a,w.position=t?f.offset(j):f.position(j),w.position.top=w.position.top+j.prop("offsetHeight"),j.attr("aria-expanded",!0)}else z();d&&q(i,!1)},function(){z(),q(i,!1)})};z(),w.query=void 0;var C;l.$parsers.unshift(function(a){return m=!0,a&&a.length>=n?o>0?(C&&d.cancel(C),C=d(function(){B(a)},o)):B(a):(q(i,!1),z()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[v.itemName]=a,b=v.viewMapper(i,d),d[v.itemName]=void 0,c=v.viewMapper(i,d),b!==c?b:a)}),w.select=function(a){var b,c,e={};e[v.itemName]=c=w.matches[a].model,b=v.modelMapper(i,e),u(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:v.viewMapper(i,e)}),z(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==w.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(w.activeIdx=(w.activeIdx+1)%w.matches.length,w.$digest()):38===a.which?(w.activeIdx=(w.activeIdx?w.activeIdx:w.matches.length)-1,w.$digest()):13===a.which||9===a.which?w.$apply(function(){w.select(w.activeIdx)}):27===a.which&&(a.stopPropagation(),z(),w.$digest()))}),j.bind("blur",function(){m=!1});var D=function(a){j[0]!==a.target&&(z(),w.$digest())};e.bind("click",D),i.$on("$destroy",function(){e.unbind("click",D)});var E=a(y)(w);t?e.find("body").append(E):j.after(E)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"<strong>$&</strong>"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'<div class="panel panel-default">\n  <div class="panel-heading">\n    <h4 class="panel-title">\n      <a class="accordion-toggle" ng-click="toggleOpen()" accordion-transclude="heading"><span ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n    </h4>\n  </div>\n  <div class="panel-collapse" collapse="!isOpen">\n	  <div class="panel-body" ng-transclude></div>\n  </div>\n</div>')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'<div class="panel-group" ng-transclude></div>')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'<div class="alert" ng-class="{\'alert-{{type || \'warning\'}}\': true, \'alert-dismissable\': closeable}" role="alert">\n    <button ng-show="closeable" type="button" class="close" ng-click="close()">\n        <span aria-hidden="true">&times;</span>\n        <span class="sr-only">Close</span>\n    </button>\n    <div ng-transclude></div>\n</div>\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n    <ol class="carousel-indicators" ng-show="slides.length > 1">\n        <li ng-repeat="slide in slides track by $index" ng-class="{active: isActive(slide)}" ng-click="select(slide)"></li>\n    </ol>\n    <div class="carousel-inner" ng-transclude></div>\n    <a class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-left"></span></a>\n    <a class="right carousel-control" ng-click="next()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-right"></span></a>\n</div>\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","<div ng-class=\"{\n    'active': leaving || (active && !entering),\n    'prev': (next || active) && direction=='prev',\n    'next': (next || active) && direction=='next',\n    'right': direction=='prev',\n    'left': direction=='next'\n  }\" class=\"item text-center\" ng-transclude></div>\n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n  <daypicker ng-switch-when="day" tabindex="0"></daypicker>\n  <monthpicker ng-switch-when="month" tabindex="0"></monthpicker>\n  <yearpicker ng-switch-when="year" tabindex="0"></yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="{{5 + showWeeks}}"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n    <tr>\n      <th ng-show="showWeeks" class="text-center"></th>\n      <th ng-repeat="label in labels track by $index" class="text-center"><small aria-label="{{label.full}}">{{label.abbr}}</small></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-show="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'<ul class="dropdown-menu" ng-style="{display: (isOpen && \'block\') || \'none\', top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)">\n	<li ng-transclude></li>\n	<li ng-if="showButtonBar" style="padding:10px 9px 2px">\n		<span class="btn-group">\n			<button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')">{{ getText(\'current\') }}</button>\n			<button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n		</span>\n		<button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n	</li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="3"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'<div class="modal-backdrop fade"\n     ng-class="{in: animate}"\n     ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'<div tabindex="-1" role="dialog" class="modal fade" ng-class="{in: animate}" ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}" ng-click="close($event)">\n    <div class="modal-dialog" ng-class="{\'modal-sm\': size == \'sm\', \'modal-lg\': size == \'lg\'}"><div class="modal-content" ng-transclude></div></div>\n</div>')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'<ul class="pager">\n  <li ng-class="{disabled: noPrevious(), previous: align}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-class="{disabled: noNext(), next: align}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n</ul>')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'<ul class="pagination">\n  <li ng-if="boundaryLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(1)">{{getText(\'first\')}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-repeat="page in pages track by $index" ng-class="{active: page.active}"><a href ng-click="selectPage(page.number)">{{page.text}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n  <li ng-if="boundaryLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(totalPages)">{{getText(\'last\')}}</a></li>\n</ul>')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" bind-html-unsafe="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'<div class="popover {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-show="title"></h3>\n      <div class="popover-content" ng-bind="content"></div>\n  </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'<div class="progress" ng-transclude></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'<div class="progress">\n  <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>\n</div>')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n    <i ng-repeat="r in range track by $index" ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')">\n        <span class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n    </i>\n</span>')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n  <a ng-click="select()" tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset-titles.html","<ul class=\"nav {{type && 'nav-' + type}}\" ng-class=\"{'nav-stacked': vertical}\">\n</ul>\n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'\n<div>\n  <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n  <div class="tab-content">\n    <div class="tab-pane" \n         ng-repeat="tab in tabs" \n         ng-class="{active: tab.active}"\n         tab-content-transclude="tab">\n    </div>\n  </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'<table>\n	<tbody>\n		<tr class="text-center">\n			<td><a ng-click="incrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n			<td>&nbsp;</td>\n			<td><a ng-click="incrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n			<td ng-show="showMeridian"></td>\n		</tr>\n		<tr>\n			<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidHours}">\n				<input type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-mousewheel="incrementHours()" ng-readonly="readonlyInput" maxlength="2">\n			</td>\n			<td>:</td>\n			<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n				<input type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2">\n			</td>\n			<td ng-show="showMeridian"><button type="button" class="btn btn-default text-center" ng-click="toggleMeridian()">{{meridian}}</button></td>\n		</tr>\n		<tr class="text-center">\n			<td><a ng-click="decrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n			<td>&nbsp;</td>\n			<td><a ng-click="decrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n			<td ng-show="showMeridian"></td>\n		</tr>\n	</tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'<a tabindex="-1" bind-html-unsafe="match.label | typeaheadHighlight:query"></a>')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-if="isOpen()" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n    <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{match.id}}">\n        <div typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n    </li>\n</ul>')
+}]);
\ No newline at end of file
diff --git a/deployment-scripts/static/js/app/app.js b/deployment-scripts/static/js/app/app.js
new file mode 100644
index 0000000..d44b93c
--- /dev/null
+++ b/deployment-scripts/static/js/app/app.js
@@ -0,0 +1,229 @@
+var app = angular.module('formApp', ['ngCookies', 'ui.bootstrap', 'ngAnimate', 'ngRoute', 'ngCookies'])
+
+app.config(['$routeProvider', '$httpProvider', function ($routeProvider, $httpProvider) {
+
+    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
+    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
+    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
+
+    $routeProvider
+        .when('/step1', {
+            'templateUrl': 'form-step1.html',
+            'controller': 'step1Controller'
+        })
+        .when('/step2', {
+            'templateUrl': 'form-step2.html',
+            'controller': 'step2Controller'
+        })
+        .when('/step3', {
+            'templateUrl': 'form-step3.html',
+            'controller': 'step3Controller'
+        })
+        .when('/step4', {
+            'templateUrl': 'form-step4.html',
+            'controller': 'step4Controller'
+        })
+        .when('/step5', {
+            'templateUrl': 'form-step5.html',
+            'controller': 'step5Controller'
+        })
+        .when('/step6', {
+            'templateUrl': 'form-step6.html',
+            'controller': 'step6Controller'
+        })
+        .when('/step7', {
+            'templateUrl': 'form-step7.html',
+            'controller': 'step7Controller'
+        })
+        .otherwise({
+            redirectTo: '/step1'
+        });
+}]);
+
+
+app.service("formDataService", ['$location', '$rootScope', '$q', function ($location, $rootScope, $q) {
+    service = {
+        'formData': {'db': {}, 'fr': {}}
+    }
+
+    return service
+}]);
+
+app.controller('myController', ['$scope', '$cookieStore', 'formDataService', function($scope, formDataService){
+    $scope.formData = formDataService.formData;
+}])
+
+app.controller('step1Controller', ['$scope', '$location', 'formDataService', function ($scope, $location, formDataService) {
+    $scope.formData = formDataService.formData;
+
+    $scope.provider = function (provider) {
+        formDataService.formData.provider = provider;
+//        $cookieStore.put('provider', provider);
+        $location.path('/step2');
+    };
+
+}]);
+
+app.controller('step2Controller', ['$scope', '$location', '$http', 'formDataService', function ($scope, $location, $http, formDataService) {
+    if (formDataService.formData.provider == undefined) {
+        $location.path('/')
+    }
+
+    $scope.formData = formDataService.formData;
+
+    $scope.db_provider = function (provider) {
+        formDataService.formData.db_provider = provider;
+        $location.path('/step3')
+    }
+    $scope.prevStep = function (step) {
+        $location.path(step);
+    }
+}]);
+
+
+app.controller('step3Controller', ['$scope', '$location', '$http', '$timeout', 'formDataService', function ($scope, $location, $http, $timeout,  formDataService) {
+
+    if (formDataService.formData.provider == undefined || formDataService.formData.db_provider == undefined) {
+        $location.path('/')
+    }
+    $scope.formData = formDataService.formData;
+
+    $scope.nextStep = function (step, formController) {
+        if (formController.$valid) {
+            $location.path(step)
+        }
+        else {
+            $scope.submitted = true;
+        }
+    }
+
+    $scope.prevStep = function (step) {
+        $location.path(step);
+    }
+
+    if (formDataService.formData.provider == 'aws')
+    {
+        $http.get('/form/ec2-instance-types').success(function (data) {
+            $scope.ec2_instance_types = data;
+        });
+    }
+
+    if ( formDataService.formData.provider == 'openstack')
+    {
+        formDataService.formData.fr.flavor = ''
+        var typing;
+        $scope.$watch('formData.fr.own_infrastructure', function(newValue, oldValue){
+            if (newValue == 'no')
+            {
+                typing = $http.post('/form/get-openstack-data', formDataService.formData)
+                            .success(function(response){
+                                $scope.flavors = response.flavors
+                                $scope.images = response.images
+                            })
+                            .error(function(response){
+                                console.log(response)
+                        })
+            }
+        }, true)
+    }
+
+
+}]);
+
+app.controller('step4Controller', ['$scope', '$location', '$http', 'formDataService', function ($scope, $location, $http, formDataService) {
+    if (formDataService.formData.provider == undefined || formDataService.formData.db_provider == undefined) {
+        $location.path('/')
+    }
+
+    $http.post('/form/get-openstack-data', formDataService.formData)
+        .success(function (response) {
+            $scope.flavors = response.flavors;
+            $scope.images = response.images;
+        })
+        .error(function (response) {
+            console.log(response);
+        });
+
+    $scope.formData = formDataService.formData;
+
+    $scope.$watch('formData', function(newValue, oldValue){
+        $scope.formData.db['num_replicas'] = $scope.formData.db.num_instances -1;
+    }, true)
+    $scope.nextStep = function (step, formController) {
+        if (formController.$valid) {
+            $location.path(step)
+        }
+        else {
+            $scope.submitted = true;
+        }
+    }
+
+    $scope.prevStep = function (step) {
+        $location.path(step);
+    }
+
+    $http.get('/form/rds-instance-types').success(function (data) {
+        $scope.rds_instance_types = data;
+    });
+
+}]);
+
+app.controller('step5Controller', ['$scope', '$location', '$cookies', '$q', 'formDataService', function ($scope, $location, $cookies, $q, formDataService) {
+    if (formDataService.formData.provider == undefined || formDataService.formData.db_provider == undefined) {
+        $location.path('/')
+    }
+    formDataService.myDropZone = new Dropzone("div.dropzone", {
+        url: '/form/finish',
+        headers : {'X-CSRFToken' : $cookies.csrftoken},
+        acceptedFiles : '.jmx',
+        addRemoveLinks: true,
+        autoProcessQueue: false
+    })
+    .on('sending', function(file, xhr, formData){
+        formData.append('formData', JSON.stringify(formDataService.formData));
+    })
+
+
+    .on('removedfile', function(file){
+        $scope.uploaded = false;
+        $scope.$apply()
+    })
+    $scope.nextStep = function (step, formController) {
+        if (formController.$valid) {
+
+            $location.path(step)
+        }
+        else {
+            $scope.submitted = true;
+        }
+    }
+
+    $scope.prevStep = function (step) {
+        $location.path(step);
+    }
+}])
+
+app.controller('step6Controller', ['$scope', 'formDataService', function ($scope, formDataService) {
+    $scope.formData = formDataService.formData;
+}])
+
+app.controller('step7Controller', ['$scope', '$http', '$sce', '$cookies', '$location', 'formDataService', function ($scope, $http, $sce, $cookies, $location, formDataService) {
+    if (formDataService.formData.provider == undefined || formDataService.formData.db_provider == undefined) {
+        $location.path('/')
+    }
+    else
+    {
+        $http.post('/form/finish', formDataService.formData).success(function(response){
+            window.location = '/results/' + response.task_id
+        })
+        .error(function(response){
+            $scope.errors = response.errors
+        })
+
+        $scope.trustAsHtml = function(html)
+        {
+            return $sce.trustAsHtml(html)
+        }
+    }
+
+}]);
\ No newline at end of file
diff --git a/deployment-scripts/static/js/app/directives.js b/deployment-scripts/static/js/app/directives.js
new file mode 100644
index 0000000..4771c14
--- /dev/null
+++ b/deployment-scripts/static/js/app/directives.js
@@ -0,0 +1,24 @@
+app.directive('tooltip', function(){
+    return {
+        restrict : 'A',
+        template : '<span>{{ label }}</span>',
+        link : function(scope, el, attrs){
+            scope.label = attrs.tooltipLabel;
+        }
+    }
+});
+
+app.directive('validFile',function(){
+  return {
+    require:'ngModel',
+    link:function(scope,el,attrs,ngModel){
+      //change event is fired when file is selected
+      el.bind('change',function(){
+        scope.$apply(function(){
+          ngModel.$setViewValue(el.val());
+          ngModel.$render();
+        })
+      })
+    }
+  }
+})
\ No newline at end of file
diff --git a/deployment-scripts/static/js/app/dropzone.js b/deployment-scripts/static/js/app/dropzone.js
new file mode 100644
index 0000000..499f4e0
--- /dev/null
+++ b/deployment-scripts/static/js/app/dropzone.js
@@ -0,0 +1,1874 @@
+
+;(function(){
+
+/**
+ * Require the module at `name`.
+ *
+ * @param {String} name
+ * @return {Object} exports
+ * @api public
+ */
+
+function require(name) {
+  var module = require.modules[name];
+  if (!module) throw new Error('failed to require "' + name + '"');
+
+  if (!('exports' in module) && typeof module.definition === 'function') {
+    module.client = module.component = true;
+    module.definition.call(this, module.exports = {}, module);
+    delete module.definition;
+  }
+
+  return module.exports;
+}
+
+/**
+ * Registered modules.
+ */
+
+require.modules = {};
+
+/**
+ * Register module at `name` with callback `definition`.
+ *
+ * @param {String} name
+ * @param {Function} definition
+ * @api private
+ */
+
+require.register = function (name, definition) {
+  require.modules[name] = {
+    definition: definition
+  };
+};
+
+/**
+ * Define a module's exports immediately with `exports`.
+ *
+ * @param {String} name
+ * @param {Generic} exports
+ * @api private
+ */
+
+require.define = function (name, exports) {
+  require.modules[name] = {
+    exports: exports
+  };
+};
+require.register("component~emitter@1.1.2", function (exports, module) {
+
+/**
+ * Expose `Emitter`.
+ */
+
+module.exports = Emitter;
+
+/**
+ * Initialize a new `Emitter`.
+ *
+ * @api public
+ */
+
+function Emitter(obj) {
+  if (obj) return mixin(obj);
+};
+
+/**
+ * Mixin the emitter properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+  for (var key in Emitter.prototype) {
+    obj[key] = Emitter.prototype[key];
+  }
+  return obj;
+}
+
+/**
+ * Listen on the given `event` with `fn`.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.on =
+Emitter.prototype.addEventListener = function(event, fn){
+  this._callbacks = this._callbacks || {};
+  (this._callbacks[event] = this._callbacks[event] || [])
+    .push(fn);
+  return this;
+};
+
+/**
+ * Adds an `event` listener that will be invoked a single
+ * time then automatically removed.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.once = function(event, fn){
+  var self = this;
+  this._callbacks = this._callbacks || {};
+
+  function on() {
+    self.off(event, on);
+    fn.apply(this, arguments);
+  }
+
+  on.fn = fn;
+  this.on(event, on);
+  return this;
+};
+
+/**
+ * Remove the given callback for `event` or all
+ * registered callbacks.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.off =
+Emitter.prototype.removeListener =
+Emitter.prototype.removeAllListeners =
+Emitter.prototype.removeEventListener = function(event, fn){
+  this._callbacks = this._callbacks || {};
+
+  // all
+  if (0 == arguments.length) {
+    this._callbacks = {};
+    return this;
+  }
+
+  // specific event
+  var callbacks = this._callbacks[event];
+  if (!callbacks) return this;
+
+  // remove all handlers
+  if (1 == arguments.length) {
+    delete this._callbacks[event];
+    return this;
+  }
+
+  // remove specific handler
+  var cb;
+  for (var i = 0; i < callbacks.length; i++) {
+    cb = callbacks[i];
+    if (cb === fn || cb.fn === fn) {
+      callbacks.splice(i, 1);
+      break;
+    }
+  }
+  return this;
+};
+
+/**
+ * Emit `event` with the given args.
+ *
+ * @param {String} event
+ * @param {Mixed} ...
+ * @return {Emitter}
+ */
+
+Emitter.prototype.emit = function(event){
+  this._callbacks = this._callbacks || {};
+  var args = [].slice.call(arguments, 1)
+    , callbacks = this._callbacks[event];
+
+  if (callbacks) {
+    callbacks = callbacks.slice(0);
+    for (var i = 0, len = callbacks.length; i < len; ++i) {
+      callbacks[i].apply(this, args);
+    }
+  }
+
+  return this;
+};
+
+/**
+ * Return array of callbacks for `event`.
+ *
+ * @param {String} event
+ * @return {Array}
+ * @api public
+ */
+
+Emitter.prototype.listeners = function(event){
+  this._callbacks = this._callbacks || {};
+  return this._callbacks[event] || [];
+};
+
+/**
+ * Check if this emitter has `event` handlers.
+ *
+ * @param {String} event
+ * @return {Boolean}
+ * @api public
+ */
+
+Emitter.prototype.hasListeners = function(event){
+  return !! this.listeners(event).length;
+};
+
+});
+
+require.register("dropzone", function (exports, module) {
+
+
+/**
+ * Exposing dropzone
+ */
+module.exports = require("dropzone/lib/dropzone.js");
+
+});
+
+require.register("dropzone/lib/dropzone.js", function (exports, module) {
+
+/*
+ *
+ * More info at [www.dropzonejs.com](http://www.dropzonejs.com)
+ *
+ * Copyright (c) 2012, Matias Meno
+ *
+ * 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.
+ *
+ */
+
+(function() {
+  var Dropzone, Em, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    __slice = [].slice;
+
+  Em = typeof Emitter !== "undefined" && Emitter !== null ? Emitter : require("component~emitter@1.1.2");
+
+  noop = function() {};
+
+  Dropzone = (function(_super) {
+    var extend;
+
+    __extends(Dropzone, _super);
+
+
+    /*
+    This is a list of all available events you can register on a dropzone object.
+    
+    You can register an event handler like this:
+    
+        dropzone.on("dragEnter", function() { });
+     */
+
+    Dropzone.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached"];
+
+    Dropzone.prototype.defaultOptions = {
+      url: null,
+      method: "post",
+      withCredentials: false,
+      parallelUploads: 2,
+      uploadMultiple: false,
+      maxFilesize: 256,
+      paramName: "file",
+      createImageThumbnails: true,
+      maxThumbnailFilesize: 10,
+      thumbnailWidth: 100,
+      thumbnailHeight: 100,
+      maxFiles: null,
+      params: {},
+      clickable: true,
+      ignoreHiddenFiles: true,
+      acceptedFiles: null,
+      acceptedMimeTypes: null,
+      autoProcessQueue: true,
+      autoQueue: true,
+      addRemoveLinks: false,
+      previewsContainer: null,
+      dictDefaultMessage: "Drop files here to upload",
+      dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.",
+      dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.",
+      dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.",
+      dictInvalidFileType: "You can't upload files of this type.",
+      dictResponseError: "Server responded with {{statusCode}} code.",
+      dictCancelUpload: "Cancel upload",
+      dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?",
+      dictRemoveFile: "Remove file",
+      dictRemoveFileConfirmation: null,
+      dictMaxFilesExceeded: "You can not upload any more files.",
+      accept: function(file, done) {
+        return done();
+      },
+      init: function() {
+        return noop;
+      },
+      forceFallback: false,
+      fallback: function() {
+        var child, messageElement, span, _i, _len, _ref;
+        this.element.className = "" + this.element.className + " dz-browser-not-supported";
+        _ref = this.element.getElementsByTagName("div");
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          child = _ref[_i];
+          if (/(^| )dz-message($| )/.test(child.className)) {
+            messageElement = child;
+            child.className = "dz-message";
+            continue;
+          }
+        }
+        if (!messageElement) {
+          messageElement = Dropzone.createElement("<div class=\"dz-message\"><span></span></div>");
+          this.element.appendChild(messageElement);
+        }
+        span = messageElement.getElementsByTagName("span")[0];
+        if (span) {
+          span.textContent = this.options.dictFallbackMessage;
+        }
+        return this.element.appendChild(this.getFallbackForm());
+      },
+      resize: function(file) {
+        var info, srcRatio, trgRatio;
+        info = {
+          srcX: 0,
+          srcY: 0,
+          srcWidth: file.width,
+          srcHeight: file.height
+        };
+        srcRatio = file.width / file.height;
+        info.optWidth = this.options.thumbnailWidth;
+        info.optHeight = this.options.thumbnailHeight;
+        if ((info.optWidth == null) && (info.optHeight == null)) {
+          info.optWidth = info.srcWidth;
+          info.optHeight = info.srcHeight;
+        } else if (info.optWidth == null) {
+          info.optWidth = srcRatio * info.optHeight;
+        } else if (info.optHeight == null) {
+          info.optHeight = (1 / srcRatio) * info.optWidth;
+        }
+        trgRatio = info.optWidth / info.optHeight;
+        if (file.height < info.optHeight || file.width < info.optWidth) {
+          info.trgHeight = info.srcHeight;
+          info.trgWidth = info.srcWidth;
+        } else {
+          if (srcRatio > trgRatio) {
+            info.srcHeight = file.height;
+            info.srcWidth = info.srcHeight * trgRatio;
+          } else {
+            info.srcWidth = file.width;
+            info.srcHeight = info.srcWidth / trgRatio;
+          }
+        }
+        info.srcX = (file.width - info.srcWidth) / 2;
+        info.srcY = (file.height - info.srcHeight) / 2;
+        return info;
+      },
+
+      /*
+      Those functions register themselves to the events on init and handle all
+      the user interface specific stuff. Overwriting them won't break the upload
+      but can break the way it's displayed.
+      You can overwrite them if you don't like the default behavior. If you just
+      want to add an additional event handler, register it on the dropzone object
+      and don't overwrite those options.
+       */
+      drop: function(e) {
+        return this.element.classList.remove("dz-drag-hover");
+      },
+      dragstart: noop,
+      dragend: function(e) {
+        return this.element.classList.remove("dz-drag-hover");
+      },
+      dragenter: function(e) {
+        return this.element.classList.add("dz-drag-hover");
+      },
+      dragover: function(e) {
+        return this.element.classList.add("dz-drag-hover");
+      },
+      dragleave: function(e) {
+        return this.element.classList.remove("dz-drag-hover");
+      },
+      paste: noop,
+      reset: function() {
+        return this.element.classList.remove("dz-started");
+      },
+      addedfile: function(file) {
+        var node, removeFileEvent, removeLink, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
+        if (this.element === this.previewsContainer) {
+          this.element.classList.add("dz-started");
+        }
+        if (this.previewsContainer) {
+          file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());
+          file.previewTemplate = file.previewElement;
+          this.previewsContainer.appendChild(file.previewElement);
+          _ref = file.previewElement.querySelectorAll("[data-dz-name]");
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            node = _ref[_i];
+            node.textContent = file.name;
+          }
+          _ref1 = file.previewElement.querySelectorAll("[data-dz-size]");
+          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+            node = _ref1[_j];
+            node.innerHTML = this.filesize(file.size);
+          }
+          if (this.options.addRemoveLinks) {
+            file._removeLink = Dropzone.createElement("<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>" + this.options.dictRemoveFile + "</a>");
+            file.previewElement.appendChild(file._removeLink);
+          }
+          removeFileEvent = (function(_this) {
+            return function(e) {
+              e.preventDefault();
+              e.stopPropagation();
+              if (file.status === Dropzone.UPLOADING) {
+                return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() {
+                  return _this.removeFile(file);
+                });
+              } else {
+                if (_this.options.dictRemoveFileConfirmation) {
+                  return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() {
+                    return _this.removeFile(file);
+                  });
+                } else {
+                  return _this.removeFile(file);
+                }
+              }
+            };
+          })(this);
+          _ref2 = file.previewElement.querySelectorAll("[data-dz-remove]");
+          _results = [];
+          for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
+            removeLink = _ref2[_k];
+            _results.push(removeLink.addEventListener("click", removeFileEvent));
+          }
+          return _results;
+        }
+      },
+      removedfile: function(file) {
+        var _ref;
+        if (file.previewElement) {
+          if ((_ref = file.previewElement) != null) {
+            _ref.parentNode.removeChild(file.previewElement);
+          }
+        }
+        return this._updateMaxFilesReachedClass();
+      },
+      thumbnail: function(file, dataUrl) {
+        var thumbnailElement, _i, _len, _ref, _results;
+        if (file.previewElement) {
+          file.previewElement.classList.remove("dz-file-preview");
+          file.previewElement.classList.add("dz-image-preview");
+          _ref = file.previewElement.querySelectorAll("[data-dz-thumbnail]");
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            thumbnailElement = _ref[_i];
+            thumbnailElement.alt = file.name;
+            _results.push(thumbnailElement.src = dataUrl);
+          }
+          return _results;
+        }
+      },
+      error: function(file, message) {
+        var node, _i, _len, _ref, _results;
+        if (file.previewElement) {
+          file.previewElement.classList.add("dz-error");
+          if (typeof message !== "String" && message.error) {
+            message = message.error;
+          }
+          _ref = file.previewElement.querySelectorAll("[data-dz-errormessage]");
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            node = _ref[_i];
+            _results.push(node.textContent = message);
+          }
+          return _results;
+        }
+      },
+      errormultiple: noop,
+      processing: function(file) {
+        if (file.previewElement) {
+          file.previewElement.classList.add("dz-processing");
+          if (file._removeLink) {
+            return file._removeLink.textContent = this.options.dictCancelUpload;
+          }
+        }
+      },
+      processingmultiple: noop,
+      uploadprogress: function(file, progress, bytesSent) {
+        var node, _i, _len, _ref, _results;
+        if (file.previewElement) {
+          _ref = file.previewElement.querySelectorAll("[data-dz-uploadprogress]");
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            node = _ref[_i];
+            _results.push(node.style.width = "" + progress + "%");
+          }
+          return _results;
+        }
+      },
+      totaluploadprogress: noop,
+      sending: noop,
+      sendingmultiple: noop,
+      success: function(file) {
+        if (file.previewElement) {
+          return file.previewElement.classList.add("dz-success");
+        }
+      },
+      successmultiple: noop,
+      canceled: function(file) {
+        return this.emit("error", file, "Upload canceled.");
+      },
+      canceledmultiple: noop,
+      complete: function(file) {
+        if (file._removeLink) {
+          return file._removeLink.textContent = this.options.dictRemoveFile;
+        }
+      },
+      completemultiple: noop,
+      maxfilesexceeded: noop,
+      maxfilesreached: noop,
+      previewTemplate: "<div class=\"dz-preview dz-file-preview\">\n  <div class=\"dz-details\">\n    <div class=\"dz-filename\"><span data-dz-name></span></div>\n    <div class=\"dz-size\" data-dz-size></div>\n    <img data-dz-thumbnail />\n  </div>\n  <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>\n  <div class=\"dz-success-mark\"><span>✔</span></div>\n  <div class=\"dz-error-mark\"><span>✘</span></div>\n  <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n</div>"
+    };
+
+    extend = function() {
+      var key, object, objects, target, val, _i, _len;
+      target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+      for (_i = 0, _len = objects.length; _i < _len; _i++) {
+        object = objects[_i];
+        for (key in object) {
+          val = object[key];
+          target[key] = val;
+        }
+      }
+      return target;
+    };
+
+    function Dropzone(element, options) {
+      var elementOptions, fallback, _ref;
+      this.element = element;
+      this.version = Dropzone.version;
+      this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\n*/g, "");
+      this.clickableElements = [];
+      this.listeners = [];
+      this.files = [];
+      if (typeof this.element === "string") {
+        this.element = document.querySelector(this.element);
+      }
+      if (!(this.element && (this.element.nodeType != null))) {
+        throw new Error("Invalid dropzone element.");
+      }
+      if (this.element.dropzone) {
+        throw new Error("Dropzone already attached.");
+      }
+      Dropzone.instances.push(this);
+      this.element.dropzone = this;
+      elementOptions = (_ref = Dropzone.optionsForElement(this.element)) != null ? _ref : {};
+      this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {});
+      if (this.options.forceFallback || !Dropzone.isBrowserSupported()) {
+        return this.options.fallback.call(this);
+      }
+      if (this.options.url == null) {
+        this.options.url = this.element.getAttribute("action");
+      }
+      if (!this.options.url) {
+        throw new Error("No URL provided.");
+      }
+      if (this.options.acceptedFiles && this.options.acceptedMimeTypes) {
+        throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");
+      }
+      if (this.options.acceptedMimeTypes) {
+        this.options.acceptedFiles = this.options.acceptedMimeTypes;
+        delete this.options.acceptedMimeTypes;
+      }
+      this.options.method = this.options.method.toUpperCase();
+      if ((fallback = this.getExistingFallback()) && fallback.parentNode) {
+        fallback.parentNode.removeChild(fallback);
+      }
+      if (this.options.previewsContainer !== false) {
+        if (this.options.previewsContainer) {
+          this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, "previewsContainer");
+        } else {
+          this.previewsContainer = this.element;
+        }
+      }
+      if (this.options.clickable) {
+        if (this.options.clickable === true) {
+          this.clickableElements = [this.element];
+        } else {
+          this.clickableElements = Dropzone.getElements(this.options.clickable, "clickable");
+        }
+      }
+      this.init();
+    }
+
+    Dropzone.prototype.getAcceptedFiles = function() {
+      var file, _i, _len, _ref, _results;
+      _ref = this.files;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        if (file.accepted) {
+          _results.push(file);
+        }
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.getRejectedFiles = function() {
+      var file, _i, _len, _ref, _results;
+      _ref = this.files;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        if (!file.accepted) {
+          _results.push(file);
+        }
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.getFilesWithStatus = function(status) {
+      var file, _i, _len, _ref, _results;
+      _ref = this.files;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        if (file.status === status) {
+          _results.push(file);
+        }
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.getQueuedFiles = function() {
+      return this.getFilesWithStatus(Dropzone.QUEUED);
+    };
+
+    Dropzone.prototype.getUploadingFiles = function() {
+      return this.getFilesWithStatus(Dropzone.UPLOADING);
+    };
+
+    Dropzone.prototype.getActiveFiles = function() {
+      var file, _i, _len, _ref, _results;
+      _ref = this.files;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) {
+          _results.push(file);
+        }
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.init = function() {
+      var eventName, noPropagation, setupHiddenFileInput, _i, _len, _ref, _ref1;
+      if (this.element.tagName === "form") {
+        this.element.setAttribute("enctype", "multipart/form-data");
+      }
+      if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) {
+        this.element.appendChild(Dropzone.createElement("<div class=\"dz-default dz-message\"><span>" + this.options.dictDefaultMessage + "</span></div>"));
+      }
+      if (this.clickableElements.length) {
+        setupHiddenFileInput = (function(_this) {
+          return function() {
+            if (_this.hiddenFileInput) {
+              document.body.removeChild(_this.hiddenFileInput);
+            }
+            _this.hiddenFileInput = document.createElement("input");
+            _this.hiddenFileInput.setAttribute("type", "file");
+            if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) {
+              _this.hiddenFileInput.setAttribute("multiple", "multiple");
+            }
+            _this.hiddenFileInput.className = "dz-hidden-input";
+            if (_this.options.acceptedFiles != null) {
+              _this.hiddenFileInput.setAttribute("accept", _this.options.acceptedFiles);
+            }
+            _this.hiddenFileInput.style.visibility = "hidden";
+            _this.hiddenFileInput.style.position = "absolute";
+            _this.hiddenFileInput.style.top = "0";
+            _this.hiddenFileInput.style.left = "0";
+            _this.hiddenFileInput.style.height = "0";
+            _this.hiddenFileInput.style.width = "0";
+            document.body.appendChild(_this.hiddenFileInput);
+            return _this.hiddenFileInput.addEventListener("change", function() {
+              var file, files, _i, _len;
+              files = _this.hiddenFileInput.files;
+              if (files.length) {
+                for (_i = 0, _len = files.length; _i < _len; _i++) {
+                  file = files[_i];
+                  _this.addFile(file);
+                }
+              }
+              return setupHiddenFileInput();
+            });
+          };
+        })(this);
+        setupHiddenFileInput();
+      }
+      this.URL = (_ref = window.URL) != null ? _ref : window.webkitURL;
+      _ref1 = this.events;
+      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+        eventName = _ref1[_i];
+        this.on(eventName, this.options[eventName]);
+      }
+      this.on("uploadprogress", (function(_this) {
+        return function() {
+          return _this.updateTotalUploadProgress();
+        };
+      })(this));
+      this.on("removedfile", (function(_this) {
+        return function() {
+          return _this.updateTotalUploadProgress();
+        };
+      })(this));
+      this.on("canceled", (function(_this) {
+        return function(file) {
+          return _this.emit("complete", file);
+        };
+      })(this));
+      this.on("complete", (function(_this) {
+        return function(file) {
+          if (_this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) {
+            return setTimeout((function() {
+              return _this.emit("queuecomplete");
+            }), 0);
+          }
+        };
+      })(this));
+      noPropagation = function(e) {
+        e.stopPropagation();
+        if (e.preventDefault) {
+          return e.preventDefault();
+        } else {
+          return e.returnValue = false;
+        }
+      };
+      this.listeners = [
+        {
+          element: this.element,
+          events: {
+            "dragstart": (function(_this) {
+              return function(e) {
+                return _this.emit("dragstart", e);
+              };
+            })(this),
+            "dragenter": (function(_this) {
+              return function(e) {
+                noPropagation(e);
+                return _this.emit("dragenter", e);
+              };
+            })(this),
+            "dragover": (function(_this) {
+              return function(e) {
+                var efct;
+                try {
+                  efct = e.dataTransfer.effectAllowed;
+                } catch (_error) {}
+                e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';
+                noPropagation(e);
+                return _this.emit("dragover", e);
+              };
+            })(this),
+            "dragleave": (function(_this) {
+              return function(e) {
+                return _this.emit("dragleave", e);
+              };
+            })(this),
+            "drop": (function(_this) {
+              return function(e) {
+                noPropagation(e);
+                return _this.drop(e);
+              };
+            })(this),
+            "dragend": (function(_this) {
+              return function(e) {
+                return _this.emit("dragend", e);
+              };
+            })(this)
+          }
+        }
+      ];
+      this.clickableElements.forEach((function(_this) {
+        return function(clickableElement) {
+          return _this.listeners.push({
+            element: clickableElement,
+            events: {
+              "click": function(evt) {
+                if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(".dz-message")))) {
+                  return _this.hiddenFileInput.click();
+                }
+              }
+            }
+          });
+        };
+      })(this));
+      this.enable();
+      return this.options.init.call(this);
+    };
+
+    Dropzone.prototype.destroy = function() {
+      var _ref;
+      this.disable();
+      this.removeAllFiles(true);
+      if ((_ref = this.hiddenFileInput) != null ? _ref.parentNode : void 0) {
+        this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);
+        this.hiddenFileInput = null;
+      }
+      delete this.element.dropzone;
+      return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);
+    };
+
+    Dropzone.prototype.updateTotalUploadProgress = function() {
+      var activeFiles, file, totalBytes, totalBytesSent, totalUploadProgress, _i, _len, _ref;
+      totalBytesSent = 0;
+      totalBytes = 0;
+      activeFiles = this.getActiveFiles();
+      if (activeFiles.length) {
+        _ref = this.getActiveFiles();
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          file = _ref[_i];
+          totalBytesSent += file.upload.bytesSent;
+          totalBytes += file.upload.total;
+        }
+        totalUploadProgress = 100 * totalBytesSent / totalBytes;
+      } else {
+        totalUploadProgress = 100;
+      }
+      return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent);
+    };
+
+    Dropzone.prototype._getParamName = function(n) {
+      if (typeof this.options.paramName === "function") {
+        return this.options.paramName(n);
+      } else {
+        return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : "");
+      }
+    };
+
+    Dropzone.prototype.getFallbackForm = function() {
+      var existingFallback, fields, fieldsString, form;
+      if (existingFallback = this.getExistingFallback()) {
+        return existingFallback;
+      }
+      fieldsString = "<div class=\"dz-fallback\">";
+      if (this.options.dictFallbackText) {
+        fieldsString += "<p>" + this.options.dictFallbackText + "</p>";
+      }
+      fieldsString += "<input type=\"file\" name=\"" + (this._getParamName(0)) + "\" " + (this.options.uploadMultiple ? 'multiple="multiple"' : void 0) + " /><input type=\"submit\" value=\"Upload!\"></div>";
+      fields = Dropzone.createElement(fieldsString);
+      if (this.element.tagName !== "FORM") {
+        form = Dropzone.createElement("<form action=\"" + this.options.url + "\" enctype=\"multipart/form-data\" method=\"" + this.options.method + "\"></form>");
+        form.appendChild(fields);
+      } else {
+        this.element.setAttribute("enctype", "multipart/form-data");
+        this.element.setAttribute("method", this.options.method);
+      }
+      return form != null ? form : fields;
+    };
+
+    Dropzone.prototype.getExistingFallback = function() {
+      var fallback, getFallback, tagName, _i, _len, _ref;
+      getFallback = function(elements) {
+        var el, _i, _len;
+        for (_i = 0, _len = elements.length; _i < _len; _i++) {
+          el = elements[_i];
+          if (/(^| )fallback($| )/.test(el.className)) {
+            return el;
+          }
+        }
+      };
+      _ref = ["div", "form"];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        tagName = _ref[_i];
+        if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {
+          return fallback;
+        }
+      }
+    };
+
+    Dropzone.prototype.setupEventListeners = function() {
+      var elementListeners, event, listener, _i, _len, _ref, _results;
+      _ref = this.listeners;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        elementListeners = _ref[_i];
+        _results.push((function() {
+          var _ref1, _results1;
+          _ref1 = elementListeners.events;
+          _results1 = [];
+          for (event in _ref1) {
+            listener = _ref1[event];
+            _results1.push(elementListeners.element.addEventListener(event, listener, false));
+          }
+          return _results1;
+        })());
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.removeEventListeners = function() {
+      var elementListeners, event, listener, _i, _len, _ref, _results;
+      _ref = this.listeners;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        elementListeners = _ref[_i];
+        _results.push((function() {
+          var _ref1, _results1;
+          _ref1 = elementListeners.events;
+          _results1 = [];
+          for (event in _ref1) {
+            listener = _ref1[event];
+            _results1.push(elementListeners.element.removeEventListener(event, listener, false));
+          }
+          return _results1;
+        })());
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.disable = function() {
+      var file, _i, _len, _ref, _results;
+      this.clickableElements.forEach(function(element) {
+        return element.classList.remove("dz-clickable");
+      });
+      this.removeEventListeners();
+      _ref = this.files;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        _results.push(this.cancelUpload(file));
+      }
+      return _results;
+    };
+
+    Dropzone.prototype.enable = function() {
+      this.clickableElements.forEach(function(element) {
+        return element.classList.add("dz-clickable");
+      });
+      return this.setupEventListeners();
+    };
+
+    Dropzone.prototype.filesize = function(size) {
+      var string;
+      if (size >= 1024 * 1024 * 1024 * 1024 / 10) {
+        size = size / (1024 * 1024 * 1024 * 1024 / 10);
+        string = "TiB";
+      } else if (size >= 1024 * 1024 * 1024 / 10) {
+        size = size / (1024 * 1024 * 1024 / 10);
+        string = "GiB";
+      } else if (size >= 1024 * 1024 / 10) {
+        size = size / (1024 * 1024 / 10);
+        string = "MiB";
+      } else if (size >= 1024 / 10) {
+        size = size / (1024 / 10);
+        string = "KiB";
+      } else {
+        size = size * 10;
+        string = "b";
+      }
+      return "<strong>" + (Math.round(size) / 10) + "</strong> " + string;
+    };
+
+    Dropzone.prototype._updateMaxFilesReachedClass = function() {
+      if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
+        if (this.getAcceptedFiles().length === this.options.maxFiles) {
+          this.emit('maxfilesreached', this.files);
+        }
+        return this.element.classList.add("dz-max-files-reached");
+      } else {
+        return this.element.classList.remove("dz-max-files-reached");
+      }
+    };
+
+    Dropzone.prototype.drop = function(e) {
+      var files, items;
+      if (!e.dataTransfer) {
+        return;
+      }
+      this.emit("drop", e);
+      files = e.dataTransfer.files;
+      if (files.length) {
+        items = e.dataTransfer.items;
+        if (items && items.length && (items[0].webkitGetAsEntry != null)) {
+          this._addFilesFromItems(items);
+        } else {
+          this.handleFiles(files);
+        }
+      }
+    };
+
+    Dropzone.prototype.paste = function(e) {
+      var items, _ref;
+      if ((e != null ? (_ref = e.clipboardData) != null ? _ref.items : void 0 : void 0) == null) {
+        return;
+      }
+      this.emit("paste", e);
+      items = e.clipboardData.items;
+      if (items.length) {
+        return this._addFilesFromItems(items);
+      }
+    };
+
+    Dropzone.prototype.handleFiles = function(files) {
+      var file, _i, _len, _results;
+      _results = [];
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        _results.push(this.addFile(file));
+      }
+      return _results;
+    };
+
+    Dropzone.prototype._addFilesFromItems = function(items) {
+      var entry, item, _i, _len, _results;
+      _results = [];
+      for (_i = 0, _len = items.length; _i < _len; _i++) {
+        item = items[_i];
+        if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) {
+          if (entry.isFile) {
+            _results.push(this.addFile(item.getAsFile()));
+          } else if (entry.isDirectory) {
+            _results.push(this._addFilesFromDirectory(entry, entry.name));
+          } else {
+            _results.push(void 0);
+          }
+        } else if (item.getAsFile != null) {
+          if ((item.kind == null) || item.kind === "file") {
+            _results.push(this.addFile(item.getAsFile()));
+          } else {
+            _results.push(void 0);
+          }
+        } else {
+          _results.push(void 0);
+        }
+      }
+      return _results;
+    };
+
+    Dropzone.prototype._addFilesFromDirectory = function(directory, path) {
+      var dirReader, entriesReader;
+      dirReader = directory.createReader();
+      entriesReader = (function(_this) {
+        return function(entries) {
+          var entry, _i, _len;
+          for (_i = 0, _len = entries.length; _i < _len; _i++) {
+            entry = entries[_i];
+            if (entry.isFile) {
+              entry.file(function(file) {
+                if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {
+                  return;
+                }
+                file.fullPath = "" + path + "/" + file.name;
+                return _this.addFile(file);
+              });
+            } else if (entry.isDirectory) {
+              _this._addFilesFromDirectory(entry, "" + path + "/" + entry.name);
+            }
+          }
+        };
+      })(this);
+      return dirReader.readEntries(entriesReader, function(error) {
+        return typeof console !== "undefined" && console !== null ? typeof console.log === "function" ? console.log(error) : void 0 : void 0;
+      });
+    };
+
+    Dropzone.prototype.accept = function(file, done) {
+      if (file.size > this.options.maxFilesize * 1024 * 1024) {
+        return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize));
+      } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {
+        return done(this.options.dictInvalidFileType);
+      } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
+        done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles));
+        return this.emit("maxfilesexceeded", file);
+      } else {
+        return this.options.accept.call(this, file, done);
+      }
+    };
+
+    Dropzone.prototype.addFile = function(file) {
+      file.upload = {
+        progress: 0,
+        total: file.size,
+        bytesSent: 0
+      };
+      this.files.push(file);
+      file.status = Dropzone.ADDED;
+      this.emit("addedfile", file);
+      this._enqueueThumbnail(file);
+      return this.accept(file, (function(_this) {
+        return function(error) {
+          if (error) {
+            file.accepted = false;
+            _this._errorProcessing([file], error);
+          } else {
+            file.accepted = true;
+            if (_this.options.autoQueue) {
+              _this.enqueueFile(file);
+            }
+          }
+          return _this._updateMaxFilesReachedClass();
+        };
+      })(this));
+    };
+
+    Dropzone.prototype.enqueueFiles = function(files) {
+      var file, _i, _len;
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        this.enqueueFile(file);
+      }
+      return null;
+    };
+
+    Dropzone.prototype.enqueueFile = function(file) {
+      if (file.status === Dropzone.ADDED && file.accepted === true) {
+        file.status = Dropzone.QUEUED;
+        if (this.options.autoProcessQueue) {
+          return setTimeout(((function(_this) {
+            return function() {
+              return _this.processQueue();
+            };
+          })(this)), 0);
+        }
+      } else {
+        throw new Error("This file can't be queued because it has already been processed or was rejected.");
+      }
+    };
+
+    Dropzone.prototype._thumbnailQueue = [];
+
+    Dropzone.prototype._processingThumbnail = false;
+
+    Dropzone.prototype._enqueueThumbnail = function(file) {
+      if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {
+        this._thumbnailQueue.push(file);
+        return setTimeout(((function(_this) {
+          return function() {
+            return _this._processThumbnailQueue();
+          };
+        })(this)), 0);
+      }
+    };
+
+    Dropzone.prototype._processThumbnailQueue = function() {
+      if (this._processingThumbnail || this._thumbnailQueue.length === 0) {
+        return;
+      }
+      this._processingThumbnail = true;
+      return this.createThumbnail(this._thumbnailQueue.shift(), (function(_this) {
+        return function() {
+          _this._processingThumbnail = false;
+          return _this._processThumbnailQueue();
+        };
+      })(this));
+    };
+
+    Dropzone.prototype.removeFile = function(file) {
+      if (file.status === Dropzone.UPLOADING) {
+        this.cancelUpload(file);
+      }
+      this.files = without(this.files, file);
+      this.emit("removedfile", file);
+      if (this.files.length === 0) {
+        return this.emit("reset");
+      }
+    };
+
+    Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) {
+      var file, _i, _len, _ref;
+      if (cancelIfNecessary == null) {
+        cancelIfNecessary = false;
+      }
+      _ref = this.files.slice();
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        file = _ref[_i];
+        if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {
+          this.removeFile(file);
+        }
+      }
+      return null;
+    };
+
+    Dropzone.prototype.createThumbnail = function(file, callback) {
+      var fileReader;
+      fileReader = new FileReader;
+      fileReader.onload = (function(_this) {
+        return function() {
+          var img;
+          img = document.createElement("img");
+          img.onload = function() {
+            var canvas, ctx, resizeInfo, thumbnail, _ref, _ref1, _ref2, _ref3;
+            file.width = img.width;
+            file.height = img.height;
+            resizeInfo = _this.options.resize.call(_this, file);
+            if (resizeInfo.trgWidth == null) {
+              resizeInfo.trgWidth = resizeInfo.optWidth;
+            }
+            if (resizeInfo.trgHeight == null) {
+              resizeInfo.trgHeight = resizeInfo.optHeight;
+            }
+            canvas = document.createElement("canvas");
+            ctx = canvas.getContext("2d");
+            canvas.width = resizeInfo.trgWidth;
+            canvas.height = resizeInfo.trgHeight;
+            drawImageIOSFix(ctx, img, (_ref = resizeInfo.srcX) != null ? _ref : 0, (_ref1 = resizeInfo.srcY) != null ? _ref1 : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, (_ref2 = resizeInfo.trgX) != null ? _ref2 : 0, (_ref3 = resizeInfo.trgY) != null ? _ref3 : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);
+            thumbnail = canvas.toDataURL("image/png");
+            _this.emit("thumbnail", file, thumbnail);
+            if (callback != null) {
+              return callback();
+            }
+          };
+          return img.src = fileReader.result;
+        };
+      })(this);
+      return fileReader.readAsDataURL(file);
+    };
+
+    Dropzone.prototype.processQueue = function() {
+      var i, parallelUploads, processingLength, queuedFiles;
+      parallelUploads = this.options.parallelUploads;
+      processingLength = this.getUploadingFiles().length;
+      i = processingLength;
+      if (processingLength >= parallelUploads) {
+        return;
+      }
+      queuedFiles = this.getQueuedFiles();
+      if (!(queuedFiles.length > 0)) {
+        return;
+      }
+      if (this.options.uploadMultiple) {
+        return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));
+      } else {
+        while (i < parallelUploads) {
+          if (!queuedFiles.length) {
+            return;
+          }
+          this.processFile(queuedFiles.shift());
+          i++;
+        }
+      }
+    };
+
+    Dropzone.prototype.processFile = function(file) {
+      return this.processFiles([file]);
+    };
+
+    Dropzone.prototype.processFiles = function(files) {
+      var file, _i, _len;
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        file.processing = true;
+        file.status = Dropzone.UPLOADING;
+        this.emit("processing", file);
+      }
+      if (this.options.uploadMultiple) {
+        this.emit("processingmultiple", files);
+      }
+      return this.uploadFiles(files);
+    };
+
+    Dropzone.prototype._getFilesWithXhr = function(xhr) {
+      var file, files;
+      return files = (function() {
+        var _i, _len, _ref, _results;
+        _ref = this.files;
+        _results = [];
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          file = _ref[_i];
+          if (file.xhr === xhr) {
+            _results.push(file);
+          }
+        }
+        return _results;
+      }).call(this);
+    };
+
+    Dropzone.prototype.cancelUpload = function(file) {
+      var groupedFile, groupedFiles, _i, _j, _len, _len1, _ref;
+      if (file.status === Dropzone.UPLOADING) {
+        groupedFiles = this._getFilesWithXhr(file.xhr);
+        for (_i = 0, _len = groupedFiles.length; _i < _len; _i++) {
+          groupedFile = groupedFiles[_i];
+          groupedFile.status = Dropzone.CANCELED;
+        }
+        file.xhr.abort();
+        for (_j = 0, _len1 = groupedFiles.length; _j < _len1; _j++) {
+          groupedFile = groupedFiles[_j];
+          this.emit("canceled", groupedFile);
+        }
+        if (this.options.uploadMultiple) {
+          this.emit("canceledmultiple", groupedFiles);
+        }
+      } else if ((_ref = file.status) === Dropzone.ADDED || _ref === Dropzone.QUEUED) {
+        file.status = Dropzone.CANCELED;
+        this.emit("canceled", file);
+        if (this.options.uploadMultiple) {
+          this.emit("canceledmultiple", [file]);
+        }
+      }
+      if (this.options.autoProcessQueue) {
+        return this.processQueue();
+      }
+    };
+
+    Dropzone.prototype.uploadFile = function(file) {
+      return this.uploadFiles([file]);
+    };
+
+    Dropzone.prototype.uploadFiles = function(files) {
+      var file, formData, handleError, headerName, headerValue, headers, i, input, inputName, inputType, key, option, progressObj, response, updateProgress, value, xhr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
+      xhr = new XMLHttpRequest();
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        file.xhr = xhr;
+      }
+      xhr.open(this.options.method, this.options.url, true);
+      xhr.withCredentials = !!this.options.withCredentials;
+      response = null;
+      handleError = (function(_this) {
+        return function() {
+          var _j, _len1, _results;
+          _results = [];
+          for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
+            file = files[_j];
+            _results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr));
+          }
+          return _results;
+        };
+      })(this);
+      updateProgress = (function(_this) {
+        return function(e) {
+          var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results;
+          if (e != null) {
+            progress = 100 * e.loaded / e.total;
+            for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
+              file = files[_j];
+              file.upload = {
+                progress: progress,
+                total: e.total,
+                bytesSent: e.loaded
+              };
+            }
+          } else {
+            allFilesFinished = true;
+            progress = 100;
+            for (_k = 0, _len2 = files.length; _k < _len2; _k++) {
+              file = files[_k];
+              if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) {
+                allFilesFinished = false;
+              }
+              file.upload.progress = progress;
+              file.upload.bytesSent = file.upload.total;
+            }
+            if (allFilesFinished) {
+              return;
+            }
+          }
+          _results = [];
+          for (_l = 0, _len3 = files.length; _l < _len3; _l++) {
+            file = files[_l];
+            _results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent));
+          }
+          return _results;
+        };
+      })(this);
+      xhr.onload = (function(_this) {
+        return function(e) {
+          var _ref;
+          if (files[0].status === Dropzone.CANCELED) {
+            return;
+          }
+          if (xhr.readyState !== 4) {
+            return;
+          }
+          response = xhr.responseText;
+          if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) {
+            try {
+              response = JSON.parse(response);
+            } catch (_error) {
+              e = _error;
+              response = "Invalid JSON response from server.";
+            }
+          }
+          updateProgress();
+          if (!((200 <= (_ref = xhr.status) && _ref < 300))) {
+            return handleError();
+          } else {
+            return _this._finished(files, response, e);
+          }
+        };
+      })(this);
+      xhr.onerror = (function(_this) {
+        return function() {
+          if (files[0].status === Dropzone.CANCELED) {
+            return;
+          }
+          return handleError();
+        };
+      })(this);
+      progressObj = (_ref = xhr.upload) != null ? _ref : xhr;
+      progressObj.onprogress = updateProgress;
+      headers = {
+        "Accept": "application/json",
+        "Cache-Control": "no-cache",
+        "X-Requested-With": "XMLHttpRequest"
+      };
+      if (this.options.headers) {
+        extend(headers, this.options.headers);
+      }
+      for (headerName in headers) {
+        headerValue = headers[headerName];
+        xhr.setRequestHeader(headerName, headerValue);
+      }
+      formData = new FormData();
+      if (this.options.params) {
+        _ref1 = this.options.params;
+        for (key in _ref1) {
+          value = _ref1[key];
+          formData.append(key, value);
+        }
+      }
+      for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
+        file = files[_j];
+        this.emit("sending", file, xhr, formData);
+      }
+      if (this.options.uploadMultiple) {
+        this.emit("sendingmultiple", files, xhr, formData);
+      }
+      if (this.element.tagName === "FORM") {
+        _ref2 = this.element.querySelectorAll("input, textarea, select, button");
+        for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
+          input = _ref2[_k];
+          inputName = input.getAttribute("name");
+          inputType = input.getAttribute("type");
+          if (input.tagName === "SELECT" && input.hasAttribute("multiple")) {
+            _ref3 = input.options;
+            for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
+              option = _ref3[_l];
+              if (option.selected) {
+                formData.append(inputName, option.value);
+              }
+            }
+          } else if (!inputType || ((_ref4 = inputType.toLowerCase()) !== "checkbox" && _ref4 !== "radio") || input.checked) {
+            formData.append(inputName, input.value);
+          }
+        }
+      }
+      for (i = _m = 0, _ref5 = files.length - 1; 0 <= _ref5 ? _m <= _ref5 : _m >= _ref5; i = 0 <= _ref5 ? ++_m : --_m) {
+        formData.append(this._getParamName(i), files[i], files[i].name);
+      }
+      return xhr.send(formData);
+    };
+
+    Dropzone.prototype._finished = function(files, responseText, e) {
+      var file, _i, _len;
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        file.status = Dropzone.SUCCESS;
+        this.emit("success", file, responseText, e);
+        this.emit("complete", file);
+      }
+      if (this.options.uploadMultiple) {
+        this.emit("successmultiple", files, responseText, e);
+        this.emit("completemultiple", files);
+      }
+      if (this.options.autoProcessQueue) {
+        return this.processQueue();
+      }
+    };
+
+    Dropzone.prototype._errorProcessing = function(files, message, xhr) {
+      var file, _i, _len;
+      for (_i = 0, _len = files.length; _i < _len; _i++) {
+        file = files[_i];
+        file.status = Dropzone.ERROR;
+        this.emit("error", file, message, xhr);
+        this.emit("complete", file);
+      }
+      if (this.options.uploadMultiple) {
+        this.emit("errormultiple", files, message, xhr);
+        this.emit("completemultiple", files);
+      }
+      if (this.options.autoProcessQueue) {
+        return this.processQueue();
+      }
+    };
+
+    return Dropzone;
+
+  })(Em);
+
+  Dropzone.version = "3.10.2";
+
+  Dropzone.options = {};
+
+  Dropzone.optionsForElement = function(element) {
+    if (element.getAttribute("id")) {
+      return Dropzone.options[camelize(element.getAttribute("id"))];
+    } else {
+      return void 0;
+    }
+  };
+
+  Dropzone.instances = [];
+
+  Dropzone.forElement = function(element) {
+    if (typeof element === "string") {
+      element = document.querySelector(element);
+    }
+    if ((element != null ? element.dropzone : void 0) == null) {
+      throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");
+    }
+    return element.dropzone;
+  };
+
+  Dropzone.autoDiscover = true;
+
+  Dropzone.discover = function() {
+    var checkElements, dropzone, dropzones, _i, _len, _results;
+    if (document.querySelectorAll) {
+      dropzones = document.querySelectorAll(".dropzone");
+    } else {
+      dropzones = [];
+      checkElements = function(elements) {
+        var el, _i, _len, _results;
+        _results = [];
+        for (_i = 0, _len = elements.length; _i < _len; _i++) {
+          el = elements[_i];
+          if (/(^| )dropzone($| )/.test(el.className)) {
+            _results.push(dropzones.push(el));
+          } else {
+            _results.push(void 0);
+          }
+        }
+        return _results;
+      };
+      checkElements(document.getElementsByTagName("div"));
+      checkElements(document.getElementsByTagName("form"));
+    }
+    _results = [];
+    for (_i = 0, _len = dropzones.length; _i < _len; _i++) {
+      dropzone = dropzones[_i];
+      if (Dropzone.optionsForElement(dropzone) !== false) {
+        _results.push(new Dropzone(dropzone));
+      } else {
+        _results.push(void 0);
+      }
+    }
+    return _results;
+  };
+
+  Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\/12/i];
+
+  Dropzone.isBrowserSupported = function() {
+    var capableBrowser, regex, _i, _len, _ref;
+    capableBrowser = true;
+    if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {
+      if (!("classList" in document.createElement("a"))) {
+        capableBrowser = false;
+      } else {
+        _ref = Dropzone.blacklistedBrowsers;
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          regex = _ref[_i];
+          if (regex.test(navigator.userAgent)) {
+            capableBrowser = false;
+            continue;
+          }
+        }
+      }
+    } else {
+      capableBrowser = false;
+    }
+    return capableBrowser;
+  };
+
+  without = function(list, rejectedItem) {
+    var item, _i, _len, _results;
+    _results = [];
+    for (_i = 0, _len = list.length; _i < _len; _i++) {
+      item = list[_i];
+      if (item !== rejectedItem) {
+        _results.push(item);
+      }
+    }
+    return _results;
+  };
+
+  camelize = function(str) {
+    return str.replace(/[\-_](\w)/g, function(match) {
+      return match.charAt(1).toUpperCase();
+    });
+  };
+
+  Dropzone.createElement = function(string) {
+    var div;
+    div = document.createElement("div");
+    div.innerHTML = string;
+    return div.childNodes[0];
+  };
+
+  Dropzone.elementInside = function(element, container) {
+    if (element === container) {
+      return true;
+    }
+    while (element = element.parentNode) {
+      if (element === container) {
+        return true;
+      }
+    }
+    return false;
+  };
+
+  Dropzone.getElement = function(el, name) {
+    var element;
+    if (typeof el === "string") {
+      element = document.querySelector(el);
+    } else if (el.nodeType != null) {
+      element = el;
+    }
+    if (element == null) {
+      throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element.");
+    }
+    return element;
+  };
+
+  Dropzone.getElements = function(els, name) {
+    var e, el, elements, _i, _j, _len, _len1, _ref;
+    if (els instanceof Array) {
+      elements = [];
+      try {
+        for (_i = 0, _len = els.length; _i < _len; _i++) {
+          el = els[_i];
+          elements.push(this.getElement(el, name));
+        }
+      } catch (_error) {
+        e = _error;
+        elements = null;
+      }
+    } else if (typeof els === "string") {
+      elements = [];
+      _ref = document.querySelectorAll(els);
+      for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
+        el = _ref[_j];
+        elements.push(el);
+      }
+    } else if (els.nodeType != null) {
+      elements = [els];
+    }
+    if (!((elements != null) && elements.length)) {
+      throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");
+    }
+    return elements;
+  };
+
+  Dropzone.confirm = function(question, accepted, rejected) {
+    if (window.confirm(question)) {
+      return accepted();
+    } else if (rejected != null) {
+      return rejected();
+    }
+  };
+
+  Dropzone.isValidFile = function(file, acceptedFiles) {
+    var baseMimeType, mimeType, validType, _i, _len;
+    if (!acceptedFiles) {
+      return true;
+    }
+    acceptedFiles = acceptedFiles.split(",");
+    mimeType = file.type;
+    baseMimeType = mimeType.replace(/\/.*$/, "");
+    for (_i = 0, _len = acceptedFiles.length; _i < _len; _i++) {
+      validType = acceptedFiles[_i];
+      validType = validType.trim();
+      if (validType.charAt(0) === ".") {
+        if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {
+          return true;
+        }
+      } else if (/\/\*$/.test(validType)) {
+        if (baseMimeType === validType.replace(/\/.*$/, "")) {
+          return true;
+        }
+      } else {
+        if (mimeType === validType) {
+          return true;
+        }
+      }
+    }
+    return false;
+  };
+
+  if (typeof jQuery !== "undefined" && jQuery !== null) {
+    jQuery.fn.dropzone = function(options) {
+      return this.each(function() {
+        return new Dropzone(this, options);
+      });
+    };
+  }
+
+  if (typeof module !== "undefined" && module !== null) {
+    module.exports = Dropzone;
+  } else {
+    window.Dropzone = Dropzone;
+  }
+
+  Dropzone.ADDED = "added";
+
+  Dropzone.QUEUED = "queued";
+
+  Dropzone.ACCEPTED = Dropzone.QUEUED;
+
+  Dropzone.UPLOADING = "uploading";
+
+  Dropzone.PROCESSING = Dropzone.UPLOADING;
+
+  Dropzone.CANCELED = "canceled";
+
+  Dropzone.ERROR = "error";
+
+  Dropzone.SUCCESS = "success";
+
+
+  /*
+  
+  Bugfix for iOS 6 and 7
+  Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
+  based on the work of https://github.com/stomita/ios-imagefile-megapixel
+   */
+
+  detectVerticalSquash = function(img) {
+    var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy;
+    iw = img.naturalWidth;
+    ih = img.naturalHeight;
+    canvas = document.createElement("canvas");
+    canvas.width = 1;
+    canvas.height = ih;
+    ctx = canvas.getContext("2d");
+    ctx.drawImage(img, 0, 0);
+    data = ctx.getImageData(0, 0, 1, ih).data;
+    sy = 0;
+    ey = ih;
+    py = ih;
+    while (py > sy) {
+      alpha = data[(py - 1) * 4 + 3];
+      if (alpha === 0) {
+        ey = py;
+      } else {
+        sy = py;
+      }
+      py = (ey + sy) >> 1;
+    }
+    ratio = py / ih;
+    if (ratio === 0) {
+      return 1;
+    } else {
+      return ratio;
+    }
+  };
+
+  drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
+    var vertSquashRatio;
+    vertSquashRatio = detectVerticalSquash(img);
+    return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
+  };
+
+
+  /*
+   * contentloaded.js
+   *
+   * Author: Diego Perini (diego.perini at gmail.com)
+   * Summary: cross-browser wrapper for DOMContentLoaded
+   * Updated: 20101020
+   * License: MIT
+   * Version: 1.2
+   *
+   * URL:
+   * http://javascript.nwbox.com/ContentLoaded/
+   * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
+   */
+
+  contentLoaded = function(win, fn) {
+    var add, doc, done, init, poll, pre, rem, root, top;
+    done = false;
+    top = true;
+    doc = win.document;
+    root = doc.documentElement;
+    add = (doc.addEventListener ? "addEventListener" : "attachEvent");
+    rem = (doc.addEventListener ? "removeEventListener" : "detachEvent");
+    pre = (doc.addEventListener ? "" : "on");
+    init = function(e) {
+      if (e.type === "readystatechange" && doc.readyState !== "complete") {
+        return;
+      }
+      (e.type === "load" ? win : doc)[rem](pre + e.type, init, false);
+      if (!done && (done = true)) {
+        return fn.call(win, e.type || e);
+      }
+    };
+    poll = function() {
+      var e;
+      try {
+        root.doScroll("left");
+      } catch (_error) {
+        e = _error;
+        setTimeout(poll, 50);
+        return;
+      }
+      return init("poll");
+    };
+    if (doc.readyState !== "complete") {
+      if (doc.createEventObject && root.doScroll) {
+        try {
+          top = !win.frameElement;
+        } catch (_error) {}
+        if (top) {
+          poll();
+        }
+      }
+      doc[add](pre + "DOMContentLoaded", init, false);
+      doc[add](pre + "readystatechange", init, false);
+      return win[add](pre + "load", init, false);
+    }
+  };
+
+  Dropzone._autoDiscoverFunction = function() {
+    if (Dropzone.autoDiscover) {
+      return Dropzone.discover();
+    }
+  };
+
+  contentLoaded(window, Dropzone._autoDiscoverFunction);
+
+}).call(this);
+
+});
+
+if (typeof exports == "object") {
+  module.exports = require("dropzone");
+} else if (typeof define == "function" && define.amd) {
+  define([], function(){ return require("dropzone"); });
+} else {
+  this["Dropzone"] = require("dropzone");
+}
+})()
diff --git a/deployment-scripts/static/js/bootstrap/bootstrap.js b/deployment-scripts/static/js/bootstrap/bootstrap.js
new file mode 100644
index 0000000..53da1c7
--- /dev/null
+++ b/deployment-scripts/static/js/bootstrap/bootstrap.js
@@ -0,0 +1,2114 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.2.0
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.2.0
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.2.0'
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.hasClass('alert') ? $this : $this.parent()
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(150) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.2.0
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.2.0'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state = state + 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    $el[val](data[state] == null ? this.options[state] : data[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+        else $parent.find('.active').removeClass('active')
+      }
+      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+    }
+
+    if (changed) this.$element.toggleClass('active')
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    Plugin.call($btn, 'toggle')
+    e.preventDefault()
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.2.0
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      =
+    this.sliding     =
+    this.interval    =
+    this.$active     =
+    this.$items      = null
+
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.2.0'
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || $active[type]()
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var fallback  = type == 'next' ? 'first' : 'last'
+    var that      = this
+
+    if (!$next.length) {
+      if (!this.options.wrap) return
+      $next = this.$element.find('.item')[fallback]()
+    }
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  })
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.2.0
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.transitioning = null
+
+    if (this.options.parent) this.$parent = $(this.options.parent)
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.2.0'
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var actives = this.$parent && this.$parent.find('> .panel > .in')
+
+    if (actives && actives.length) {
+      var hasData = actives.data('bs.collapse')
+      if (hasData && hasData.transitioning) return
+      Plugin.call(actives, 'hide')
+      hasData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse')
+      .removeClass('in')
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .trigger('hidden.bs.collapse')
+        .removeClass('collapsing')
+        .addClass('collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(350)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && option == 'show') option = !option
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var href
+    var $this   = $(this)
+    var target  = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+    var $target = $(target)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+    var parent  = $this.attr('data-parent')
+    var $parent = parent && $(parent)
+
+    if (!data || !data.transitioning) {
+      if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
+      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    }
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.2.0
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.2.0'
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.trigger('focus')
+
+      $parent
+        .toggleClass('open')
+        .trigger('shown.bs.dropdown', relatedTarget)
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27)/.test(e.keyCode)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive || (isActive && e.keyCode == 27)) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.divider):visible a'
+    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index($items.filter(':focus'))
+
+    if (e.keyCode == 38 && index > 0)                 index--                        // up
+    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+    if (!~index)                                      index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $parent = getParent($(this))
+      var relatedTarget = { relatedTarget: this }
+      if (!$parent.hasClass('open')) return
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+      if (e.isDefaultPrevented()) return
+      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.2.0
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options        = options
+    this.$body          = $(document.body)
+    this.$element       = $(element)
+    this.$backdrop      =
+    this.isShown        = null
+    this.scrollbarWidth = 0
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.2.0'
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.setScrollbar()
+    this.escape()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element
+        .addClass('in')
+        .attr('aria-hidden', false)
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$element.find('.modal-dialog') // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(300) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.$body.removeClass('modal-open')
+
+    this.resetScrollbar()
+    this.escape()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .attr('aria-hidden', true)
+      .off('click.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(300) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keyup.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus.call(this.$element[0])
+          : this.hide.call(this)
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(150) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(150) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    if (document.body.clientWidth >= window.innerWidth) return
+    this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', '')
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.2.0
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       =
+    this.options    =
+    this.enabled    =
+    this.timeout    =
+    this.hoverState =
+    this.$element   = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.2.0'
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(document.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var $parent      = this.$element.parent()
+        var parentDim    = this.getPosition($parent)
+
+        placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :
+                    placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :
+                    placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :
+                    placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(150) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  = offset.top  + marginTop
+    offset.left = offset.left + marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowPosition       = delta.left ? 'left'        : 'top'
+    var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
+    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function () {
+    var that = this
+    var $tip = this.tip()
+    var e    = $.Event('hide.bs.' + this.type)
+
+    this.$element.removeAttr('aria-describedby')
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      that.$element.trigger('hidden.bs.' + that.type)
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && this.$tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(150) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
+      scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
+      width:  isBody ? $(window).width()  : $element.outerWidth(),
+      height: isBody ? $(window).height() : $element.outerHeight()
+    }, isBody ? { top: 0, left: 0 } : $element.offset())
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    return (this.$tip = this.$tip || $(this.options.template))
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.validate = function () {
+    if (!this.$element[0].parentNode) {
+      this.hide()
+      this.$element = null
+      this.options  = null
+    }
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+  }
+
+  Tooltip.prototype.destroy = function () {
+    clearTimeout(this.timeout)
+    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.2.0
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.2.0'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+  Popover.prototype.tip = function () {
+    if (!this.$tip) this.$tip = $(this.options.template)
+    return this.$tip
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.2.0
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    var process  = $.proxy(this.process, this)
+
+    this.$body          = $('body')
+    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', process)
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.2.0'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var offsetMethod = 'offset'
+    var offsetBase   = 0
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.offsets = []
+    this.targets = []
+    this.scrollHeight = this.getScrollHeight()
+
+    var self     = this
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        self.offsets.push(this[0])
+        self.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop <= offsets[0]) {
+      return activeTarget != (i = targets[0]) && this.activate(i)
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+
+    var selector = this.selector +
+        '[data-target="' + target + '"],' +
+        this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.2.0
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.VERSION = '3.2.0'
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var previous = $ul.find('.active:last a')[0]
+    var e        = $.Event('show.bs.tab', {
+      relatedTarget: previous
+    })
+
+    $this.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: previous
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && $active.hasClass('fade')
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+        .removeClass('active')
+
+      element.addClass('active')
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu')) {
+        element.closest('li.dropdown').addClass('active')
+      }
+
+      callback && callback()
+    }
+
+    transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(150) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.2.0
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      =
+    this.unpin        =
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.2.0'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :
+                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false
+
+    if (this.affixed === affix) return
+    if (this.unpin != null) this.$element.css('top', '')
+
+    var affixType = 'affix' + (affix ? '-' + affix : '')
+    var e         = $.Event(affixType + '.bs.affix')
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+    this.$element
+      .removeClass(Affix.RESET)
+      .addClass(affixType)
+      .trigger($.Event(affixType.replace('affix', 'affixed')))
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - this.$element.height() - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop)    data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/deployment-scripts/static/js/bootstrap/bootstrap.min.js b/deployment-scripts/static/js/bootstrap/bootstrap.min.js
new file mode 100644
index 0000000..7c1561a
--- /dev/null
+++ b/deployment-scripts/static/js/bootstrap/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/deployment-scripts/static/results/fc93674b-b8e8-4c32-bd99-c67fe8e4b71f/scenario.log b/deployment-scripts/static/results/fc93674b-b8e8-4c32-bd99-c67fe8e4b71f/scenario.log
new file mode 100644
index 0000000..5d2e57d
--- /dev/null
+++ b/deployment-scripts/static/results/fc93674b-b8e8-4c32-bd99-c67fe8e4b71f/scenario.log
@@ -0,0 +1,12 @@
+2014/07/25 09:59:38 INFO  - jmeter.util.JMeterUtils: Setting Locale to en_US 
+2014/07/25 09:59:38 INFO  - jmeter.JMeter: Loading user properties from: /home/ubuntu/jmeter/bin/user.properties 
+2014/07/25 09:59:38 INFO  - jmeter.JMeter: Loading system properties from: /home/ubuntu/jmeter/bin/system.properties 
+2014/07/25 09:59:38 FATAL - jmeter.JMeter: An error occurred:  java.lang.IllegalArgumentException: Unknown arg: scenario.jtl
+	at org.apache.jmeter.JMeter.initializeProperties(JMeter.java:602)
+	at org.apache.jmeter.JMeter.start(JMeter.java:294)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.lang.reflect.Method.invoke(Method.java:606)
+	at org.apache.jmeter.NewDriver.main(NewDriver.java:259)
+
diff --git a/deployment-scripts/webservice/__init__.py b/deployment-scripts/webservice/__init__.py
new file mode 100644
index 0000000..46faaf4
--- /dev/null
+++ b/deployment-scripts/webservice/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import absolute_import
+
+# This will make sure the app is always imported when
+# Django starts so that shared_task will use this app.
+from .celery import app as celery_app
\ No newline at end of file
diff --git a/deployment-scripts/webservice/celery.py b/deployment-scripts/webservice/celery.py
new file mode 100644
index 0000000..a980a98
--- /dev/null
+++ b/deployment-scripts/webservice/celery.py
@@ -0,0 +1,14 @@
+from __future__ import absolute_import
+
+import os
+from celery import Celery
+
+from django.conf import settings
+
+# set the default Django settings module for the 'celery' program.
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webservice.settings')
+
+app = Celery('webservice')
+
+app.config_from_object('django.conf:settings')
+app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
\ No newline at end of file
diff --git a/deployment-scripts/webservice/protractor_tests/conf.js b/deployment-scripts/webservice/protractor_tests/conf.js
new file mode 100644
index 0000000..3d691b0
--- /dev/null
+++ b/deployment-scripts/webservice/protractor_tests/conf.js
@@ -0,0 +1,4 @@
+exports.config = {
+  seleniumAddress: 'http://localhost:4444/wd/hub',
+  specs: ['spec.js']
+}
\ No newline at end of file
diff --git a/deployment-scripts/webservice/settings.py b/deployment-scripts/webservice/settings.py
new file mode 100644
index 0000000..d857889
--- /dev/null
+++ b/deployment-scripts/webservice/settings.py
@@ -0,0 +1,141 @@
+"""
+Django settings for webservice project.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.6/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.6/ref/settings/
+"""
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+import os
+import sys
+
+BASE_DIR = os.path.dirname(os.path.dirname(__file__))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '_6dtw5%4bwz32*8^n#(+ywu%h#048u%czmw*y%no)cz&z5pdn6'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = False
+
+TEMPLATE_DEBUG = True
+
+ALLOWED_HOSTS = ['dummy-host.com']
+
+
+# Application definition
+
+INSTALLED_APPS = (
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'form',
+    'workers',
+    'common',
+    'workers',
+    'results',
+    'south',
+    'gunicorn'
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+)
+
+ROOT_URLCONF = 'webservice.urls'
+
+WSGI_APPLICATION = 'webservice.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    }
+}
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.6/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/1.6/howto/static-files/
+
+STATIC_URL = '/static/'
+STATIC_ROOT = '/path/to/webapp/static'
+
+STATICFILES_DIRS = (
+    os.path.join(BASE_DIR, "static"),
+    '%s/static/' % BASE_DIR
+)
+
+#TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'form/templates'),
+#                 os.path.join(BASE_DIR, 'distributedjmeter/templates')]
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'handlers': {
+        'file': {
+            'level': 'INFO',
+            'class': 'logging.FileHandler',
+            'filename': 'debug.log',
+        },
+        'console' : {
+            'level' : 'INFO',
+            'class' : 'logging.StreamHandler',
+            'stream' : sys.stdout
+        }
+    },
+    'loggers': {
+        # '' : {
+        #   'handlers' : ['file', 'console'],
+        #   'level' : 'INFO',
+        #   'propagate' : True,
+        # },
+        # '' : {
+        #   'handlers' : ['file', 'console'],
+        #   'level' : 'DEBUG',
+        #   'propagate' : True,
+        # },
+        '' : {
+          'handlers' : ['file', 'console'],
+          'level' : 'INFO',
+          'propagate' : True,
+        },
+    },
+}
+
+CELERY_ALWAYS_EAGER = False
+MUTE = False
+
+try:
+    from settings_local import *
+except Exception as e:
+    pass
diff --git a/deployment-scripts/webservice/settings_local.py b/deployment-scripts/webservice/settings_local.py
new file mode 100644
index 0000000..ac3062b
--- /dev/null
+++ b/deployment-scripts/webservice/settings_local.py
@@ -0,0 +1,3 @@
+DEBUG = True
+CELERY_ALWAYS_EAGER = True
+MUTE = False
\ No newline at end of file
diff --git a/deployment-scripts/webservice/static/img/logo-CloudScale.png b/deployment-scripts/webservice/static/img/logo-CloudScale.png
new file mode 100644
index 0000000..3500f6c
Binary files /dev/null and b/deployment-scripts/webservice/static/img/logo-CloudScale.png differ
diff --git a/deployment-scripts/webservice/templates/home.html b/deployment-scripts/webservice/templates/home.html
new file mode 100644
index 0000000..9332b5a
--- /dev/null
+++ b/deployment-scripts/webservice/templates/home.html
@@ -0,0 +1,50 @@
+{% extends "layout.html" %}
+{% block content %}
+
+		<div class="row">
+			<div class="col-md-4">
+				<div class="thumbnail">
+					<div class="caption" >
+						<h4><a href="/wiki">Wiki</a></h4>
+						<p>
+							Cloudscale project wiki with content and materials that we produced during project.
+						</p>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4">
+				<div class="thumbnail">
+					<div class="caption">
+						<h4><a href="/cse">Cloudscale Environment</a></h4>
+						<p>
+							Installation packages for Cloudscale Enviroment for Windows, Linux and Mac OSX.
+						</p>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4">
+				<div class="thumbnail">
+					<div class="caption">
+						<h4><a href="/showcase/">Showcase</a></h4>
+						<p>
+							Legacy, MySQL and MongoDB version of showcase for Cloudscale Environment.
+						</p>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="row" style="margin-top: 22px;">
+			<div class="col-md-4">
+				<div class="thumbnail">
+					<div class="caption">
+						<h4><a href="/distributed-jmeter/">Distributed JMeter</a></h4>
+						<p>
+							Distributed JMeter on Amazon Web Services.
+						</p>
+					</div>
+				</div>
+			</div>
+
+		</div>
+	</div>
+{% endblock %}
diff --git a/deployment-scripts/webservice/templates/layout.html b/deployment-scripts/webservice/templates/layout.html
new file mode 100644
index 0000000..5125c37
--- /dev/null
+++ b/deployment-scripts/webservice/templates/layout.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>{% block title %}CloudScale Environment{% endblock %}</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <!-- Bootstrap -->
+    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
+    <link href="css/custom.css" rel="stylesheet" media="screen">
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+    <!--[if lt IE 9]>
+      <script src="../../assets/js/html5shiv.js"></script>
+      <script src="../../assets/js/respond.min.js"></script>
+    <![endif]-->
+    <style type="text/css">
+        .col-md-4 {
+            cursor: pointer;
+        }
+
+        .col-md-4 .thumbnail {
+            height: 160px;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <div class="page-header">
+        <a href="/"><img src="images/logo-CloudScale.png"></a>
+    </div>
+    {% block content %}
+    {% endblock %}
+    <script type="text/javascript">
+    $(document).ready(function () {
+        $(".col-md-4").click(function () {
+            window.location = $(this).find("a").attr("href");
+        })
+    })
+    </script>
+</div>
+</body>
diff --git a/deployment-scripts/webservice/urls.py b/deployment-scripts/webservice/urls.py
new file mode 100644
index 0000000..4fa6747
--- /dev/null
+++ b/deployment-scripts/webservice/urls.py
@@ -0,0 +1,14 @@
+from django.conf.urls import patterns, include, url
+
+from django.contrib import admin
+from django.views.generic import TemplateView
+import form
+
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    url(r'^$', TemplateView.as_view(template_name='form/home.html'), name='home'),
+    url(r'^form/', include('form.urls'), name='form'),
+    url(r'^results/(?P<task_id>.+)$', 'results.views.task', name='task'),
+    url(r'^admin/', include(admin.site.urls)),
+)
diff --git a/deployment-scripts/webservice/wsgi.py b/deployment-scripts/webservice/wsgi.py
new file mode 100644
index 0000000..b7d94a5
--- /dev/null
+++ b/deployment-scripts/webservice/wsgi.py
@@ -0,0 +1,14 @@
+"""
+WSGI config for webservice project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
+"""
+
+import os
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webservice.settings")
+
+from django.core.wsgi import get_wsgi_application
+application = get_wsgi_application()
diff --git a/deployment-scripts/workers/__init__.py b/deployment-scripts/workers/__init__.py
new file mode 100644
index 0000000..8f76346
--- /dev/null
+++ b/deployment-scripts/workers/__init__.py
@@ -0,0 +1 @@
+__author__ = 'ivansek'
diff --git a/deployment-scripts/workers/backend.py b/deployment-scripts/workers/backend.py
new file mode 100644
index 0000000..94dce78
--- /dev/null
+++ b/deployment-scripts/workers/backend.py
@@ -0,0 +1,18 @@
+from scripts.infrastructure.openstack import openstack_create_mysql_instances, openstack_create_mongodb_instances
+from scripts.platform.aws import configure_rds
+
+
+class Backend:
+
+    def __init__(self, config, logger):
+        self.config = config
+        self.logger = logger
+
+    def setup_rds(self):
+        configure_rds.ConfigureRDS(self.config, self.logger)
+
+    def setup_openstack_mysql(self):
+        openstack_create_mysql_instances.ConfigureMySQL(self.config, self.logger)
+
+    def setup_openstack_mongodb(self):
+        openstack_create_mongodb_instances.ConfigureMongodb(self.config, self.logger)
diff --git a/deployment-scripts/workers/config.py b/deployment-scripts/workers/config.py
new file mode 100644
index 0000000..59842b2
--- /dev/null
+++ b/deployment-scripts/workers/config.py
@@ -0,0 +1,52 @@
+import os
+import uuid
+from scripts.common.Cloudscale import read_config
+from webservice.settings import BASE_DIR
+
+class Config:
+
+    def __init__(self, data, user_path):
+        self.data = data
+        self.provider = data.get('provider')
+        self.db_provider = data.get('db_provider')
+        self.config_path = '%s/config.ini' % user_path
+        self.user_path = user_path
+        self.cfg = read_config(self.config_path)
+
+        self.fr = data.get('fr')
+        self.db = data.get('db')
+
+        if self.provider == "aws":
+            self.save('EC2', 'aws_access_key_id', self.fr.get('access_key'))
+            self.save('EC2', 'aws_secret_access_key', self.fr.get('secret_key'))
+            self.save('EC2', 'instance_type', self.fr.get('instance_type'))
+            self.save('EC2', 'key_name', 'cloudscale')
+
+
+            self.save('RDS', 'generate_dump_path', '%s/scripts/rds-tpcw-dump-latest.sql' % BASE_DIR)
+            self.save('RDS', 'instance_type', self.db.get('instance_type'))
+            self.save('RDS', 'num_replicas', str(0) if self.db.get('num_replicas') is None else str(self.db.get('num_replicas')))
+            # self.save('RDS', 'master-identifier', 'cs%s' % str(uuid.uuid4()).split('-')[0])
+        else:
+            if self.fr.get('own_inftastructure') == 'yes':
+                self.save('OPENSTACK', 'username', self.fr.get('username'))
+                self.save('OPENSTACK', 'password', self.fr.get('password'))
+                self.save('OPENSTACK', 'tenant_name', self.fr.get('tenant'))
+                self.save('OPENSTACK', 'auth_url', self.fr.get('auth_url'))
+                self.save('OPENSTACK', 'image_name', self.fr.get('image'))
+                self.save('OPENSTACK', 'image_username', self.fr.get('image_username'))
+            self.save('OPENSTACK', 'instance_type', self.fr.get('flavor'))
+            self.save('OPENSTACK', 'database_type', self.db_provider)
+
+            self.save('MYSQL', 'instance_type', self.db.get('flavor'))
+
+            self.save('MYSQL', 'num_replicas', self.db.get('num_instances'))
+            self.save('MYSQL', 'connection_pool_size', self.db.get('connection_pool_size'))
+
+            self.save('MONGODB', 'instance_type', self.db.get('flavor'))
+            self.save('MONGODB', 'num_replicas', self.db.get('num_shards'))
+            self.save('MONGODB', 'connection_pool_size', self.db.get('connection_pool_size'))
+
+    def save(self, section, variable, value):
+        self.cfg.save_option(self.config_path, section, variable, str(value))
+
diff --git a/deployment-scripts/workers/frontend.py b/deployment-scripts/workers/frontend.py
new file mode 100644
index 0000000..0d8f404
--- /dev/null
+++ b/deployment-scripts/workers/frontend.py
@@ -0,0 +1,72 @@
+import os
+import uuid
+from scripts.infrastructure.openstack import openstack_create_showcase_instances, openstack_create_balancer_instance
+from scripts.infrastructure.aws import aws_create_keypair, aws_create_loadbalancer, aws_create_instance, aws_create_autoscalability, aws_create_ami
+from scripts.software import deploy_showcase
+from webservice.settings import BASE_DIR
+
+
+class Frontend:
+
+    def __init__(self, config, logger):
+        self.config = config
+        self.logger=logger
+
+    def setup_aws_frontend(self):
+        i = aws_create_keypair.CreateKeyPair(
+            config=self.config,
+        )
+        i.create()
+
+        self.config.save('EC2', 'key_pair', "%s/%s.pem" % (self.config.user_path, self.config.cfg.get('EC2', 'key_name')))
+
+        showcase_url = None
+        if self.config.fr.get('autoscaling') == 'no':
+            instances = []
+            i = aws_create_instance.CreateEC2Instance(cfg=self.config.cfg, logger=self.logger)
+            ip_addresses = []
+            for _ in xrange(self.config.fr.get('num_instances')):
+                instance = i.create()
+                instances.append(instance)
+                ip_addresses.append(instance.ip_address)
+
+            self.config.save('infrastructure', 'ip_address', ','.join(ip_addresses))
+            self.config.save('infrastructure', 'remote_user', 'ubuntu')
+
+            loadbalancer = None
+            if len(instances) > 1:
+                i = aws_create_loadbalancer.CreateLoadbalancer(
+                    instances=instances,
+                    config=self.config,
+                    logger=self.logger
+                )
+                loadbalancer = i.create()
+
+            deploy_showcase.DeploySoftware(config=self.config, logger=self.logger)
+
+            showcase_url = loadbalancer.dns_name if loadbalancer else instances[0].ip_address
+
+        elif self.config.fr.get('autoscaling') == 'yes':
+            i = aws_create_instance.CreateEC2Instance(cfg=self.config.cfg, logger=self.logger)
+            instance = i.create()
+            self.config.save('infrastructure', 'ip_address', instance.ip_address)
+            self.config.save('infrastructure', 'remote_user', 'ubuntu')
+
+            deploy_showcase.DeploySoftware(config=self.config, logger=self.logger)
+
+            aws_create_ami.EC2CreateAMI(config=self.config, logger=self.logger)
+
+            autoscalability = aws_create_autoscalability.Autoscalability(
+                config=self.config,
+                key_pair=self.config.cfg.get('EC2', 'key_pair'),
+                key_name=self.config.cfg.get('EC2', 'key_name'),
+                logger=self.logger
+            )
+            showcase_url = autoscalability.create()
+
+        return showcase_url
+
+    def setup_openstack_frontend(self):
+        openstack_create_showcase_instances.CreateInstance(self.config, self.logger)
+        public_ip = openstack_create_balancer_instance.CreateInstance(self.config, self.logger).get_public_ip()
+        return public_ip
diff --git a/deployment-scripts/workers/tasks.py b/deployment-scripts/workers/tasks.py
new file mode 100644
index 0000000..cce89d9
--- /dev/null
+++ b/deployment-scripts/workers/tasks.py
@@ -0,0 +1,36 @@
+from scripts.infrastructure.aws.aws_create_keypair import CreateKeyPair
+from scripts.infrastructure.openstack import openstack_remove_all
+from webservice.celery import app
+from workers.backend import Backend
+from workers.config import Config
+from workers.frontend import Frontend
+import xml.etree.ElementTree as ET
+
+@app.task
+def setup(config, user_path, logger):
+        setup_backend(config, logger)
+        setup_frontend(config, logger)
+
+def setup_backend(config, logger):
+    backend = Backend(config, logger)
+
+    if config.provider == 'aws':
+        backend.setup_rds()
+    else:
+        openstack_remove_all.RemoveAll(config, logger)
+        if config.db_provider == 'mysql':
+            backend.setup_openstack_mysql()
+        else:
+            backend.setup_openstack_mongodb()
+
+
+def setup_frontend(config, logger):
+    frontend = Frontend(config, logger)
+
+    showcase_url = None
+    if config.provider == 'aws':
+        showcase_url = frontend.setup_aws_frontend()
+    elif config.provider == 'openstack':
+        showcase_url = frontend.setup_openstack_frontend()
+
+    logger.log('You can view your showcase on <a href="http://%s/showcase-1-a">http://%s/showcase-1-a</a>' % (showcase_url, showcase_url), fin=True)