├── dockercon2020-demo
├── db
│ └── password.txt
├── app
│ ├── requirements.txt
│ ├── Dockerfile
│ └── src
│ │ └── server.py
├── web
│ ├── Dockerfile
│ ├── nginx.conf
│ └── index.html
└── docker-compose.yaml
├── ecsblog-demo
├── backend
│ ├── requirements.txt
│ ├── Dockerfile
│ └── main.py
├── frontend
│ ├── Dockerfile
│ └── nginx.conf
└── docker-compose.yml
├── README.md
├── wordsmith-demo
├── words
│ ├── .dockerignore
│ ├── src
│ │ └── main
│ │ │ ├── resources
│ │ │ ├── table.sql
│ │ │ └── words.sql
│ │ │ └── java
│ │ │ └── Main.java
│ ├── Dockerfile
│ └── pom.xml
├── img
│ ├── dockercon_EU_17.jpg
│ └── dockercon-barcelona-logo.svg
├── web
│ ├── static
│ │ ├── favicon.ico
│ │ ├── fonts
│ │ │ ├── font1.woff2
│ │ │ └── font2.woff2
│ │ ├── images
│ │ │ ├── homes.png
│ │ │ ├── lego_blue.png
│ │ │ ├── lego_yellow.png
│ │ │ ├── dockercon-log.png
│ │ │ ├── lego_light_blue.png
│ │ │ ├── dockercon-logo-2020.png
│ │ │ └── logo.svg
│ │ ├── app.js
│ │ ├── index.html
│ │ ├── style.css
│ │ └── angular.min.js
│ ├── Dockerfile
│ └── dispatcher.go
├── docker-compose.yaml
└── dev-docker-compose.yaml
└── gpublog-demo
├── backend
├── requirements.txt
├── Dockerfile
├── server.py
└── model.py
├── frontend
├── Dockerfile
├── nginx.conf
└── index.html
├── docker-compose.dev.yaml
├── README.md
└── docker-compose.prod.yaml
/dockercon2020-demo/db/password.txt:
--------------------------------------------------------------------------------
1 | db-78n9n
--------------------------------------------------------------------------------
/ecsblog-demo/backend/requirements.txt:
--------------------------------------------------------------------------------
1 | flask==1.1.2
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # dockercon
2 | Demo resources for DockerCon
3 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/.dockerignore:
--------------------------------------------------------------------------------
1 | .idea
2 | target
3 | *.iml
4 |
--------------------------------------------------------------------------------
/gpublog-demo/backend/requirements.txt:
--------------------------------------------------------------------------------
1 | Flask
2 | matplotlib
3 | sklearn
4 | requests
5 |
--------------------------------------------------------------------------------
/ecsblog-demo/frontend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:alpine
2 | COPY nginx.conf /etc/nginx/conf.d/default.conf
3 |
4 |
5 |
--------------------------------------------------------------------------------
/dockercon2020-demo/app/requirements.txt:
--------------------------------------------------------------------------------
1 | Flask==1.1.1
2 | mysql-connector==2.2.9
3 | # debugging only
4 | # ptvsd==4.3.2
5 |
--------------------------------------------------------------------------------
/ecsblog-demo/frontend/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | location / {
4 | proxy_pass http://backend:80;
5 | }
6 | }
--------------------------------------------------------------------------------
/wordsmith-demo/img/dockercon_EU_17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/img/dockercon_EU_17.jpg
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/favicon.ico
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/fonts/font1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/fonts/font1.woff2
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/fonts/font2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/fonts/font2.woff2
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/homes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/homes.png
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/lego_blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/lego_blue.png
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/lego_yellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/lego_yellow.png
--------------------------------------------------------------------------------
/dockercon2020-demo/web/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:1.13-alpine
2 | COPY nginx.conf /etc/nginx/nginx.conf
3 | COPY index.html /usr/share/nginx/html/index.html
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/dockercon-log.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/dockercon-log.png
--------------------------------------------------------------------------------
/gpublog-demo/frontend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:1.13-alpine
2 | COPY nginx.conf /etc/nginx/nginx.conf
3 | COPY index.html /usr/share/nginx/html/index.html
4 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/lego_light_blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/lego_light_blue.png
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/dockercon-logo-2020.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aiordache/demos/HEAD/wordsmith-demo/web/static/images/dockercon-logo-2020.png
--------------------------------------------------------------------------------
/dockercon2020-demo/app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.8-alpine
2 | WORKDIR /src
3 | COPY requirements.txt .
4 | RUN pip install -r requirements.txt
5 | COPY ./src /src
6 | EXPOSE 5000
7 | CMD python server.py
8 |
--------------------------------------------------------------------------------
/ecsblog-demo/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | frontend:
3 | build: frontend
4 | ports:
5 | - 80:80
6 | depends_on:
7 | - backend
8 | backend:
9 | build: backend
10 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/src/main/resources/table.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE IF NOT EXISTS nouns (word TEXT NOT NULL);
2 | CREATE TABLE IF NOT EXISTS verbs (word TEXT NOT NULL);
3 | CREATE TABLE IF NOT EXISTS adjectives (word TEXT NOT NULL);
4 |
--------------------------------------------------------------------------------
/ecsblog-demo/backend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.7-alpine
2 | WORKDIR /app
3 | COPY requirements.txt /app
4 | RUN pip3 install -r requirements.txt
5 | COPY main.py /app/main.py
6 | ENTRYPOINT ["python3"]
7 | CMD ["/app/main.py"]
8 |
--------------------------------------------------------------------------------
/gpublog-demo/frontend/nginx.conf:
--------------------------------------------------------------------------------
1 | events { }
2 | http {
3 | server {
4 | listen 80;
5 | root /usr/share/nginx/html;
6 | location /api/ {
7 | proxy_pass http://translator:5000/;
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/gpublog-demo/backend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM tensorflow/tensorflow:latest-gpu
2 |
3 | WORKDIR /code
4 | COPY requirements.txt /code/
5 | RUN pip install -r requirements.txt
6 | COPY . /code/
7 |
8 | EXPOSE 5000
9 |
10 | CMD python server.py
11 |
--------------------------------------------------------------------------------
/wordsmith-demo/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.7'
2 |
3 | services:
4 | db:
5 | image: postgres:10.0-alpine
6 |
7 | words:
8 | image: wordsmithinc/sentences-api
9 |
10 | web:
11 | image: wordsmithinc/sentences-web
12 | ports:
13 | - "80:80"
14 |
--------------------------------------------------------------------------------
/wordsmith-demo/dev-docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.7'
2 |
3 | services:
4 | db:
5 | image: postgres:10.0-alpine
6 |
7 | words:
8 | build: words
9 | image: wordsmithinc/sentences-api
10 |
11 | web:
12 | build: web
13 | image: wordsmithinc/sentences-web
14 | ports:
15 | - "80:80"
16 |
--------------------------------------------------------------------------------
/dockercon2020-demo/web/nginx.conf:
--------------------------------------------------------------------------------
1 | events { }
2 | http {
3 | server {
4 | listen 80;
5 | root /usr/share/nginx/html;
6 | # simple reverse-proxy
7 | # pass requests for dynamic content to the Flask server
8 | location /api/ {
9 | proxy_pass http://app:5000/;
10 | }
11 | }
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/gpublog-demo/docker-compose.dev.yaml:
--------------------------------------------------------------------------------
1 | services:
2 |
3 | training:
4 | build: backend
5 | command: python model.py
6 | volumes:
7 | - models:/checkpoints
8 |
9 | translator:
10 | build: backend
11 | volumes:
12 | - models:/checkpoints
13 | ports:
14 | - 5000:5000
15 |
16 | volumes:
17 | models:
18 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/Dockerfile:
--------------------------------------------------------------------------------
1 | # MULTI-STAGE BUILD
2 | FROM golang:1.14.2-alpine3.11 AS build
3 |
4 | WORKDIR /demo
5 | COPY dispatcher.go .
6 | RUN CGO_ENABLED=0 go build -o dispatcher dispatcher.go
7 |
8 |
9 | FROM nginx:alpine
10 | COPY static /static/
11 | COPY --from=build /demo/dispatcher /dispatcher
12 | EXPOSE 80
13 | CMD ["/dispatcher"]
14 |
15 |
--------------------------------------------------------------------------------
/ecsblog-demo/backend/main.py:
--------------------------------------------------------------------------------
1 | from flask import Flask
2 | app = Flask(__name__)
3 |
4 | @app.route("/")
5 | def hello():
6 | return """
7 | ## .
8 | ## ## ## ==
9 | ## ## ## ## ## ===
10 | /\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\___/ ===
11 | { / ===-
12 | \______ O __/
13 | \ \ __/
14 | \____\_______/
15 |
16 | Hello from Docker!
17 |
18 | """
19 |
20 | if __name__ == '__main__':
21 | app.run(host='0.0.0.0', port=80)
22 |
23 |
--------------------------------------------------------------------------------
/gpublog-demo/README.md:
--------------------------------------------------------------------------------
1 | ### DEMO GPU support in Docker Compose
2 |
3 | `model_generator.py` contains sample code from the Tensorflow docs at https://www.tensorflow.org/tutorials/text/nmt_with_attention
4 |
5 | When deploying on a host without an Nvidia GPU device, remove the `deploy` section from the Compose file, otherwise `docker-compose` will request the allocation of a GPU which will fail if the host does not have one.
6 |
7 | If no GPU is detected, the tensorflow framework will default to CPU. Training may take very long in this case.
8 |
--------------------------------------------------------------------------------
/gpublog-demo/docker-compose.prod.yaml:
--------------------------------------------------------------------------------
1 | services:
2 | training:
3 | build: backend
4 | command: python model.py
5 | environment:
6 | PYTHONUNBUFFERED: 0
7 | volumes:
8 | - models:/checkpoints
9 | deploy:
10 | resources:
11 | reservations:
12 | memory: 16Gb
13 | devices:
14 | - driver: nvidia
15 | count: 1
16 | capabilities: [gpu]
17 |
18 | translator:
19 | build: backend
20 | volumes:
21 | - models:/checkpoints
22 |
23 | frontend:
24 | build: frontend
25 | ports:
26 | - 80:80
27 | depends_on:
28 | - translator
29 |
30 | volumes:
31 | models:
32 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/Dockerfile:
--------------------------------------------------------------------------------
1 | # BUILD
2 | FROM openjdk:8u171-jdk-alpine as build
3 | WORKDIR /home/lab
4 | RUN MAVEN_VERSION=3.5.0 \
5 | && cd /usr/share \
6 | && wget http://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz -O - | tar xzf - \
7 | && mv /usr/share/apache-maven-$MAVEN_VERSION /usr/share/maven \
8 | && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
9 |
10 |
11 | COPY pom.xml .
12 | RUN mvn verify -DskipTests --fail-never
13 |
14 | COPY src ./src
15 | RUN mvn verify
16 |
17 | # RUN
18 | FROM openjdk:8u171-jre
19 | WORKDIR /app
20 | COPY src/main/resources /app/resources
21 | COPY --from=build /home/lab/target .
22 |
23 | ENTRYPOINT ["java", "-jar", "/app/words.jar"]
24 | EXPOSE 8080
--------------------------------------------------------------------------------
/dockercon2020-demo/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: "3.7"
2 | services:
3 | db:
4 | image: mysql:8.0.19
5 | command: '--default-authentication-plugin=mysql_native_password'
6 | restart: always
7 | secrets:
8 | - db-password
9 | volumes:
10 | - db-data:/var/lib/mysql
11 | networks:
12 | - backend-network
13 | environment:
14 | - MYSQL_DATABASE=example
15 | - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
16 |
17 | app:
18 | build: app
19 | restart: always
20 | secrets:
21 | - db-password
22 | networks:
23 | - backend-network
24 | - frontend-network
25 |
26 | web:
27 | build: web
28 | restart: always
29 | ports:
30 | - 80:80
31 | networks:
32 | - frontend-network
33 | volumes:
34 | db-data:
35 | secrets:
36 | db-password:
37 | file: db/password.txt
38 | networks:
39 | backend-network:
40 | frontend-network:
41 |
--------------------------------------------------------------------------------
/gpublog-demo/backend/server.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | from flask import Flask, request, make_response, jsonify
3 | from model import TranslatorModel
4 |
5 | server = Flask(__name__)
6 |
7 | model = None
8 |
9 |
10 | @server.route('/reload', methods = ['GET'])
11 | def reload():
12 | global model
13 | lang = request.args.get('lang', default = None, type = str)
14 | if not lang:
15 | return make_response('', 200)
16 |
17 | model = TranslatorModel(lang)
18 | return make_response('', 200)
19 |
20 |
21 | @server.route('/', methods = ['GET', 'POST'])
22 | def translate():
23 | global model
24 | text = request.args.get('text', default = None, type = str) or request.form.get('text')
25 | if not text:
26 | return make_response('', 200)
27 | if not model:
28 | return make_response('No trained model found / training may be in progress...', 200)
29 |
30 | t = model.translate(text)
31 | return make_response(t, 200)
32 |
33 |
34 |
35 | if __name__ == '__main__':
36 | server.run(host='0.0.0.0', debug=False)
37 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/src/main/resources/words.sql:
--------------------------------------------------------------------------------
1 |
2 | INSERT INTO nouns(word) VALUES
3 | ('cloud'),
4 | ('elephant'),
5 | ('go language'),
6 | ('laptop'),
7 | ('container'),
8 | ('micro-service'),
9 | ('turtle'),
10 | ('whale'),
11 | ('gopher'),
12 | ('moby dock'),
13 | ('server'),
14 | ('bicycle'),
15 | ('viking'),
16 | ('mermaid'),
17 | ('fjord'),
18 | ('lego'),
19 | ('flodebolle'),
20 | ('smorrebrod');
21 |
22 | INSERT INTO verbs(word) VALUES
23 | ('will drink'),
24 | ('smashes'),
25 | ('smokes'),
26 | ('eats'),
27 | ('walks towards'),
28 | ('loves'),
29 | ('helps'),
30 | ('pushes'),
31 | ('debugs'),
32 | ('invites'),
33 | ('hides'),
34 | ('will ship');
35 |
36 | INSERT INTO adjectives(word) VALUES
37 | ('the exquisite'),
38 | ('a pink'),
39 | ('the rotten'),
40 | ('a red'),
41 | ('the serverless'),
42 | ('a broken'),
43 | ('a shiny'),
44 | ('the pretty'),
45 | ('the impressive'),
46 | ('an awesome'),
47 | ('the famous'),
48 | ('a gigantic'),
49 | ('the glorious'),
50 | ('the nordic'),
51 | ('the welcoming'),
52 | ('the delicious');
53 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/app.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var lab = angular.module('lab', []);
4 |
5 | lab.controller('LabCtrl', function ($scope, $http, $timeout) {
6 | $scope.noun1 = "";
7 | $scope.noun2 = "";
8 | $scope.adjective1 = "";
9 | $scope.adjective2 = "";
10 | $scope.verb = "";
11 |
12 | getWord($http, $timeout, '/words/noun', function(resp) {
13 | $scope.noun1 = word(resp);
14 | });
15 | getWord($http, $timeout, '/words/noun', function(resp) {
16 | $scope.noun2 = word(resp);
17 | });
18 | getWord($http, $timeout, '/words/adjective', function(resp) {
19 | var adj = word(resp);
20 | adj.word = adj.word.charAt(0).toUpperCase() + adj.word.substr(1)
21 | $scope.adjective1 = adj;
22 | });
23 | getWord($http, $timeout, '/words/adjective', function(resp) {
24 | $scope.adjective2 = word(resp);
25 | });
26 | getWord($http, $timeout, '/words/verb', function(resp) {
27 | $scope.verb = word(resp);
28 | });
29 | });
30 |
31 | function getWord($http, $timeout, url, callback) {
32 | $http.get(url).then(callback, function(resp) {
33 | $timeout(function() {
34 | console.log("Retry: " + url);
35 | getWord($http, $timeout, url, callback);
36 | }, 500);
37 | });
38 | }
39 |
40 | function word(resp) {
41 | return {
42 | word: resp.data.word,
43 | hostname: resp.headers()["source"]
44 | };
45 | }
46 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/dispatcher.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io/ioutil"
6 | "log"
7 | "math/rand"
8 | "net"
9 | "net/http"
10 | "time"
11 | )
12 |
13 | func main() {
14 | rand.Seed(time.Now().UnixNano())
15 |
16 | fwd := &forwarder{"words", 8080}
17 | http.Handle("/words/", http.StripPrefix("/words", fwd))
18 | http.Handle("/", http.FileServer(http.Dir("static")))
19 |
20 | fmt.Println("Listening on port 80")
21 | err := http.ListenAndServe(":80", nil)
22 | if err != nil {
23 | fmt.Printf("Error while starting server: %v", err)
24 | }
25 | }
26 |
27 | type forwarder struct {
28 | host string
29 | port int
30 | }
31 |
32 | func (f *forwarder) ServeHTTP(w http.ResponseWriter, r *http.Request) {
33 | addrs, err := net.LookupHost(f.host)
34 | if err != nil {
35 | log.Println("Error", err)
36 | http.Error(w, err.Error(), 500)
37 | return
38 | }
39 |
40 | log.Printf("%s %d available ips: %v", r.URL.Path, len(addrs), addrs)
41 | ip := addrs[rand.Intn(len(addrs))]
42 | log.Printf("%s I choose %s", r.URL.Path, ip)
43 |
44 | url := fmt.Sprintf("http://%s:%d%s", ip, f.port, r.URL.Path)
45 | log.Printf("%s Calling %s", r.URL.Path, url)
46 |
47 | if err = copy(url, ip, w); err != nil {
48 | log.Println("Error", err)
49 | http.Error(w, err.Error(), 500)
50 | return
51 | }
52 | }
53 |
54 | func copy(url, ip string, w http.ResponseWriter) error {
55 | resp, err := http.Get(url)
56 | if err != nil {
57 | return err
58 | }
59 |
60 | w.Header().Set("source", ip)
61 |
62 | buf, err := ioutil.ReadAll(resp.Body)
63 | if err != nil {
64 | return err
65 | }
66 |
67 | _, err = w.Write(buf)
68 | return err
69 | }
70 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Docker Compose demo
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/dockercon2020-demo/app/src/server.py:
--------------------------------------------------------------------------------
1 | import os
2 | import flask
3 | import json
4 | import mysql.connector
5 |
6 | # for debugging from Visual Studio Code -- turn off flask debugger first
7 | # import ptvsd
8 | # ptvsd.enable_attach(address=('0.0.0.0', 3000))
9 |
10 | class DBManager:
11 | def __init__(self, database='example', host="db", user="root", password_file=None):
12 | pf = open(password_file, 'r')
13 | self.connection = mysql.connector.connect(
14 | user=user,
15 | password=pf.read(),
16 | host=host,
17 | database=database,
18 | auth_plugin='mysql_native_password'
19 | )
20 | pf.close()
21 | self.cursor = self.connection.cursor()
22 |
23 | def populate_db(self):
24 | self.cursor.execute('DROP TABLE IF EXISTS blog')
25 | self.cursor.execute('CREATE TABLE blog (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255))')
26 | self.cursor.executemany('INSERT INTO blog (id, title) VALUES (%s, %s);', [(i, 'Blog post #%d'% i) for i in range (1,5)])
27 | self.connection.commit()
28 |
29 | def query_titles(self):
30 | self.cursor.execute('SELECT title FROM blog')
31 | rec = []
32 | for c in self.cursor:
33 | rec.append(c[0])
34 | return rec
35 |
36 |
37 | server = flask.Flask(__name__)
38 | conn = None
39 |
40 | @server.route('/blogs')
41 | def listBlog():
42 | global conn
43 | if not conn:
44 | conn = DBManager(password_file='/run/secrets/db-password')
45 | conn.populate_db()
46 | rec = conn.query_titles()
47 |
48 | result = []
49 | for c in rec:
50 | result.append(c)
51 |
52 | return flask.jsonify({"response": result})
53 |
54 | @server.route('/')
55 | def hello():
56 | return flask.jsonify({"response": "Hello from Docker!"})
57 |
58 |
59 | if __name__ == '__main__':
60 | server.run(debug=True, host='0.0.0.0', port=5000)
61 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/style.css:
--------------------------------------------------------------------------------
1 | /* latin-ext */
2 | @font-face {
3 | font-family: 'Raleway';
4 | font-style: normal;
5 | font-weight: 400;
6 | src: local('Raleway'), local('Raleway-Regular'), url('fonts/font1.woff2') format('woff2');
7 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
8 | }
9 | /* latin */
10 | @font-face {
11 | font-family: 'Raleway';
12 | font-style: normal;
13 | font-weight: 400;
14 | src: local('Raleway'), local('Raleway-Regular'), url('fonts/font2.woff2') format('woff2');
15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
16 | }
17 |
18 | body {
19 | text-align: center;
20 | margin: 0;
21 | padding: 0;
22 | background-color: #001f5b;
23 | }
24 |
25 | .logo {
26 | margin-top: 30px;
27 | }
28 |
29 | .footer {
30 | position: absolute;
31 | bottom: 0;
32 | width: 100%;
33 | z-index: -1;
34 | opacity: 0.5;
35 | }
36 |
37 | .footer img {
38 | max-width: 100%;
39 | vertical-align: middle;
40 | }
41 |
42 | .sentence {
43 | margin: 70px auto 0 auto;
44 | }
45 |
46 | .line {
47 | margin-bottom: 30px;
48 | transform: translateX(-100%) rotate(-20deg);
49 | }
50 |
51 | .slide-in {
52 | animation: slide-in .5s forwards ease-in;
53 | }
54 |
55 | .line3.slide-in {
56 | animation: slide-in 1s forwards ease-in;
57 | }
58 |
59 | .line2.slide-in {
60 | animation: slide-in 1.2s forwards ease-in;
61 | }
62 |
63 | @keyframes slide-in {
64 | 100% {
65 | transform: translateX(0%);
66 | }
67 | }
68 |
69 | .result {
70 | position: relative;
71 | display: inline-block;
72 | padding: 0 20px;
73 | margin: 0 10px;
74 | color: white;
75 | height: 175px;
76 | width: 330px;
77 | }
78 |
79 | .result .word {
80 | display: inline-block;
81 | font-family: 'Raleway', sans-serif;
82 | font-size: 45px;
83 | color: white;
84 | line-height: 155px;
85 | height: 175px;
86 | vertical-align: middle;
87 | margin-top: 20px;
88 | }
89 |
90 | .result .hostname {
91 | position: absolute;
92 | width: 100%;
93 | left: 0;
94 | bottom: 8px;
95 | font-size: 0.8em;
96 | height: 14px;
97 | }
98 |
99 | .noun {
100 | background-image: url('images/lego_blue.png') !important;
101 | }
102 |
103 | .verb {
104 | background-image: url('images/lego_yellow.png') !important;
105 | }
106 |
107 | .adjective {
108 | background-image: url('images/lego_light_blue.png') !important;
109 | }
110 |
--------------------------------------------------------------------------------
/dockercon2020-demo/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Hello!
5 |
6 |
7 |
46 |
47 |
48 |
49 |
50 |

51 |
Hello there!
52 |
Simple DEV environment setup with Docker and Docker Compose
53 |
54 |
Set url path(default is '/'), then query the app service.
55 |
56 |
57 |
58 |
59 |
Server response
60 |
61 |
62 |
63 |
64 |
65 |
66 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/gpublog-demo/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Docker DEMO!
5 |
6 |
7 |
72 |
73 |
74 |
75 |

76 |
Docker Compose DEMO!
77 |
86 |
87 |
88 |
102 |
103 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | codestory
8 | words
9 | 1.0-SNAPSHOT
10 |
11 |
12 | UTF-8
13 | 1.8
14 | 1.8
15 |
16 |
17 |
18 | words
19 |
20 |
21 |
22 |
23 | maven-clean-plugin
24 | 3.0.0
25 |
26 |
27 | maven-compiler-plugin
28 | 3.6.1
29 |
30 |
31 | maven-deploy-plugin
32 | 2.8.2
33 |
34 |
35 | maven-install-plugin
36 | 2.5.2
37 |
38 |
39 | maven-resources-plugin
40 | 3.0.2
41 |
42 |
43 | maven-site-plugin
44 | 3.6
45 |
46 |
47 | maven-release-plugin
48 | 2.5.3
49 |
50 |
51 | maven-surefire-plugin
52 | 2.19.1
53 |
54 |
55 |
56 |
57 |
58 |
59 | maven-dependency-plugin
60 | 3.0.0
61 |
62 |
63 | copy-dependencies
64 | package
65 |
66 | copy-dependencies
67 |
68 |
69 |
70 |
71 |
72 | maven-jar-plugin
73 | 3.0.2
74 |
75 |
76 |
77 | true
78 | dependency
79 | Main
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | com.google.guava
90 | guava
91 | 24.1.1
92 |
93 |
94 | org.postgresql
95 | postgresql
96 | 42.1.4
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/wordsmith-demo/words/src/main/java/Main.java:
--------------------------------------------------------------------------------
1 | import com.google.common.base.Charsets;
2 | import com.google.common.base.Supplier;
3 | import com.google.common.base.Suppliers;
4 | import com.sun.net.httpserver.HttpHandler;
5 | import com.sun.net.httpserver.HttpServer;
6 |
7 | import java.lang.String;
8 | import java.nio.file.*;
9 | import java.io.*;
10 | import java.nio.charset.StandardCharsets;
11 | import java.net.InetSocketAddress;
12 | import java.sql.*;
13 | import java.util.NoSuchElementException;
14 |
15 | public class Main {
16 | public static int dbPopulateRetry;
17 | public static HttpServer server;
18 | public static void main(String[] args) throws Exception {
19 | dbPopulateRetry = 7;
20 | Class.forName("org.postgresql.Driver");
21 |
22 | server = HttpServer.create(new InetSocketAddress(8080), 0);
23 | server.createContext("/noun", handler(Suppliers.memoize(() -> randomWord("nouns"))));
24 | server.createContext("/verb", handler(Suppliers.memoize(() -> randomWord("verbs"))));
25 | server.createContext("/adjective", handler(Suppliers.memoize(() -> randomWord("adjectives"))));
26 | server.start();
27 | }
28 | private static void refreshContext() throws IOException {
29 | server.removeContext("/noun");
30 | server.removeContext("/verb");
31 | server.removeContext("/adjective");
32 | server.createContext("/noun", handler(Suppliers.memoize(() -> randomWord("nouns"))));
33 | server.createContext("/verb", handler(Suppliers.memoize(() -> randomWord("verbs"))));
34 | server.createContext("/adjective", handler(Suppliers.memoize(() -> randomWord("adjectives"))));
35 | }
36 | private static String populateDB() throws IOException {
37 |
38 | try (Connection connection = DriverManager.getConnection("jdbc:postgresql://db:5432/postgres", "postgres", "")) {
39 |
40 | DatabaseMetaData dbm = connection.getMetaData();
41 | ResultSet table = dbm.getTables(null, null, "nouns", null);
42 | if (table.next()) {
43 | return null;
44 | }
45 | try (Statement statement = connection.createStatement()) {
46 | String tables = new String(Files.readAllBytes(Paths.get("/app/resources/table.sql")));
47 | statement.executeUpdate(tables);
48 |
49 | String words = new String(Files.readAllBytes(Paths.get("/app/resources/words.sql")));
50 | statement.executeUpdate(words);
51 | }
52 | } catch (SQLException e) {
53 | e.printStackTrace();
54 | }
55 | throw new NoSuchElementException("nouns");
56 | }
57 |
58 |
59 | private static String randomWord(String table) {
60 | try (Connection connection = DriverManager.getConnection("jdbc:postgresql://db:5432/postgres", "postgres", "")) {
61 | try (Statement statement = connection.createStatement()) {
62 | try (ResultSet set = statement.executeQuery("SELECT word FROM " + table + " ORDER BY random() LIMIT 1")) {
63 | while (set.next()) {
64 | return set.getString(1);
65 | }
66 | }
67 | }
68 | } catch (SQLException e) {
69 | try {
70 | dbPopulateRetry = dbPopulateRetry - 1;
71 | if (dbPopulateRetry < 0) {
72 | throw new IOException("unable to populate DB");
73 | }
74 | populateDB();
75 | randomWord(table);
76 | }
77 | catch(IOException ie) {
78 | e.printStackTrace();
79 | ie.printStackTrace();
80 | }
81 | }
82 | throw new NoSuchElementException(table);
83 | }
84 |
85 |
86 |
87 | private static HttpHandler handler(Supplier word) {
88 | return t -> {
89 | String response = "{\"word\":\"" + word.get() + "\"}";
90 | byte[] bytes = response.getBytes(Charsets.UTF_8);
91 |
92 | System.out.println(response);
93 | t.getResponseHeaders().add("content-type", "application/json; charset=utf-8");
94 | t.sendResponseHeaders(200, bytes.length);
95 |
96 | try (OutputStream os = t.getResponseBody()) {
97 | os.write(bytes);
98 | }
99 | refreshContext();
100 | };
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/images/logo.svg:
--------------------------------------------------------------------------------
1 |
49 |
--------------------------------------------------------------------------------
/wordsmith-demo/img/dockercon-barcelona-logo.svg:
--------------------------------------------------------------------------------
1 |
43 |
--------------------------------------------------------------------------------
/gpublog-demo/backend/model.py:
--------------------------------------------------------------------------------
1 | import io
2 | import os
3 | import re
4 | import sys
5 | import time
6 | import unicodedata
7 |
8 | import numpy as np
9 | import tensorflow as tf
10 | from sklearn.model_selection import train_test_split
11 | import functools
12 | import requests
13 |
14 | #
15 | # This code sample is copied from the tensorflow docs at
16 | # https://www.tensorflow.org/tutorials/text/nmt_with_attention
17 | #
18 |
19 | # Converts the unicode file to ascii
20 | def unicode_to_ascii(s):
21 | return ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
22 |
23 | def preprocess_sentence(w):
24 | w = unicode_to_ascii(w.lower().strip())
25 |
26 | # creating a space between a word and the punctuation following it
27 | # eg: "he is a boy." => "he is a boy ."
28 | # Reference:- https://stackoverflow.com/questions/3645931/python-padding-punctuation-with-white-spaces-keeping-punctuation
29 | w = re.sub(r"([?.!,¿])", r" \1 ", w)
30 | w = re.sub(r'[" "]+', " ", w)
31 |
32 | # replacing everything with space except (a-z, A-Z, ".", "?", "!", ",")
33 | w = re.sub(r"[^a-zA-Z?.!,¿]+", " ", w)
34 |
35 | w = w.strip()
36 |
37 | # adding a start and an end token to the sentence
38 | # so that the model know when to start and stop predicting.
39 | w = ' ' + w + ' '
40 | return w
41 |
42 | def loss_function(real, pred):
43 | loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none')
44 |
45 | mask = tf.math.logical_not(tf.math.equal(real, 0))
46 | loss_ = loss_object(real, pred)
47 |
48 | mask = tf.cast(mask, dtype=loss_.dtype)
49 | loss_ *= mask
50 |
51 | return tf.reduce_mean(loss_)
52 |
53 |
54 | def tokenize(lang):
55 | lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(
56 | filters='')
57 | lang_tokenizer.fit_on_texts(lang)
58 | tensor = lang_tokenizer.texts_to_sequences(lang)
59 | tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor, padding='post')
60 |
61 | return tensor, lang_tokenizer
62 |
63 | class Encoder(tf.keras.Model):
64 | def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):
65 | super(Encoder, self).__init__()
66 | self.batch_sz = batch_sz
67 | self.enc_units = enc_units
68 | self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
69 | self.gru = tf.keras.layers.GRU(self.enc_units,
70 | return_sequences=True,
71 | return_state=True,
72 | recurrent_initializer='glorot_uniform')
73 |
74 | def call(self, x, hidden):
75 | x = self.embedding(x)
76 | output, state = self.gru(x, initial_state=hidden)
77 | return output, state
78 |
79 | def initialize_hidden_state(self):
80 | return tf.zeros((self.batch_sz, self.enc_units))
81 |
82 |
83 | class BahdanauAttention(tf.keras.layers.Layer):
84 | def __init__(self, units):
85 | super(BahdanauAttention, self).__init__()
86 | self.W1 = tf.keras.layers.Dense(units)
87 | self.W2 = tf.keras.layers.Dense(units)
88 | self.V = tf.keras.layers.Dense(1)
89 |
90 | def call(self, query, values):
91 | # query hidden state shape == (batch_size, hidden size)
92 | # query_with_time_axis shape == (batch_size, 1, hidden size)
93 | # values shape == (batch_size, max_len, hidden size)
94 | # we are doing this to broadcast addition along the time axis to calculate the score
95 | query_with_time_axis = tf.expand_dims(query, 1)
96 |
97 | # score shape == (batch_size, max_length, 1)
98 | # we get 1 at the last axis because we are applying score to self.V
99 | # the shape of the tensor before applying self.V is (batch_size, max_length, units)
100 | score = self.V(tf.nn.tanh(
101 | self.W1(query_with_time_axis) + self.W2(values)))
102 |
103 | # attention_weights shape == (batch_size, max_length, 1)
104 | attention_weights = tf.nn.softmax(score, axis=1)
105 |
106 | # context_vector shape after sum == (batch_size, hidden_size)
107 | context_vector = attention_weights * values
108 | context_vector = tf.reduce_sum(context_vector, axis=1)
109 |
110 | return context_vector, attention_weights
111 |
112 |
113 | class Decoder(tf.keras.Model):
114 | def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):
115 | super(Decoder, self).__init__()
116 | self.batch_sz = batch_sz
117 | self.dec_units = dec_units
118 | self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
119 | self.gru = tf.keras.layers.GRU(self.dec_units,
120 | return_sequences=True,
121 | return_state=True,
122 | recurrent_initializer='glorot_uniform')
123 | self.fc = tf.keras.layers.Dense(vocab_size)
124 |
125 | # used for attention
126 | self.attention = BahdanauAttention(self.dec_units)
127 |
128 | def call(self, x, hidden, enc_output):
129 | # enc_output shape == (batch_size, max_length, hidden_size)
130 | context_vector, attention_weights = self.attention(hidden, enc_output)
131 |
132 | # x shape after passing through embedding == (batch_size, 1, embedding_dim)
133 | x = self.embedding(x)
134 |
135 | # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)
136 | x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)
137 |
138 | # passing the concatenated vector to the GRU
139 | output, state = self.gru(x)
140 |
141 | # output shape == (batch_size * 1, hidden_size)
142 | output = tf.reshape(output, (-1, output.shape[2]))
143 |
144 | # output shape == (batch_size, vocab)
145 | x = self.fc(output)
146 |
147 | return x, state, attention_weights
148 |
149 |
150 |
151 |
152 |
153 | class TranslatorModel:
154 | BATCH_SIZE = 64
155 | embedding_dim = 256
156 | units = 1024
157 | url = 'http://storage.googleapis.com/download.tensorflow.org/data'
158 |
159 |
160 | def __init__(self, lang='eng-fra'):
161 | self.lang = lang
162 | self.optimizer = tf.keras.optimizers.Adam()
163 |
164 | self.checkpoint_dir = "/checkpoints/{}".format(lang)
165 | self.checkpoint_prefix = os.path.join(self.checkpoint_dir, "ckpt")
166 |
167 |
168 | self._load(num_examples = 30000)
169 |
170 | self.encoder = Encoder(self.vocab_inp_size, self.embedding_dim, self.units, self.BATCH_SIZE)
171 | self.decoder = Decoder(self.vocab_tar_size, self.embedding_dim, self.units, self.BATCH_SIZE)
172 |
173 |
174 |
175 | self.checkpoint = tf.train.Checkpoint(optimizer=self.optimizer,
176 | encoder=self.encoder,
177 | decoder=self.decoder)
178 |
179 | # restoring the latest checkpoint in checkpoint_dir
180 | self.checkpoint.restore(tf.train.latest_checkpoint(self.checkpoint_dir))
181 |
182 |
183 | def _load_dataset(self, num_examples = None):
184 | lang1, lang2 = self.lang.split('-')
185 | if self.lang.startswith('eng-'):
186 | lang2, lang1 = self.lang.split('-')
187 |
188 | path_to_file = "/code/data/{}.txt".format(lang1)
189 | if not os.path.isfile(path_to_file):
190 | archive = '{}-{}.zip'.format(lang1, lang2)
191 | # Download the file
192 | path_to_zip = tf.keras.utils.get_file(
193 | archive,
194 | origin='{}/{}'.format(self.url, archive),
195 | extract=True)
196 |
197 | path_to_file = os.path.dirname(path_to_zip)+"/{}.txt".format(lang1)
198 |
199 | # load dataset
200 | lines = io.open(path_to_file, encoding='UTF-8').read().strip().split('\n')
201 | if num_examples is None:
202 | num_examples = len(lines)
203 | word_pairs = [[preprocess_sentence(w) for w in l.split(
204 | '\t')] for l in lines[:num_examples]]
205 |
206 | return zip(*word_pairs)
207 |
208 |
209 | def _load(self, num_examples = None):
210 | # creating cleaned input, output pairs
211 | if self.lang.startswith('eng-'):
212 | self.inp_lang, self.targ_lang = self._load_dataset(num_examples)
213 | else:
214 | self.targ_lang, self.inp_lang = self._load_dataset(num_examples)
215 |
216 | self.input_tensor, self.inp_lang_tokenizer = tokenize(self.inp_lang)
217 | self.target_tensor, self.targ_lang_tokenizer = tokenize(self.targ_lang)
218 |
219 | # Calculate max_length of the target tensors
220 | self.max_length_targ = self.target_tensor.shape[1]
221 | self.max_length_inp = self.input_tensor.shape[1]
222 | self.vocab_inp_size = len(self.inp_lang_tokenizer.word_index)+1
223 | self.vocab_tar_size = len(self.targ_lang_tokenizer.word_index)+1
224 |
225 | # Creating training and validation sets using an 80-20 split
226 | input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(
227 | self.input_tensor, self.target_tensor, test_size=0.2)
228 |
229 | self.BUFFER_SIZE = len(input_tensor_train)
230 | self.steps_per_epoch = len(input_tensor_train)//self.BATCH_SIZE
231 |
232 |
233 | dataset = tf.data.Dataset.from_tensor_slices(
234 | (input_tensor_train, target_tensor_train)).shuffle(self.BUFFER_SIZE)
235 | self.dataset = dataset.batch(self.BATCH_SIZE, drop_remainder=True)
236 |
237 | @tf.function
238 | def train_step(self, inp, targ, enc_hidden):
239 | loss = 0
240 |
241 | with tf.GradientTape() as tape:
242 | enc_output, enc_hidden = self.encoder(inp, enc_hidden)
243 | dec_hidden = enc_hidden
244 | dec_input = tf.expand_dims(
245 | [self.targ_lang_tokenizer.word_index['']] * self.BATCH_SIZE, 1)
246 |
247 | # Teacher forcing - feeding the target as the next input
248 | for t in range(1, targ.shape[1]):
249 | # passing enc_output to the decoder
250 | predictions, dec_hidden, _ = self.decoder(
251 | dec_input, dec_hidden, enc_output)
252 |
253 | loss += loss_function(targ[:, t], predictions)
254 |
255 | # using teacher forcing
256 | dec_input = tf.expand_dims(targ[:, t], 1)
257 |
258 | batch_loss = (loss / int(targ.shape[1]))
259 | variables = self.encoder.trainable_variables + self.decoder.trainable_variables
260 | gradients = tape.gradient(loss, variables)
261 | self.optimizer.apply_gradients(zip(gradients, variables))
262 | return batch_loss
263 |
264 |
265 | def train(self, epochs = 10):
266 | for epoch in range(epochs):
267 | start = time.time()
268 |
269 | enc_hidden = self.encoder.initialize_hidden_state()
270 | total_loss = 0
271 |
272 | for (batch, (inp, targ)) in enumerate(self.dataset.take(self.steps_per_epoch)):
273 | batch_loss = self.train_step(inp, targ, enc_hidden)
274 | total_loss += batch_loss
275 |
276 | if batch % 100 == 0:
277 | print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1, batch, batch_loss.numpy()))
278 | # saving (checkpoint) the model every 2 epochs
279 | if (epoch + 1) % 2 == 0:
280 | self.checkpoint.save(file_prefix = self.checkpoint_prefix)
281 |
282 | print('Epoch {} Loss {:.4f}'.format(epoch + 1, total_loss / self.steps_per_epoch))
283 | print('Time taken for 1 epoch {} sec\n'.format(time.time() - start))
284 |
285 |
286 |
287 |
288 |
289 | def evaluate(self, sentence):
290 | sentence = preprocess_sentence(sentence)
291 |
292 | inputs = [self.inp_lang_tokenizer.word_index[i] for i in sentence.split(' ')]
293 | inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs],
294 | maxlen=self.max_length_inp,
295 | padding='post')
296 | inputs = tf.convert_to_tensor(inputs)
297 |
298 | result = ''
299 |
300 | hidden = [tf.zeros((1, self.units))]
301 | enc_out, enc_hidden = self.encoder(inputs, hidden)
302 |
303 | dec_hidden = enc_hidden
304 | dec_input = tf.expand_dims([self.targ_lang_tokenizer.word_index['']], 0)
305 |
306 | for t in range(self.max_length_targ):
307 | predictions, dec_hidden, attention_weights = self.decoder(dec_input,
308 | dec_hidden,
309 | enc_out)
310 | predicted_id = tf.argmax(predictions[0]).numpy()
311 | if self.targ_lang_tokenizer.index_word[predicted_id] == '':
312 | break
313 | result += self.targ_lang_tokenizer.index_word[predicted_id] + ' '
314 | # the predicted ID is fed back into the model
315 | dec_input = tf.expand_dims([predicted_id], 0)
316 |
317 | return result, sentence
318 |
319 |
320 |
321 | def translate(self, sentence):
322 | result, _ = self.evaluate(sentence)
323 |
324 | print('Input: %s' % (sentence))
325 | print('Predicted translation: {}'.format(result))
326 | return result
327 |
328 |
329 |
330 |
331 |
332 | if __name__ == '__main__':
333 | lang = "eng-fra"
334 | if len(sys.argv) > 1:
335 | lang = sys.argv[1]
336 |
337 | if len(sys.argv) > 2:
338 | epochs = int(sys.argv[2])
339 |
340 | model = TranslatorModel(lang)
341 | epochs = 10
342 | print("Translator services is requested to reload the model every 10 epochs.")
343 | while True:
344 | model.train(epochs)
345 | print("Checkpoints saved in {}".format(model.checkpoint_dir))
346 | response = requests.get("http://translator:5000/reload", params={'lang': lang})
347 | print("Requested translator service to reload its model, response status: ", response.status_code)
348 | print("Exiting...")
349 |
350 |
351 |
--------------------------------------------------------------------------------
/wordsmith-demo/web/static/angular.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.5.3
3 | (c) 2010-2016 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(T,P,u){'use strict';function O(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.3/"+(a?a+"/":"")+b;for(b=1;b").append(a).html();try{return a[0].nodeType===Pa?N(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+N(b)})}catch(c){return N(d)}}function wc(a){try{return decodeURIComponent(a)}catch(b){}}
18 | function xc(a){var b={};q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),A(e)&&(f=A(f)?wc(f):!0,va.call(b,e)?M(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Sb(a){var b=[];q(a,function(a,c){M(a)?q(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}function rb(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,
19 | "=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ce(a,b){var d,c,e=Qa.length;for(c=0;c/,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=eb(b,d.strictDi);c.invoke(["$rootScope",
21 | "$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;T&&e.test(T.name)&&(d.debugInfoEnabled=!0,T.name=T.name.replace(e,""));if(T&&!f.test(T.name))return c();T.name=T.name.replace(f,"");ea.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};D(ea.resumeDeferredBootstrap)&&ea.resumeDeferredBootstrap()}function ee(){T.name="NG_ENABLE_DEBUG_INFO!"+T.name;T.location.reload()}
22 | function fe(a){a=ea.element(a).injector();if(!a)throw Ba("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(ge,function(a,c){return(c?b:"")+a.toLowerCase()})}function he(){var a;if(!Ac){var b=sb();($=z(b)?T.jQuery:b?T[b]:u)&&$.fn.on?(H=$,S($.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),a=$.cleanData,$.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=$._data(f,"events"))&&c.$destroy&&
23 | $(f).triggerHandler("$destroy");a(b)}):H=U;ea.element=H;Ac=!0}}function tb(a,b,d){if(!a)throw Ba("areq",b||"?",d||"required");return a}function Sa(a,b,d){d&&M(a)&&(a=a[a.length-1]);tb(D(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ta(a,b){if("hasOwnProperty"===a)throw Ba("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=cb(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";q(f,function(a){e.appendChild(a)});return e}function Mc(a,
31 | b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;y(a)&&(a=W(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Vb("nosel");return new U(a)}if(b){b=P;var d;a=(d=Lf.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Nc(this,a)}function Wb(a){return a.cloneNode(!0)}function xb(a,b){b||gb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c=Da?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a));return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=M(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,a))},get:d,annotate:eb.$$annotate,has:function(b){return n.hasOwnProperty(b+
42 | "Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ua([],!0),n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,da(b),!1)}),constant:d(function(a,b){Ta(a,"constant");n[a]=b;F[a]=b}),decorator:function(a,b){var c=p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=x.invoke(d,c);return x.invoke(b,null,{$delegate:a})}}}},p=n.$injector=h(n,function(a,b){ea.isString(b)&&l.push(b);
43 | throw Ia("unpr",l.join(" <- "));}),F={},L=h(F,function(a,b){var c=p.get(a+"Provider",b);return x.invoke(c.$get,c,u,a)}),x=L;n.$injectorProvider={$get:da(L)};var r=g(a),x=L.get("$injector");x.strictDi=b;q(r,function(a){a&&x.invoke(a)});return x}function Ve(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===oa(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();
44 | var c;c=g.yOffset;D(c)?c=c():Pb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):R(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=y(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Nf(function(){c.$evalAsync(g)})});return g}]}function ib(a,b){if(!a&&!b)return"";
45 | if(!a)return b;if(!b)return a;M(a)&&(a=a.join(" "));M(b)&&(b=b.join(" "));return a+" "+b}function Wf(a){y(a)&&(a=a.split(" "));var b=V();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ja(a){return J(a)?a:{}}function Xf(a,b,d,c){function e(a){try{a.apply(null,Aa.call(arguments,1))}finally{if(L--,0===L)for(;x.length;)try{x.pop()()}catch(b){d.error(b)}}}function f(){t=null;g();h()}function g(){r=G();r=z(r)?null:r;na(r,I)&&(r=I);I=r}function h(){if(v!==k.url()||w!==r)v=k.url(),w=r,q(C,function(a){a(k.url(),
46 | r)})}var k=this,l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,F={};k.isMock=!1;var L=0,x=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){L++};k.notifyWhenNoOutstandingRequests=function(a){0===L?a():x.push(a)};var r,w,v=l.href,Q=b.find("base"),t=null,G=c.history?function(){try{return m.state}catch(a){}}:E;g();w=r;k.url=function(b,d,e){z(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=w===e;if(v===b&&(!c.history||f))return k;
47 | var h=v&&Ka(v)===Ka(b);v=b;w=e;if(!c.history||h&&f){if(!h||t)t=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(t=b)}else m[d?"replaceState":"pushState"](e,"",b),g(),w=r;return k}return t||l.href.replace(/%27/g,"'")};k.state=function(){return r};var C=[],K=!1,I=null;k.onUrlChange=function(b){if(!K){if(c.history)H(a).on("popstate",f);H(a).on("hashchange",f);K=!0}C.push(b);return b};k.$$applicationDestroyed=function(){H(a).off("hashchange popstate",f)};
48 | k.$$checkUrlChange=h;k.baseHref=function(){var a=Q.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;L++;c=n(function(){delete F[c];e(a)},b||0);F[c]=!0;return c};k.defer.cancel=function(a){return F[a]?(delete F[a],p(a),e(E),!0):!1}}function bf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Xf(a,c,b,d)}]}function cf(){this.$get=function(){function a(a,c){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=
49 | null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw O("$cacheFactory")("iid",a);var g=0,h=S({},c,{id:a}),k=V(),l=c&&c.capacity||Number.MAX_VALUE,m=V(),n=null,p=null;return b[a]={put:function(a,b){if(!z(b)){if(ll&&this.remove(p.key);return b}},get:function(a){if(l";b=la.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);
56 | d.value=c;a.attributes.setNamedItem(d)}function B(a,b){try{a.addClass(b)}catch(c){}}function ba(a,b,c,d,e){a instanceof H||(a=H(a));for(var f=/\S+/,g=0,h=a.length;g").append(a).html())):c?Ra.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ba.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function xa(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,n,p,G;if(r)for(G=Array(c.length),m=0;mB.priority)break;if(y=B.scope)B.templateUrl||(J(y)?(X("new/isolated scope",C||G,B,t),C=B):X("new/isolated scope",C,B,t)),G=G||B;L=B.name;if(!Ea&&(B.replace&&(B.templateUrl||B.template)||B.transclude&&!B.$$tlb)){for(y=ra+1;Ea=a[y++];)if(Ea.transclude&&!Ea.$$tlb||Ea.replace&&(Ea.templateUrl||Ea.template)){E=!0;break}Ea=!0}!B.templateUrl&&
67 | B.controller&&(y=B.controller,v=v||V(),X("'"+L+"' controller",v[L],B,t),v[L]=B);if(y=B.transclude)if(K=!0,B.$$tlb||(X("transclusion",I,B,t),I=B),"element"==y)Ca=!0,p=B.priority,Q=t,t=d.$$element=H(ba.$$createComment(L,d[L])),b=t[0],da(f,Aa.call(Q,0),b),Q[0].$$parentNode=Q[0].parentNode,s=Zb(E,Q,e,p,g&&g.name,{nonTlbTranscludeDirective:I});else{var P=V();Q=H(Wb(b)).contents();if(J(y)){Q=[];var Z=V(),Y=V();q(y,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Z[a]=b;P[b]=null;Y[b]=c});q(t.contents(),
68 | function(a){var b=Z[ya(oa(a))];b?(Y[b]=!0,P[b]=P[b]||[],P[b].push(a)):Q.push(a)});q(Y,function(a,b){if(!a)throw ga("reqslot",b);});for(var $ in P)P[$]&&(P[$]=Zb(E,P[$],e))}t.empty();s=Zb(E,Q,e,u,u,{needsNewScope:B.$$isolateScope||B.$$newScope});s.$$slots=P}if(B.template)if(x=!0,X("template",w,B,t),w=B,y=D(B.template)?B.template(t,d):B.template,y=ua(y),B.replace){g=B;Q=Ub.test(y)?Xc(ca(B.templateNamespace,W(y))):[];b=Q[0];if(1!=Q.length||1!==b.nodeType)throw ga("tplrt",L,"");da(f,t,b);N={$attr:{}};
69 | y=A(b,[],N);var ea=a.splice(ra+1,a.length-(ra+1));(C||G)&&Yc(y,C,G);a=a.concat(y).concat(ea);U(d,N);N=a.length}else t.html(y);if(B.templateUrl)x=!0,X("template",w,B,t),w=B,B.replace&&(g=B),n=aa(a.splice(ra,a.length-ra),t,d,f,K&&s,h,k,{controllerDirectives:v,newScopeDirective:G!==B&&G,newIsolateScopeDirective:C,templateDirective:w,nonTlbTranscludeDirective:I}),N=a.length;else if(B.compile)try{xa=B.compile(t,d,s),D(xa)?m(null,xa,R,Fa):xa&&m(xa.pre,xa.post,R,Fa)}catch(fa){c(fa,wa(t))}B.terminal&&(n.terminal=
70 | !0,p=Math.max(p,B.priority))}n.scope=G&&!0===G.scope;n.transcludeOnThisElement=K;n.templateOnThisElement=x;n.transclude=s;l.hasElementTranscludeDirective=Ca;return n}function jb(a,b,c,d){var e;if(y(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a);}else if(M(b))for(e=[],g=0,f=b.length;gn.priority)&&-1!=n.restrict.indexOf(g)){l&&(n=Qb(n,{$$start:l,$$end:m}));if(!n.$$bindings){var v=n,C=n,w=n.name,B={isolateScope:null,bindToController:null};J(C.scope)&&(!0===C.bindToController?(B.bindToController=d(C.scope,w,!0),B.isolateScope={}):B.isolateScope=d(C.scope,w,!1));J(C.bindToController)&&(B.bindToController=d(C.bindToController,w,!0));if(J(B.bindToController)){var I=C.controller,K=C.controllerAs;if(!I)throw ga("noctrl",
73 | w);if(!Uc(I,K))throw ga("noident",w);}var x=v.$$bindings=B;J(x.isolateScope)&&(n.$$isolateBindings=x.isolateScope)}b.push(n);k=n}}catch(t){c(t)}}return k}function R(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d"+b+""+a+">";return c.childNodes[0].childNodes;default:return b}}function ea(a,b){if("srcdoc"==b)return G.HTML;var c=oa(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return G.RESOURCE_URL}
78 | function fa(a,c,d,e,f){var g=ea(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===oa(a))throw ga("selmulti",wa(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers=V());if(l.test(e))throw ga("nodomevents");var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function da(a,b,
79 | c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;)8===a[b].nodeType&&
87 | Yf.call(a,b,1);return a}function Uc(a,b){if(b&&y(b))return b;if(y(a)){var d=ad.exec(a);if(d)return d[3]}}function df(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Ta(b,"controller");J(b)?S(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!J(a.$scope))throw O("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,n;h=!0===h;k&&y(k)&&(n=k);if(y(f)){k=f.match(ad);
88 | if(!k)throw Zf("ctrlfmt",f);m=k[1];n=n||k[3];f=a.hasOwnProperty(m)?a[m]:Bc(g.$scope,m,!0)||(b?Bc(c,m,!0):u);Sa(f,m,!0)}if(h)return h=(M(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),n&&e(g,n,l,m||f.name),S(function(){var a=d.invoke(f,l,g,m);a!==l&&(J(a)||D(a))&&(l=a,n&&e(g,n,l,m||f.name));return l},{instance:l,identifier:n});l=d.instantiate(f,g,m);n&&e(g,n,l,m||f.name);return l}}]}function ef(){this.$get=["$window",function(a){return H(a.document)}]}function ff(){this.$get=["$log",function(a){return function(b,
89 | d){a.error.apply(a,arguments)}}]}function $b(a){return J(a)?fa(a)?a.toISOString():db(a):a}function lf(){this.$get=function(){return function(a){if(!a)return"";var b=[];pc(a,function(a,c){null===a||z(a)||(M(a)?q(a,function(a){b.push(ja(c)+"="+ja($b(a)))}):b.push(ja(c)+"="+ja($b(a))))});return b.join("&")}}}function mf(){this.$get=function(){return function(a){function b(a,e,f){null===a||z(a)||(M(a)?q(a,function(a,c){b(a,e+"["+(J(a)?c:"")+"]")}):J(a)&&!fa(a)?pc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?
90 | "":"]"))}):d.push(ja(e)+"="+ja($b(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function ac(a,b){if(y(a)){var d=a.replace($f,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(bd))||(c=(c=d.match(ag))&&bg[c[0]].test(d));c&&(a=uc(d))}}return a}function cd(a){var b=V(),d;y(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=N(W(a.substr(0,d)));a=W(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):J(a)&&q(a,function(a,d){var f=N(d),g=W(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}
91 | function dd(a){var b;return function(d){b||(b=cd(a));return d?(d=b[N(d)],void 0===d&&(d=null),d):b}}function ed(a,b,d,c){if(D(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function kf(){var a=this.defaults={transformResponse:[ac],transformRequest:[function(a){return J(a)&&"[object File]"!==ka.call(a)&&"[object Blob]"!==ka.call(a)&&"[object FormData]"!==ka.call(a)?db(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ia(bc),put:ia(bc),patch:ia(bc)},xsrfCookieName:"XSRF-TOKEN",
92 | xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return A(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return A(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a){var b=S({},a);b.data=ed(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,
93 | b){var c,d={};q(a,function(a,e){D(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!J(b))throw O("$http")("badreq",b);if(!y(b.url))throw O("$http")("badreq",b.url);var f=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=S({},b.headers),f,g,h,c=S({},c.common,c[N(b.method)]);a:for(f in c){g=N(f);for(h in d)if(N(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b);f.method=vb(f.method);
94 | f.paramSerializer=y(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=ed(b.data,dd(d),u,b.transformRequest);z(e)&&q(d,function(a,b){"content-type"===N(b)&&delete d[b]});z(b.withCredentials)&&!z(a.withCredentials)&&(b.withCredentials=a.withCredentials);return n(b,e).then(c,c)},u],h=k.when(f);for(q(L,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=
95 | g.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Sa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Sa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=fd("success"),h.error=fd("error"));return h}function n(c,d){function g(a,c,d,e){function f(){l(c,a,d,e)}K&&(200<=a&&300>a?K.put(L,[a,c,cd(d),e]):K.remove(L));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function l(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?G.resolve:
96 | G.reject)({data:a,status:b,headers:dd(d),config:c,statusText:e})}function n(a){l(a.data,a.status,ia(a.headers()),a.statusText)}function t(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var G=k.defer(),C=G.promise,K,I,qa=c.headers,L=p(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);C.then(t,t);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(K=J(c.cache)?c.cache:J(a.cache)?a.cache:F);K&&(I=K.get(L),A(I)?I&&D(I.then)?I.then(n,n):M(I)?
97 | l(I[1],I[0],ia(I[2]),I[3]):l(I,200,{},"OK"):K.put(L,C));z(I)&&((I=gd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:u)&&(qa[c.xsrfHeaderName||a.xsrfHeaderName]=I),e(c.method,L,d,g,qa,c.timeout,c.withCredentials,c.responseType));return C}function p(a,b){0=l&&(v.resolve(r),x(Q.$$intervalId),delete g[Q.$$intervalId]);w||a.$apply()},k);g[Q.$$intervalId]=v;return Q}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),
106 | delete g[a.$$intervalId],!0):!1};return f}]}function cc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=rb(a[b]);return a.join("/")}function hd(a,b){var d=sa(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=Y(d.port)||dg[d.protocol]||null}function id(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=sa(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path=
107 | "/"+b.$$path)}function la(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Ka(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function kb(a){return a.replace(/(#.+)|#$/,"$1")}function dc(a,b,d){this.$$html5=!0;d=d||"";hd(a,this);this.$$parse=function(a){var d=la(b,a);if(!y(d))throw Fb("ipthprfx",a,b);id(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Sb(this.$$search),d=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=cc(this.$$path)+(a?"?"+a:"")+
108 | d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;A(f=la(a,c))?(g=f,g=A(f=la(d,f))?b+(la("/",f)||f):a+g):A(f=la(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function ec(a,b,d){hd(a,this);this.$$parse=function(c){var e=la(a,c)||la(b,c),f;z(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",z(e)&&(a=c,this.replace())):(f=la(d,e),z(f)&&(f=e));id(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&
109 | (f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Sb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Ka(a)==Ka(b)?(this.$$parse(b),!0):!1}}function jd(a,b,d){this.$$html5=!0;ec.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ka(c)?
110 | f=c:(g=la(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Sb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Gb(a){return function(){return this[a]}}function kd(a,b){return function(d){if(z(d))return this[a];this[a]=b(d);this.$$compose();return this}}function pf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return A(b)?(a=b,this):
111 | a};this.html5Mode=function(a){return Oa(a)?(b.enabled=a,this):J(a)?(Oa(a.enabled)&&(b.enabled=a.enabled),Oa(a.requireBase)&&(b.requireBase=a.requireBase),Oa(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,
112 | b)}var l,m;m=c.baseHref();var n=c.url(),p;if(b.enabled){if(!m&&b.requireBase)throw Fb("nobase");p=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/");m=e.history?dc:jd}else p=Ka(n),m=ec;var F=p.substr(0,Ka(p).lastIndexOf("/")+1);l=new m(p,F,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var q=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=H(a.target);"a"!==oa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;
113 | var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");J(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=sa(h.animVal).href);q.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});kb(l.absUrl())!=kb(n)&&c.url(l.absUrl(),!0);var x=!0;c.onUrlChange(function(a,b){z(la(F,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=kb(a);l.$$parse(a);
114 | l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(x=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=kb(c.url()),b=kb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(x||m)x=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:
115 | l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function qf(){var a=!0,b=this;this.debugEnabled=function(b){return A(b)?(a=b,this):a};this.$get=["$window",function(d){function c(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=d.console||{},e=b[a]||b.log||E;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});
116 | 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(){a&&c.apply(b,arguments)}}()}}]}function Wa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw ca("isecfld",b);return a}function eg(a){return a+""}function ta(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a.window===a)throw ca("isecwindow",b);if(a.children&&
117 | (a.nodeName||a.prop&&a.attr&&a.find))throw ca("isecdom",b);if(a===Object)throw ca("isecobj",b);}return a}function ld(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a===fg||a===gg||a===hg)throw ca("isecff",b);}}function Hb(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw ca("isecaf",b);}function ig(a,b){return"undefined"!==typeof a?a:b}function md(a,b){return"undefined"===typeof a?b:"undefined"===
118 | typeof b?a:a+b}function aa(a,b){var d,c;switch(a.type){case s.Program:d=!0;q(a.body,function(a){aa(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:aa(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:aa(a.left,
119 | b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:aa(a.test,b);aa(a.alternate,b);aa(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=!1;a.toWatch=[a];break;case s.MemberExpression:aa(a.object,b);a.computed&&aa(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=
120 | a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];q(a.elements,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=
121 | !0;c=[];q(a.properties,function(a){aa(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1;a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function nd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:u}}function od(a){return a.type===s.Identifier||a.type===s.MemberExpression}function pd(a){if(1===a.body.length&&od(a.body[0].expression))return{type:s.AssignmentExpression,
122 | left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function qd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function rd(a,b){this.astBuilder=a;this.$filter=b}function sd(a,b){this.astBuilder=a;this.$filter=b}function Ib(a){return"constructor"==a}function fc(a){return D(a.valueOf)?a.valueOf():jg.call(a)}function rf(){var a=V(),b=V(),d={"true":!0,
123 | "false":!1,"null":null,undefined:u};this.addLiteral=function(a,b){d[a]=b};this.$get=["$filter",function(c){function e(d,e,g){var p,t,G;g=g||x;switch(typeof d){case "string":G=d=d.trim();var C=g?b:a;p=C[G];if(!p){":"===d.charAt(0)&&":"===d.charAt(1)&&(t=!0,d=d.substring(2));p=g?L:F;var K=new gc(p);p=(new hc(K,c,p)).parse(d);p.constant?p.$$watchDelegate=m:t?p.$$watchDelegate=p.literal?l:k:p.inputs&&(p.$$watchDelegate=h);g&&(p=f(p));C[G]=p}return n(p,e);case "function":return n(d,e);default:return n(E,
124 | e)}}function f(a){function b(c,d,e,f){var g=x;x=!0;try{return a(c,d,e,f)}finally{x=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=f(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c=this.promise.$$state.status&&
131 | d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f
139 | a)for(b in l++,f)va.call(e,b)||(v--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1t&&(z=4-t,A[z]||(A[z]=[]),A[z].push({msg:D(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:k}));else if(a===c){q=!1;break a}}catch(H){f(H)}if(!(p=F.$$watchersCount&&
141 | F.$$childHead||F!==this&&F.$$nextSibling))for(;F!==this&&!(p=F.$$nextSibling);)F=F.$parent}while(F=p);if((q||v.length)&&!t--)throw w.$$phase=null,d("infdig",b,A);}while(q||v.length);for(w.$$phase=null;u.length;)try{u.shift()()}catch(J){f(J)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===w&&h.$$applicationDestroyed();p(this,-this.$$watchersCount);for(var b in this.$$listenerCount)F(this,this.$$listenerCount[b],b);a&&a.$$childHead==
142 | this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=E;this.$on=this.$watch=this.$watchGroup=function(){return E};this.$$listeners={};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){w.$$phase||
143 | v.length||h.defer(function(){v.length&&w.$digest()});v.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){u.push(a)},$apply:function(a){try{n("$apply");try{return this.$eval(a)}finally{w.$$phase=null}}catch(b){f(b)}finally{try{w.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&t.push(b);a=g(a);r()},$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]=
144 | 0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,F(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;lDa)throw ua("iequirks");var c=ia(ma);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},
151 | c.valueOf=$a);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;q(ma,function(a,b){var d=N(b);c[fb("parse_as_"+d)]=function(b){return e(a,b)};c[fb("get_trusted_"+d)]=function(b){return f(a,b)};c[fb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function xf(){this.$get=["$window","$document",function(a,b){var d={},c=!(a.chrome&&a.chrome.app&&a.chrome.app.runtime)&&a.history&&a.history.pushState,
152 | e=Y((/android (\d+)/.exec(N((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,m=!1,n=!1;if(l){for(var p in l)if(m=k.exec(p)){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);n=!!("animation"in l||h+"Animation"in l);!e||m&&n||(m=y(l.webkitTransition),n=y(l.webkitAnimation))}return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===
153 | a&&11>=Da)return!1;if(z(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ga(),vendorPrefix:h,transitions:m,animations:n,android:e}}]}function zf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;y(g)&&b.get(g)||(g=e.getTrustedResourceUrl(g));var k=d.defaults&&d.defaults.transformResponse;M(k)?k=k.filter(function(a){return a!==ac}):k===ac&&(k=null);return d.get(g,
154 | S({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw lg("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Af(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=ea.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+
155 | ud(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;hc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==jc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==jc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Ed&&(d=d.splice(0,Ed-1),b=c-1,c=1);return{d:d,e:b,i:c}}function tg(a,b,d,c){var e=a.d,f=e.length-a.i;b=z(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fh;)k.unshift(0),h++;0=b.lgSize&&h.unshift(k.splice(-b.lgSize).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Jb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length-d)f+=d;0===f&&-12==d&&(f=12);return Jb(f,b,c,e)}}function lb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Fd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Gd(a){return function(b){var d=Fd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Jb(b,a)}}function kc(a,b){return 0>=a.getFullYear()?
166 | b.ERAS[0]:b.ERAS[1]}function zd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=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)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",h=
167 | [],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;y(c)&&(c=ug.test(c)?Y(c):b(c));R(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=vg.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=vc(f,m),c=Rb(c,f,!0));q(h,function(b){k=wg[b];g+=k?k(c,a.DATETIME_FORMATS,m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ng(){return function(a,b){z(b)&&(b=2);return db(a,b)}}function og(){return function(a,b,d){b=Infinity===
168 | Math.abs(Number(b))?Number(b):Y(b);if(isNaN(b))return a;R(a)&&(a=a.toString());if(!M(a)&&!y(a))return a;d=!d||isNaN(d)?0:Y(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Bd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=$a;if(D(b))h=b;else if(y(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,
169 | descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(null==a)return a;if(!za(a))throw O("orderBy")("notarray",a);M(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===
170 | c)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),d(e)))break a;if(rc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;db||37<=b&&40>=b||
175 | m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(Jd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Mb(a,b){return function(d,c){var e,f;if(fa(d))return d;if(y(d)){'"'==d.charAt(0)&&'"'==d.charAt(d.length-
176 | 1)&&(d=d.substring(1,d.length-1));if(xg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(e,function(a,c){c=x};g.$observe("min",function(a){x=
178 | p(a);h.$validate()})}if(A(g.max)||g.ngMax){var r;h.$validators.max=function(a){return!n(a)||z(r)||d(a)<=r};g.$observe("max",function(a){r=p(a);h.$validate()})}}}function Kd(a,b,d,c){(c.$$hasNativeValidators=J(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?u:a})}function Ld(a,b,d,c,e){if(A(c)){a=a(c);if(!a.constant)throw ob("constexpr",d,c);return a(b)}return e}function mc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=
179 | [],d=0;a:for(;d(?:<\/\1>|)$/,Ub=/<|?\w+;/,Jf=/<([\w:-]+)/,Kf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,ha={option:[1,'"],thead:[1,""],col:[2,
186 | ""],tr:[2,""],td:[3,""],_default:[0,"",""]};ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead;ha.th=ha.td;var Rf=Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Ra=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===P.readyState?setTimeout(b):(this.on("DOMContentLoaded",b),U(T).on("load",b))},toString:function(){var a=
187 | [];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?H(this[a]):H(this[this.length+a])},length:0,push:zg,sort:[].sort,splice:[].splice},Eb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Eb[N(a)]=a});var Sc={};q("input select option textarea button form details".split(" "),function(a){Sc[a]=!0});var $c={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:Xb,removeData:gb,
188 | hasData:function(a){for(var b in hb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b/,Uf=/^[^\(]*\(\s*([^\)]*)\)/m,Ag=/,/,Bg=/^\s*(_?)(\S+?)\1\s*$/,Sf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ia=O("$injector");eb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw y(d)&&d||(d=a.name||Vf(a)),Ia("strictdi",d);b=Tc(a);q(b[1].split(Ag),function(a){a.replace(Bg,function(a,b,d){c.push(d)})})}a.$inject=c}}else M(a)?
197 | (b=a.length-1,Sa(a[b],"fn"),c=a.slice(0,b)):Sa(a,"fn",!0);return c};var Pd=O("$animate"),Ye=function(){this.$get=E},Ze=function(){var a=new Ua,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=y(b)?b.split(" "):M(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){q(b,function(b){var c=a.get(b);if(c){var d=Wf(b.attr("class")),e="",f="";q(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&Cb(a,
198 | e);f&&Bb(a,f)});a.remove(b)}});b.length=0}return{enabled:E,on:E,off:E,pin:E,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},We=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Pd("notcsel",
199 | d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Pd("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h <= >= && || ! = |".split(" "),function(a){Nb[a]=!0});var Fg={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=
210 | [];this.index=a&&"string"===typeof 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"-"===
212 | a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=A(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ca("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:s.BinaryExpression,
219 | operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:
220 | this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=pa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:s.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",
221 | this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());
222 | return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");
223 | return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},throwError:function(a,b){throw ca("syntax",b.text,a,b.index+1,this.text,
224 | this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ca("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ca("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},
225 | expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:s.ThisExpression},$locals:{type:s.LocalsExpression}}};rd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};aa(c,d.$filter);var e="",f;this.stage="assign";if(f=pd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+
226 | this.generateFunction("assign","s,v,l");f=nd(c.body);d.stage="inputs";q(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject",
227 | "ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",e))(this.$filter,Wa,ta,ld,eg,Hb,ig,md,a);this.state=this.stage=u;e.literal=qd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+
228 | "};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,m;c=c||E;if(!f&&A(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,
229 | c,e,!0));else switch(a.type){case s.Program:q(a.body,function(b,c){k.recurse(b.expression,u,u,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case s.UnaryExpression:this.recurse(a.argument,u,u,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case s.BinaryExpression:this.recurse(a.left,u,u,function(a){g=a});this.recurse(a.right,u,u,function(a){h=a});m="+"===
230 | a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?
231 | "s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Wa(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Ib(a.name))&&k.addEnsureSafeObject(b);c(b);
232 | break;case s.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,u,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Wa(a.property.name);e&&
233 | 1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Ib(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+
234 | l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=
235 | this.nextId();g={};if(!od(a.left))throw ca("lval");this.recurse(a.left,u,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case s.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case s.ObjectExpression:l=
236 | [];q(a.properties,function(a){k.recurse(a.value,k.nextId(),u,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});m="{"+l.join(",")+"}";this.assign(b,m);c(m);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.LocalsExpression:this.assign(b,"l");c("l");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+
237 | a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");
238 | d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){return a+"."+b},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),
239 | ";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=
240 | this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(y(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(R(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ca("esc");},nextId:function(a,
241 | b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;aa(c,d.$filter);var e,f;if(e=pd(c))f=this.recurse(e);e=nd(c.body);var g;e&&(g=[],q(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?E:1===
242 | c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=qd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),
243 | this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Wa(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Ib(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Wa(a.property.name,f.expression),
244 | e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],q(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var n=[],p=0;p":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,
250 | g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:u,
251 | name:u,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:u;b&&ta(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m+="",Wa(m,e),c&&1!==c&&(Hb(l),l&&!l[m]&&(l[m]={})),n=l[m],ta(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Hb(g),g&&!g[b]&&
252 | (g[b]={}));h=null!=g?g[b]:u;(d||Ib(b))&&ta(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var hc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(a,d);this.astCompiler=d.csp?new sd(this.ast,b):new rd(this.ast,b)};hc.prototype={constructor:hc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var jg=Object.prototype.valueOf,ua=O("$sce"),ma={HTML:"html",CSS:"css",URL:"url",
253 | RESOURCE_URL:"resourceUrl",JS:"js"},lg=O("$compile"),Z=P.createElement("a"),wd=sa(T.location.href);xd.$inject=["$document"];Jc.$inject=["$provide"];var Ed=22,Dd=".",jc="0";yd.$inject=["$locale"];Ad.$inject=["$locale"];var wg={yyyy:X("FullYear",4,0,!1,!0),yy:X("FullYear",2,0,!0,!0),y:X("FullYear",1,0,!1,!0),MMMM:lb("Month"),MMM:lb("Month",!0),MM:X("Month",2,1),M:X("Month",1,1),LLLL:lb("Month",!1,!0),dd:X("Date",2),d:X("Date",1),HH:X("Hours",2),H:X("Hours",1),hh:X("Hours",2,-12),h:X("Hours",1,-12),
254 | mm:X("Minutes",2),m:X("Minutes",1),ss:X("Seconds",2),s:X("Seconds",1),sss:X("Milliseconds",3),EEEE:lb("Day"),EEE:lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Jb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},vg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,
255 | ug=/^\-?\d+$/;zd.$inject=["$locale"];var pg=da(N),qg=da(vb);Bd.$inject=["$parse"];var me=da({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ka.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};q(Eb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=ya("ng-"+b),e=d;"checked"===a&&(e=function(a,
256 | b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});q($c,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(yg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=ya("ng-"+a);wb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===
257 | ka.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Da&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Kb={$addControl:E,$$renameControl:function(a,b){a.$name=b},$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E,$setSubmitted:E};Hd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Qd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||E}return{name:"form",
258 | restrict:a?"EAC":"E",require:["form","^^?form"],controller:Hd,compile:function(d,f){d.addClass(Xa).addClass(pb);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var p=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",p,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",p,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var q=g?c(n.$name):E;g&&
259 | (q(a,n),e.$observe(g,function(b){n.$name!==b&&(q(a,u),n.$$parentForm.$$renameControl(n,b),q=c(n.$name),q(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);q(a,u);S(n,Kb)})}}}}}]},ne=Qd(),Ae=Qd(!0),xg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Gg=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Hg=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
260 | Ig=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Rd=/^(\d{4,})-(\d{2})-(\d{2})$/,Sd=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,nc=/^(\d{4,})-W(\d\d)$/,Td=/^(\d{4,})-(\d\d)$/,Ud=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Jd=V();q(["date","datetime-local","month","time","week"],function(a){Jd[a]=!0});var Vd={text:function(a,b,d,c,e,f){mb(a,b,d,c,e,f);lc(c)},date:nb("date",Rd,Mb(Rd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":nb("datetimelocal",Sd,Mb(Sd,"yyyy MM dd HH mm ss sss".split(" ")),
261 | "yyyy-MM-ddTHH:mm:ss.sss"),time:nb("time",Ud,Mb(Ud,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:nb("week",nc,function(a,b){if(fa(a))return a;if(y(a)){nc.lastIndex=0;var d=nc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Fd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:nb("month",Td,Mb(Td,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Kd(a,b,d,c);mb(a,b,d,c,e,f);c.$$parserName=
262 | "number";c.$parsers.push(function(a){return c.$isEmpty(a)?null:Ig.test(a)?parseFloat(a):u});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!R(a))throw ob("numfmt",a);a=a.toString()}return a});if(A(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||z(g)||a>=g};d.$observe("min",function(a){A(a)&&!R(a)&&(a=parseFloat(a,10));g=R(a)&&!isNaN(a)?a:u;c.$validate()})}if(A(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||z(h)||a<=h};d.$observe("max",function(a){A(a)&&
263 | !R(a)&&(a=parseFloat(a,10));h=R(a)&&!isNaN(a)?a:u;c.$validate()})}},url:function(a,b,d,c,e,f){mb(a,b,d,c,e,f);lc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Gg.test(d)}},email:function(a,b,d,c,e,f){mb(a,b,d,c,e,f);lc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Hg.test(d)}},radio:function(a,b,d,c){z(d.name)&&b.attr("name",++qb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=
264 | function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Ld(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Ld(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return na(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:E,button:E,submit:E,reset:E,file:E},Dc=["$browser",
265 | "$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Vd[N(g.type)]||Vd.text)(e,f,g,h[0],b,a,d,c)}}}}],Jg=/^(true|false|\d+)$/,Se=function(){return{restrict:"A",priority:100,compile:function(a,b){return Jg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},se=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);
266 | return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=z(a)?"":a})}}}}],ue=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=z(a)?"":a})}}}}],te=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=
267 | b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Re=da({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),ve=mc("",!0),xe=mc("Odd",0),we=mc("Even",1),ye=Na({compile:function(a,b){b.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ze=[function(){return{restrict:"A",scope:!0,controller:"@",
268 | priority:500}}],Ic={},Kg={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=ya("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Kg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Ce=["$animate","$compile",function(a,
269 | b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=ub(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],De=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,
270 | transclude:"element",controller:ea.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,n,p){var q=0,s,x,r,w=function(){x&&(x.remove(),x=null);s&&(s.$destroy(),s=null);r&&(d.leave(r).then(function(){x=null}),x=r,r=null)};c.$watch(f,function(f){var m=function(){!A(h)||h&&!c.$eval(h)||b()},t=++q;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===q){var b=c.$new();n.template=a;a=p(b,function(a){w();d.enter(a,null,e).then(m)});s=b;r=a;s.$emit("$includeContentLoaded",
271 | f);c.$eval(g)}},function(){c.$$destroyed||t!==q||(w(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(w(),n.template=null)})}}}}],Ue=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ka.call(d[0]).match(/SVG/)?(d.empty(),a(Lc(e.template,P).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Ee=Na({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),
272 | Qe=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?W(e):e;c.$parsers.push(function(a){if(!z(a)){var b=[];a&&q(a.split(g),function(a){a&&b.push(f?W(a):a)});return b}});c.$formatters.push(function(a){return M(a)?a.join(e):u});c.$isEmpty=function(a){return!a||!a.length}}}},pb="ng-valid",Md="ng-invalid",Xa="ng-pristine",Lb="ng-dirty",Od="ng-pending",ob=O("ngModel"),Lg=["$scope","$exceptionHandler","$attrs",
273 | "$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};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.$error={};this.$$success={};this.$pending=u;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Kb;var m=e(d.ngModel),
274 | n=m.assign,p=m,s=n,y=null,x,r=this;this.$$setOptions=function(a){if((r.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");p=function(a){var c=m(a);D(c)&&(c=b(a));return c};s=function(a,b){D(m(a))?f(a,{$$$p:b}):n(a,b)}}else if(!m.assign)throw ob("nonassign",d.ngModel,wa(c));};this.$render=E;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){r.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"),f.addClass(c,"ng-empty")):(f.removeClass(c,
275 | "ng-empty"),f.addClass(c,"ng-not-empty"))};var w=0;Id({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){r.$dirty=!1;r.$pristine=!0;f.removeClass(c,Lb);f.addClass(c,Xa)};this.$setDirty=function(){r.$dirty=!0;r.$pristine=!1;f.removeClass(c,Xa);f.addClass(c,Lb);r.$$parentForm.$setDirty()};this.$setUntouched=function(){r.$touched=!1;r.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){r.$touched=
276 | !0;r.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(y);r.$viewValue=r.$$lastCommittedViewValue;r.$render()};this.$validate=function(){if(!R(r.$modelValue)||!isNaN(r.$modelValue)){var a=r.$$rawModelValue,b=r.$valid,c=r.$modelValue,d=r.$options&&r.$options.allowInvalid;r.$$runValidators(a,r.$$lastCommittedViewValue,function(e){d||b===e||(r.$modelValue=e?a:u,r.$modelValue!==c&&r.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=
277 | !0;q(r.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(r.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(r.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!D(h.then))throw ob("nopromise",h);f(g,u);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},E):g(!0)}function f(a,b){h===w&&r.$setValidity(a,b)}function g(a){h===w&&c(a)}w++;var h=w;(function(){var a=r.$$parserName||"parse";if(z(x))f(a,null);
278 | else return x||(q(r.$validators,function(a,b){f(b,null)}),q(r.$asyncValidators,function(a,b){f(b,null)})),f(a,x),x;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=r.$viewValue;g.cancel(y);if(r.$$lastCommittedViewValue!==a||""===a&&r.$$hasNativeValidators)r.$$updateEmptyClasses(a),r.$$lastCommittedViewValue=a,r.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=r.$$lastCommittedViewValue;if(x=z(b)?u:!0)for(var c=0;ce||c.$isEmpty(b)||
307 | b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=Y(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};T.angular.bootstrap?T.console&&console.log("WARNING: Tried to load angular more than once."):(he(),je(ea),ea.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM",
308 | "PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,
309 | 6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,
310 | c){var e=a|0,f=c;u===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),H(P).ready(function(){de(P,yc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('');
311 | //# sourceMappingURL=angular.min.js.map
312 |
--------------------------------------------------------------------------------