diff --git a/.env b/.env
new file mode 100644
index 000000000..f289c298e
--- /dev/null
+++ b/.env
@@ -0,0 +1,2 @@
+TZ=America/Toronto
+SERVER_HOST=localhost
diff --git a/.github/workflows/release-bot.yml b/.github/workflows/release-bot.yml
new file mode 100644
index 000000000..bc0b705ac
--- /dev/null
+++ b/.github/workflows/release-bot.yml
@@ -0,0 +1,68 @@
+name: Create Release checklist
+on:
+ pull_request:
+ branches:
+ - "master"
+
+jobs:
+ release-checklist:
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+ - name: Create output folder
+ run: mkdir -p ${{ github.workspace }}/checklist_items
+ - name: Write checklist items to files
+ id: merge_commits
+ run: |
+ git fetch origin master
+ git fetch origin ${GITHUB_HEAD_REF}
+ MERGE_COMMITS=$(git --no-pager log origin/${GITHUB_HEAD_REF} ^origin/master --oneline --merges --grep "Merge pull request" --pretty=format:"%h")
+
+ for COMMIT in $MERGE_COMMITS; do
+ # Merge commit title
+ checkitem_title=$(git --no-pager show $COMMIT --pretty=format:"%s" | head -n 1 | sed 's/Merge\ pull\ request\ //' | sed 's/from.*\///')
+ # Commits inside this pull request
+ details=$(git --no-pager log $COMMIT^1..$COMMIT^2 --oneline | sed 's/[a-f0-9]*\ /- /')
+
+ content="- [ ] ${checkitem_title}
+ details
+
+ \`\`\`
+ ${details}
+ \`\`\`
+
+ "
+ echo "$content" > checklist_items/$COMMIT.log
+ done
+
+ - name: Collect checklist items
+ run: |
+ msg=$(awk 'FNR==1 && NR!=1 {print "---"}{print}' checklist_items/*.log)
+ echo "$msg" >> aggregated.log
+ sha="*SHA: ${{ github.event.pull_request.head.sha }}*"
+ sed -i "1i\\
+ $sha
+ " aggregated.log
+
+ - name: Update Pull Request
+ uses: actions/github-script@v5
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ const fs = require('fs');
+
+ fs.readFile('aggregated.log', 'utf8', (err, data) => {
+ if (err) {
+ console.error(err);
+ } else {
+ const output = data;
+
+ github.rest.issues.createComment({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body: output
+ })
+ }
+ });
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 762f4c633..7bc57d14e 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ REPLACE := perl -i -pe
RODAN_PATH := ./rodan-main/code/rodan
JOBS_PATH := $(RODAN_PATH)/jobs
-PROD_TAG := v2.0.15
+PROD_TAG := v3.0.0
DOCKER_TAG := nightly
@@ -53,14 +53,6 @@ test_prod: pull_prod
# different tag.
docker compose -f test-prod-compose.yml up
-build_arm:
- @docker build -f ./nginx/Dockerfile.arm --no-cache --tag nginx-local --build-arg VERSION=${DOCKER_TAG} nginx
-
-run_arm:
- # Run build_arm first if you don't have the NGINX container.
- # Launch ARM instance
- @DOCKER_TAG=$(DOCKER_TAG) docker compose -f arm-compose.yml up
-
run_client:
# Run Rodan-Client for dev (needs local dev up and running)
@docker run -p 8080:9002 -v `pwd`/rodan-client/code:/code ddmal/rodan-client:nightly bash
@@ -84,7 +76,6 @@ copy_docker_tag:
@docker image tag $(docker images ddmal/rodan-gpu-celery:nightly -q) ddmal/rodan-gpu-celery:$(tag)
pull_prod:
- docker pull ddmal/hpc-rabbitmq:$(PROD_TAG)
docker pull ddmal/iipsrv:nightly
docker pull ddmal/nginx:$(PROD_TAG)
docker pull ddmal/postgres-plpython:$(PROD_TAG)
@@ -180,7 +171,6 @@ scale:
@docker service scale rodan_redis=$(num)
# @docker service scale rodan_postgres=$(num)
@docker service scale rodan_rabbitmq=$(num)
- @docker service scale rodan_hpc-rabbitmq=$(num)
health:
@docker inspect --format "{{json .State.Health }}" $(log) | jq
@@ -230,7 +220,7 @@ push:
pull:
@echo "[-] Pulling docker images from Docker Hub..."
- @docker compose pull
+ @DOCKER_TAG=$(DOCKER_TAG) docker compose pull
@echo "[+] Done."
$(JOBS_PATH)/neon_wrapper/Neon/package.json:
diff --git a/arm-compose.yml b/arm-compose.yml
deleted file mode 100644
index 0df99b78d..000000000
--- a/arm-compose.yml
+++ /dev/null
@@ -1,117 +0,0 @@
-version: "3.4"
-services:
- nginx:
- image: "nginx-local:latest"
- command: /run/start
- depends_on:
- - rodan-main
- ports:
- - "80:80"
- - "443:443"
- - "9002:9002"
- volumes:
- - "resources:/rodan/data"
-
- rodan-main:
- image: "ddmal/rodan-main:${DOCKER_TAG}"
- healthcheck:
- test: ["CMD-SHELL", "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1"]
- interval: "10s"
- timeout: "5s"
- retries: 2
- start_period: "2m"
- command: bash -c "tail -f /dev/null"
- environment:
- CELERY_JOB_QUEUE: None
- depends_on:
- - postgres
- - rabbitmq
- - redis
- env_file:
- - ./scripts/local.env
- volumes:
- - "resources:/rodan/data"
- - "./rodan-main/code:/code/Rodan"
-
-
- iipsrv:
- image: "ddmal/iipsrv:nightly"
- volumes:
- - "resources:/rodan/data"
-
-
- celery:
- image: "ddmal/rodan-main:${DOCKER_TAG}"
- command: bash -c "tail -f /dev/null"
- environment:
- CELERY_JOB_QUEUE: celery
- healthcheck:
- test: ["CMD", "celery", "inspect", "ping", "-A", "rodan", "--workdir", "/code/Rodan", "-d", "celery@celery"]
- interval: "30s"
- timeout: "3s"
- start_period: "1m"
- retries: 3
- depends_on:
- - postgres
- - rodan-main
- - rabbitmq
- - redis
- env_file:
- - ./scripts/local.env
- volumes:
- - "resources:/rodan/data"
- - "./rodan-main/code:/code/Rodan"
-
- py3-celery:
- image: "ddmal/rodan-python3-celery:${DOCKER_TAG}"
- command: bash -c "tail -f /dev/null"
- environment:
- CELERY_JOB_QUEUE: Python3
- depends_on:
- - postgres
- - rodan-main
- - rabbitmq
- - redis
- - celery
- env_file:
- - ./scripts/local.env
- - ./hpc-rabbitmq/scripts/local.env
- volumes:
- - "resources:/rodan/data"
- - "./rodan-main/code:/code/Rodan"
-
-
- redis:
- image: "redis:alpine"
- healthcheck:
- test: ["CMD", "redis-cli", "ping"]
- interval: 10s
- timeout: 5s
- retries: 5
- depends_on:
- - postgres
-
- postgres:
- image: "ddmal/postgres-plpython:${DOCKER_TAG}"
- healthcheck:
- test: ["CMD-SHELL", "pg_isready", "-U", "postgres"]
- interval: 10s
- timeout: 5s
- retries: 5
- env_file:
- - ./scripts/local.env
-
- rabbitmq:
- image: "rabbitmq:alpine"
- healthcheck:
- test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
- interval: "30s"
- timeout: "3s"
- retries: 3
- depends_on:
- - redis
- env_file:
- - ./scripts/local.env
-
-volumes:
- resources:
diff --git a/build.yml b/build.yml
index 74af9d177..223208a41 100644
--- a/build.yml
+++ b/build.yml
@@ -49,8 +49,8 @@ services:
dockerfile: Dockerfile
image: "ddmal/rodan-client:nightly"
- hpc-rabbitmq:
+ iipsrv:
build:
- context: ./hpc-rabbitmq
+ context: ./iipsrv
dockerfile: Dockerfile
- image: "ddmal/hpc-rabbitmq:nightly"
+ image: "ddmal/iipsrv:nightly"
diff --git a/docker-compose.yml b/docker-compose.yml
index 1490986db..343879a76 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,6 +9,9 @@ services:
- rabbitmq
- redis
- rodan-main
+ environment:
+ TZ: America/Toronto
+ SERVER_HOST: localhost
ports:
- "80:80"
- "443:443"
@@ -19,13 +22,19 @@ services:
rodan-main:
image: "ddmal/rodan-main:${DOCKER_TAG}"
healthcheck:
- test: ["CMD-SHELL", "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1"]
+ test:
+ [
+ "CMD-SHELL",
+ "/usr/bin/curl -H 'User-Agent: docker-healthcheck' http://localhost:8000/api/?format=json || exit 1"
+ ]
interval: "10s"
timeout: "5s"
retries: 2
start_period: "2m"
command: bash -c "tail -f /dev/null"
environment:
+ TZ: America/Toronto
+ SERVER_HOST: localhost
CELERY_JOB_QUEUE: None
depends_on:
- postgres
@@ -38,8 +47,14 @@ services:
- "resources:/rodan/data"
- "./rodan-main/code:/code/Rodan"
+ rodan-client:
+ image: "ddmal/rodan-client:${DOCKER_TAG}"
+ volumes:
+ - "./rodan-client/code:/code"
+ - "./rodan-client/config/configuration.json:/client/configuration.json"
+
iipsrv:
- image: "ddmal/iipsrv:nightly"
+ image: "ddmal/iipsrv:${DOCKER_TAG}"
volumes:
- "resources:/rodan/data"
@@ -47,9 +62,23 @@ services:
image: "ddmal/rodan-main:${DOCKER_TAG}"
command: bash -c "tail -f /dev/null"
environment:
+ TZ: America/Toronto
+ SERVER_HOST: localhost
CELERY_JOB_QUEUE: celery
healthcheck:
- test: ["CMD", "celery", "inspect", "ping", "-A", "rodan", "--workdir", "/code/Rodan", "-d", "celery@celery"]
+ test:
+ [
+ "CMD",
+ "celery",
+ "inspect",
+ "ping",
+ "-A",
+ "rodan",
+ "--workdir",
+ "/code/Rodan",
+ "-d",
+ "celery@celery"
+ ]
interval: "30s"
timeout: "3s"
start_period: "1m"
@@ -69,6 +98,8 @@ services:
image: "ddmal/rodan-python3-celery:${DOCKER_TAG}"
command: bash -c "tail -f /dev/null"
environment:
+ TZ: America/Toronto
+ SERVER_HOST: localhost
CELERY_JOB_QUEUE: Python3
depends_on:
- postgres
@@ -78,7 +109,6 @@ services:
- celery
env_file:
- ./scripts/local.env
- - ./hpc-rabbitmq/scripts/local.env
volumes:
- "resources:/rodan/data"
- "./rodan-main/code:/code/Rodan"
@@ -87,6 +117,8 @@ services:
image: "ddmal/rodan-gpu-celery:${DOCKER_TAG}"
command: bash -c "tail -f /dev/null"
environment:
+ TZ: America/Toronto
+ SERVER_HOST: localhost
CELERY_JOB_QUEUE: GPU
depends_on:
- postgres
@@ -103,7 +135,7 @@ services:
redis:
image: "redis:alpine"
healthcheck:
- test: ["CMD", "redis-cli", "ping"]
+ test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 5
@@ -113,7 +145,7 @@ services:
postgres:
image: "ddmal/postgres-plpython:${DOCKER_TAG}"
healthcheck:
- test: ["CMD-SHELL", "pg_isready", "-U", "postgres"]
+ test: [ "CMD-SHELL", "pg_isready", "-U", "postgres" ]
interval: 10s
timeout: 5s
retries: 5
@@ -123,7 +155,7 @@ services:
rabbitmq:
image: "rabbitmq:alpine"
healthcheck:
- test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
+ test: [ "CMD", "rabbitmq-diagnostics", "-q", "ping" ]
interval: "30s"
timeout: "3s"
retries: 3
@@ -132,17 +164,5 @@ services:
env_file:
- ./scripts/local.env
- hpc-rabbitmq:
- image: "ddmal/hpc-rabbitmq:${DOCKER_TAG}"
- healthcheck:
- test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
- interval: "30s"
- timeout: "3s"
- retries: 3
- env_file:
- - ./hpc-rabbitmq/scripts/local.env
- ports:
- - "5672:5672"
-
volumes:
resources:
diff --git a/hooks/build b/hooks/build
index 2f6d04bc0..7a1193a9e 100644
--- a/hooks/build
+++ b/hooks/build
@@ -2,13 +2,6 @@
# hooks/build
# https://docs.docker.com/docker-cloud/builds/advanced/
-# This "useless" image is build to prevent dockerhub from overwriting
-# the nightly image with it's obligatory minimum of a build rule. If we want a build
-# trigger with a HTTPS POST request, we must have at least 1 build rule.
-docker build \
- --tag ddmal/rodan:placeholder \
- .
-
# RODAN_TAG=`cd rodan-main/code && git describe --tags --always`
# RODAN_CLIENT_TAG=`cd rodan-client/code && git describe --tags --always`
# RODAN_DOCKER_TAG=`git describe --tags --always`
@@ -29,6 +22,26 @@ echo "[+] Building images with tag: $DOCKER_TAG"
set -o errexit
+# Fail building images
+# Push to trigger webhook and send a message to slack
+trap 'cleanup $?' EXIT
+cleanup() {
+ if [ "$1" != "0" ]; then
+ echo "An error occurs when building images."
+ echo "Push to another repo to trigger webhook on failure with tag syntax: {repo name}-{build status}-{source branch}-{docker tag}"
+
+ docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-fail-${SOURCE_BRANCH}-${DOCKER_TAG}
+ docker push ddmal/docker-webhook:rodan-fail-${SOURCE_BRANCH}-${DOCKER_TAG}
+ fi
+}
+
+# This "useless" image is build to prevent dockerhub from overwriting
+# the nightly image with it's obligatory minimum of a build rule. If we want a build
+# trigger with a HTTPS POST request, we must have at least 1 build rule.
+docker build \
+ --tag ddmal/docker-webhook:placeholder \
+ .
+
###############################################################################
# Stage 1
# Build and push Python3-Celery image
@@ -110,12 +123,12 @@ docker build \
--tag ddmal/nginx:${DOCKER_TAG} \
./nginx
-echo "[+] Building HPC-RabbitMQ"
+echo "[+] Building iipsrv"
docker build \
--no-cache \
--build-arg VERSION=${DOCKER_TAG} \
- --tag ddmal/hpc-rabbitmq:${DOCKER_TAG} \
- ./hpc-rabbitmq
+ --tag ddmal/iipsrv:${DOCKER_TAG} \
+ ./iipsrv
echo "[+] Finished"
diff --git a/hooks/post_build b/hooks/post_build
new file mode 100644
index 000000000..182d6d6fc
--- /dev/null
+++ b/hooks/post_build
@@ -0,0 +1,20 @@
+#!/bin/bash
+# hooks/post_build
+
+source ./hooks/helper.sh
+if [[ ret_code -eq 1 ]]; then
+ echo "[-] no branch detected, fallback to use docker tag=$DOCKER_TAG"
+ echo "[-] Stop building due to wrong tag: $DOCKER_TAG"
+ exit 1
+elif [[ ret_code -eq 2 ]]; then
+ echo "[-] no tag on release branch, fallback to use docker tag=$DOCKER_TAG"
+ echo "[-] Stop building due to wrong tag: $DOCKER_TAG"
+ exit 1
+fi
+
+# Pass testing a pull request
+# Push to trigger webhook and send a message to slack
+if [[ "$DOCKER_TAG" == "this" ]]; then
+ docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG}
+ docker push ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG}
+fi
diff --git a/hooks/push b/hooks/push
index a3263dba2..f80eb8b34 100644
--- a/hooks/push
+++ b/hooks/push
@@ -21,9 +21,6 @@ echo "Docker tag: $DOCKER_TAG"
# RODAN_CLIENT_TAG=`cd rodan-client/code && git describe --tags --always`
# RODAN_DOCKER_TAG=`git describe --tags --always`
-echo "[+] Pushing ddmal/rodan-python3-celery:${DOCKER_TAG}"
-docker push ddmal/rodan-python3-celery:${DOCKER_TAG}
-
echo "[+] Pushing ddmal/rodan-gpu-celery:${DOCKER_TAG}"
docker push ddmal/rodan-gpu-celery:${DOCKER_TAG}
@@ -33,5 +30,10 @@ docker push ddmal/postgres-plpython:${DOCKER_TAG}
echo "[+] Pushing ddmal/nginx:${DOCKER_TAG}"
docker push ddmal/nginx:${DOCKER_TAG}
-echo "[+] Pushing ddmal/hpc-rabbitmq:${DOCKER_TAG}"
-docker push ddmal/hpc-rabbitmq:${DOCKER_TAG}
+echo "[+] Pushing ddmal/iipsrv:${DOCKER_TAG}"
+docker push ddmal/iipsrv:${DOCKER_TAG}
+
+# Pass building images
+# Push to trigger webhook and send a message to slack
+docker tag ddmal/docker-webhook:placeholder ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG}
+docker push ddmal/docker-webhook:rodan-pass-${SOURCE_BRANCH}-${DOCKER_TAG}
diff --git a/hpc-rabbitmq/Dockerfile b/hpc-rabbitmq/Dockerfile
deleted file mode 100644
index 63cc90827..000000000
--- a/hpc-rabbitmq/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM rabbitmq:alpine
-ARG VERSION
-
-COPY ./config/rabbitmq.conf /etc/rabbitmq/
-COPY ./scripts/setup.sh /run/setup.sh
-RUN chmod +x /run/setup.sh
-
-CMD ["/run/setup.sh"]
diff --git a/hpc-rabbitmq/config/rabbitmq.conf b/hpc-rabbitmq/config/rabbitmq.conf
deleted file mode 100644
index 99c8dc6fe..000000000
--- a/hpc-rabbitmq/config/rabbitmq.conf
+++ /dev/null
@@ -1,971 +0,0 @@
-# ======================================
-# RabbitMQ broker section
-# ======================================
-
-## Related doc guide: https://rabbitmq.com/configure.html. See
-## https://rabbitmq.com/documentation.html for documentation ToC.
-
-## Networking
-## ====================
-##
-## Related doc guide: https://rabbitmq.com/networking.html.
-##
-## By default, RabbitMQ will listen on all interfaces, using
-## the standard (reserved) AMQP 0-9-1 and 1.0 port.
-##
-# listeners.tcp.default = 5672
-
-
-## To listen on a specific interface, provide an IP address with port.
-## For example, to listen only on localhost for both IPv4 and IPv6:
-##
-# IPv4
-# listeners.tcp.local = 127.0.0.1:5672
-# IPv6
-# listeners.tcp.local_v6 = ::1:5672
-
-## You can define multiple listeners using listener names
-# listeners.tcp.other_port = 5673
-# listeners.tcp.other_ip = 10.10.10.10:5672
-
-
-## TLS listeners are configured in the same fashion as TCP listeners,
-## including the option to control the choice of interface.
-##
-# listeners.ssl.default = 5671
-
-## Number of Erlang processes that will accept connections for the TCP
-## and TLS listeners.
-##
-# num_acceptors.tcp = 10
-# num_acceptors.ssl = 10
-
-
-## Maximum amount of time allowed for the AMQP 0-9-1 and AMQP 1.0 handshake
-## (performed after socket connection and TLS handshake) to complete, in milliseconds.
-##
-# handshake_timeout = 10000
-
-## Set to 'true' to perform reverse DNS lookups when accepting a
-## connection. rabbitmqctl and management UI will then display hostnames
-## instead of IP addresses. Default value is `false`.
-##
-# reverse_dns_lookups = false
-
-##
-## Security, Access Control
-## ==============
-##
-
-## Related doc guide: https://rabbitmq.com/access-control.html.
-
-## The default "guest" user is only permitted to access the server
-## via a loopback interface (e.g. localhost).
-## {loopback_users, [<<"guest">>]},
-##
-# loopback_users.guest = true
-
-## Uncomment the following line if you want to allow access to the
-## guest user from anywhere on the network.
-# loopback_users.guest = false
-
-## TLS configuration.
-##
-## Related doc guide: https://rabbitmq.com/ssl.html.
-##
-# ssl_options.verify = verify_peer
-# ssl_options.fail_if_no_peer_cert = false
-# ssl_options.cacertfile = /path/to/cacert.pem
-# ssl_options.certfile = /path/to/cert.pem
-# ssl_options.keyfile = /path/to/key.pem
-#
-# ssl_options.honor_cipher_order = true
-# ssl_options.honor_ecc_order = true
-
-# ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
-# ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
-# ssl_options.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
-# ssl_options.ciphers.4 = ECDHE-RSA-AES256-SHA384
-# ssl_options.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384
-# ssl_options.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384
-# ssl_options.ciphers.7 = ECDH-ECDSA-AES256-SHA384
-# ssl_options.ciphers.8 = ECDH-RSA-AES256-SHA384
-# ssl_options.ciphers.9 = DHE-RSA-AES256-GCM-SHA384
-# ssl_options.ciphers.10 = DHE-DSS-AES256-GCM-SHA384
-# ssl_options.ciphers.11 = DHE-RSA-AES256-SHA256
-# ssl_options.ciphers.12 = DHE-DSS-AES256-SHA256
-# ssl_options.ciphers.13 = ECDHE-ECDSA-AES128-GCM-SHA256
-# ssl_options.ciphers.14 = ECDHE-RSA-AES128-GCM-SHA256
-# ssl_options.ciphers.15 = ECDHE-ECDSA-AES128-SHA256
-# ssl_options.ciphers.16 = ECDHE-RSA-AES128-SHA256
-# ssl_options.ciphers.17 = ECDH-ECDSA-AES128-GCM-SHA256
-# ssl_options.ciphers.18 = ECDH-RSA-AES128-GCM-SHA256
-# ssl_options.ciphers.19 = ECDH-ECDSA-AES128-SHA256
-# ssl_options.ciphers.20 = ECDH-RSA-AES128-SHA256
-# ssl_options.ciphers.21 = DHE-RSA-AES128-GCM-SHA256
-# ssl_options.ciphers.22 = DHE-DSS-AES128-GCM-SHA256
-# ssl_options.ciphers.23 = DHE-RSA-AES128-SHA256
-# ssl_options.ciphers.24 = DHE-DSS-AES128-SHA256
-# ssl_options.ciphers.25 = ECDHE-ECDSA-AES256-SHA
-# ssl_options.ciphers.26 = ECDHE-RSA-AES256-SHA
-# ssl_options.ciphers.27 = DHE-RSA-AES256-SHA
-# ssl_options.ciphers.28 = DHE-DSS-AES256-SHA
-# ssl_options.ciphers.29 = ECDH-ECDSA-AES256-SHA
-# ssl_options.ciphers.30 = ECDH-RSA-AES256-SHA
-# ssl_options.ciphers.31 = ECDHE-ECDSA-AES128-SHA
-# ssl_options.ciphers.32 = ECDHE-RSA-AES128-SHA
-# ssl_options.ciphers.33 = DHE-RSA-AES128-SHA
-# ssl_options.ciphers.34 = DHE-DSS-AES128-SHA
-# ssl_options.ciphers.35 = ECDH-ECDSA-AES128-SHA
-# ssl_options.ciphers.36 = ECDH-RSA-AES128-SHA
-
-## Select an authentication/authorisation backend to use.
-##
-## Alternative backends are provided by plugins, such as rabbitmq-auth-backend-ldap.
-##
-## NB: These settings require certain plugins to be enabled.
-##
-## Related doc guides:
-##
-## * https://rabbitmq.com/plugins.html
-## * https://rabbitmq.com/access-control.html
-##
-
-# auth_backends.1 = rabbit_auth_backend_internal
-
-## uses separate backends for authentication and authorisation,
-## see below.
-# auth_backends.1.authn = rabbit_auth_backend_ldap
-# auth_backends.1.authz = rabbit_auth_backend_internal
-
-## The rabbitmq_auth_backend_ldap plugin allows the broker to
-## perform authentication and authorisation by deferring to an
-## external LDAP server.
-##
-## Relevant doc guides:
-##
-## * https://rabbitmq.com/ldap.html
-## * https://rabbitmq.com/access-control.html
-##
-## uses LDAP for both authentication and authorisation
-# auth_backends.1 = rabbit_auth_backend_ldap
-
-## uses HTTP service for both authentication and
-## authorisation
-# auth_backends.1 = rabbit_auth_backend_http
-
-## uses two backends in a chain: HTTP first, then internal
-# auth_backends.1 = rabbit_auth_backend_http
-# auth_backends.2 = rabbit_auth_backend_internal
-
-## Authentication
-## The built-in mechanisms are 'PLAIN',
-## 'AMQPLAIN', and 'EXTERNAL' Additional mechanisms can be added via
-## plugins.
-##
-## Related doc guide: https://rabbitmq.com/authentication.html.
-##
-# auth_mechanisms.1 = PLAIN
-# auth_mechanisms.2 = AMQPLAIN
-
-## The rabbitmq-auth-mechanism-ssl plugin makes it possible to
-## authenticate a user based on the client's x509 (TLS) certificate.
-## Related doc guide: https://rabbitmq.com/authentication.html.
-##
-## To use auth-mechanism-ssl, the EXTERNAL mechanism should
-## be enabled:
-##
-# auth_mechanisms.1 = PLAIN
-# auth_mechanisms.2 = AMQPLAIN
-# auth_mechanisms.3 = EXTERNAL
-
-## To force x509 certificate-based authentication on all clients,
-## exclude all other mechanisms (note: this will disable password-based
-## authentication even for the management UI!):
-##
-# auth_mechanisms.1 = EXTERNAL
-
-## This pertains to both the rabbitmq-auth-mechanism-ssl plugin and
-## STOMP ssl_cert_login configurations. See the RabbitMQ STOMP plugin
-## configuration section later in this file and the README in
-## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl for further
-## details.
-##
-## To use the TLS cert's CN instead of its DN as the username
-##
-# ssl_cert_login_from = common_name
-
-## TLS handshake timeout, in milliseconds.
-##
-# ssl_handshake_timeout = 5000
-
-
-## Password hashing implementation. Will only affect newly
-## created users. To recalculate hash for an existing user
-## it's necessary to update her password.
-##
-## To use SHA-512, set to rabbit_password_hashing_sha512.
-##
-# password_hashing_module = rabbit_password_hashing_sha256
-
-## When importing definitions exported from versions earlier
-## than 3.6.0, it is possible to go back to MD5 (only do this
-## as a temporary measure!) by setting this to rabbit_password_hashing_md5.
-##
-# password_hashing_module = rabbit_password_hashing_md5
-
-##
-## Default User / VHost
-## ====================
-##
-
-## On first start RabbitMQ will create a vhost and a user. These
-## config items control what gets created.
-## Relevant doc guide: https://rabbitmq.com/access-control.html
-##
-# default_vhost = /
-# default_user = guest
-# default_pass = guest
-
-# default_permissions.configure = .*
-# default_permissions.read = .*
-# default_permissions.write = .*
-
-## Tags for default user
-##
-## For more details about tags, see the documentation for the
-## Management Plugin at https://rabbitmq.com/management.html.
-##
-# default_user_tags.administrator = true
-
-## Define other tags like this:
-# default_user_tags.management = true
-# default_user_tags.custom_tag = true
-
-##
-## Additional network and protocol related configuration
-## =====================================================
-##
-
-## Set the default AMQP 0-9-1 heartbeat interval (in seconds).
-## Related doc guides:
-##
-## * https://rabbitmq.com/heartbeats.html
-## * https://rabbitmq.com/networking.html
-##
-# heartbeat = 60
-
-## Set the max permissible size of an AMQP frame (in bytes).
-##
-# frame_max = 131072
-
-## Set the max frame size the server will accept before connection
-## tuning occurs
-##
-# initial_frame_max = 4096
-
-## Set the max permissible number of channels per connection.
-## 0 means "no limit".
-##
-# channel_max = 128
-
-## Customising TCP Listener (Socket) Configuration.
-##
-## Related doc guides:
-##
-## * https://rabbitmq.com/networking.html
-## * https://www.erlang.org/doc/man/inet.html#setopts-2
-##
-
-# tcp_listen_options.backlog = 128
-# tcp_listen_options.nodelay = true
-# tcp_listen_options.exit_on_close = false
-#
-# tcp_listen_options.keepalive = true
-# tcp_listen_options.send_timeout = 15000
-#
-# tcp_listen_options.buffer = 196608
-# tcp_listen_options.sndbuf = 196608
-# tcp_listen_options.recbuf = 196608
-
-##
-## Resource Limits & Flow Control
-## ==============================
-##
-## Related doc guide: https://rabbitmq.com/memory.html.
-
-## Memory-based Flow Control threshold.
-##
-# vm_memory_high_watermark.relative = 0.4
-
-## Alternatively, we can set a limit (in bytes) of RAM used by the node.
-##
-# vm_memory_high_watermark.absolute = 1073741824
-
-## Or you can set absolute value using memory units (with RabbitMQ 3.6.0+).
-## Absolute watermark will be ignored if relative is defined!
-##
-# vm_memory_high_watermark.absolute = 2GB
-##
-## Supported unit symbols:
-##
-## k, kiB: kibibytes (2^10 - 1,024 bytes)
-## M, MiB: mebibytes (2^20 - 1,048,576 bytes)
-## G, GiB: gibibytes (2^30 - 1,073,741,824 bytes)
-## kB: kilobytes (10^3 - 1,000 bytes)
-## MB: megabytes (10^6 - 1,000,000 bytes)
-## GB: gigabytes (10^9 - 1,000,000,000 bytes)
-
-
-
-## Fraction of the high watermark limit at which queues start to
-## page message out to disc in order to free up memory.
-## For example, when vm_memory_high_watermark is set to 0.4 and this value is set to 0.5,
-## paging can begin as early as when 20% of total available RAM is used by the node.
-##
-## Values greater than 1.0 can be dangerous and should be used carefully.
-##
-## One alternative to this is to use durable queues and publish messages
-## as persistent (delivery mode = 2). With this combination queues will
-## move messages to disk much more rapidly.
-##
-## Another alternative is to configure queues to page all messages (both
-## persistent and transient) to disk as quickly
-## as possible, see https://rabbitmq.com/lazy-queues.html.
-##
-# vm_memory_high_watermark_paging_ratio = 0.5
-
-## Selects Erlang VM memory consumption calculation strategy. Can be `allocated`, `rss` or `legacy` (aliased as `erlang`),
-## Introduced in 3.6.11. `rss` is the default as of 3.6.12.
-## See https://github.com/rabbitmq/rabbitmq-server/issues/1223 and rabbitmq/rabbitmq-common#224 for background.
-# vm_memory_calculation_strategy = rss
-
-## Interval (in milliseconds) at which we perform the check of the memory
-## levels against the watermarks.
-##
-# memory_monitor_interval = 2500
-
-## The total memory available can be calculated from the OS resources
-## - default option - or provided as a configuration parameter.
-# total_memory_available_override_value = 2GB
-
-## Set disk free limit (in bytes). Once free disk space reaches this
-## lower bound, a disk alarm will be set - see the documentation
-## listed above for more details.
-##
-## Absolute watermark will be ignored if relative is defined!
-# disk_free_limit.absolute = 50000
-
-## Or you can set it using memory units (same as in vm_memory_high_watermark)
-## with RabbitMQ 3.6.0+.
-# disk_free_limit.absolute = 500KB
-# disk_free_limit.absolute = 50mb
-# disk_free_limit.absolute = 5GB
-
-## Alternatively, we can set a limit relative to total available RAM.
-##
-## Values lower than 1.0 can be dangerous and should be used carefully.
-# disk_free_limit.relative = 2.0
-
-##
-## Clustering
-## =====================
-##
-# cluster_partition_handling = ignore
-
-## pause_if_all_down strategy require additional configuration
-# cluster_partition_handling = pause_if_all_down
-
-## Recover strategy. Can be either 'autoheal' or 'ignore'
-# cluster_partition_handling.pause_if_all_down.recover = ignore
-
-## Node names to check
-# cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit@localhost
-# cluster_partition_handling.pause_if_all_down.nodes.2 = hare@localhost
-
-## Mirror sync batch size, in messages. Increasing this will speed
-## up syncing but total batch size in bytes must not exceed 2 GiB.
-## Available in RabbitMQ 3.6.0 or later.
-##
-# mirroring_sync_batch_size = 4096
-
-## Make clustering happen *automatically* at startup. Only applied
-## to nodes that have just been reset or started for the first time.
-##
-## Relevant doc guide: https://rabbitmq.com//cluster-formation.html
-##
-
-# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
-#
-# cluster_formation.classic_config.nodes.1 = rabbit1@hostname
-# cluster_formation.classic_config.nodes.2 = rabbit2@hostname
-# cluster_formation.classic_config.nodes.3 = rabbit3@hostname
-# cluster_formation.classic_config.nodes.4 = rabbit4@hostname
-
-## DNS-based peer discovery. This backend will list A records
-## of the configured hostname and perform reverse lookups for
-## the addresses returned.
-
-# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns
-# cluster_formation.dns.hostname = discovery.eng.example.local
-
-## This node's type can be configured. If you are not sure
-## what node type to use, always use 'disc'.
-# cluster_formation.node_type = disc
-
-## Interval (in milliseconds) at which we send keepalive messages
-## to other cluster members. Note that this is not the same thing
-## as net_ticktime; missed keepalive messages will not cause nodes
-## to be considered down.
-##
-# cluster_keepalive_interval = 10000
-
-##
-## Statistics Collection
-## =====================
-##
-
-## Set (internal) statistics collection granularity.
-##
-## Can be none, coarse or fine
-# collect_statistics = none
-
-# collect_statistics = coarse
-
-## Statistics collection interval (in milliseconds). Increasing
-## this will reduce the load on management database.
-##
-# collect_statistics_interval = 5000
-
-##
-## Misc/Advanced Options
-## =====================
-##
-## NB: Change these only if you understand what you are doing!
-##
-
-## Explicitly enable/disable hipe compilation.
-##
-# hipe_compile = false
-
-## Timeout used when waiting for Mnesia tables in a cluster to
-## become available.
-##
-# mnesia_table_loading_retry_timeout = 30000
-
-## Retries when waiting for Mnesia tables in the cluster startup. Note that
-## this setting is not applied to Mnesia upgrades or node deletions.
-##
-# mnesia_table_loading_retry_limit = 10
-
-## Size in bytes below which to embed messages in the queue index.
-## Related doc guide: https://rabbitmq.com/persistence-conf.html
-##
-# queue_index_embed_msgs_below = 4096
-
-## You can also set this size in memory units
-##
-# queue_index_embed_msgs_below = 4kb
-
-## Whether or not to enable background periodic forced GC runs for all
-## Erlang processes on the node in "waiting" state.
-##
-## Disabling background GC may reduce latency for client operations,
-## keeping it enabled may reduce median RAM usage by the binary heap
-## (see https://www.erlang-solutions.com/blog/erlang-garbage-collector.html).
-##
-## Before trying this option, please take a look at the memory
-## breakdown (https://www.rabbitmq.com/memory-use.html).
-##
-# background_gc_enabled = false
-
-## Target (desired) interval (in milliseconds) at which we run background GC.
-## The actual interval will vary depending on how long it takes to execute
-## the operation (can be higher than this interval). Values less than
-## 30000 milliseconds are not recommended.
-##
-# background_gc_target_interval = 60000
-
-## Whether or not to enable proxy protocol support.
-## Once enabled, clients cannot directly connect to the broker
-## anymore. They must connect through a load balancer that sends the
-## proxy protocol header to the broker at connection time.
-## This setting applies only to AMQP clients, other protocols
-## like MQTT or STOMP have their own setting to enable proxy protocol.
-## See the plugins documentation for more information.
-##
-# proxy_protocol = false
-
-## ----------------------------------------------------------------------------
-## Advanced Erlang Networking/Clustering Options.
-##
-## Related doc guide: https://rabbitmq.com/clustering.html
-## ----------------------------------------------------------------------------
-
-# ======================================
-# Kernel section
-# ======================================
-
-## Timeout used to detect peer unavailability, including CLI tools.
-## Related doc guide: https://www.rabbitmq.com/nettick.html.
-##
-# net_ticktime = 60
-
-## Inter-node communication port range.
-## The parameters inet_dist_listen_min and inet_dist_listen_max
-## can be configured in the classic config format only.
-## Related doc guide: https://www.rabbitmq.com/networking.html#epmd-inet-dist-port-range.
-
-
-## ----------------------------------------------------------------------------
-## RabbitMQ Management Plugin
-##
-## Related doc guide: https://rabbitmq.com/management.html.
-## ----------------------------------------------------------------------------
-
-# =======================================
-# Management section
-# =======================================
-
-## Preload schema definitions from the following JSON file.
-## Related doc guide: https://rabbitmq.com/management.html#load-definitions.
-##
-# management.load_definitions = /path/to/exported/definitions.json
-
-## Log all requests to the management HTTP API to a file.
-##
-# management.http_log_dir = /path/to/access.log
-
-## HTTP listener and embedded Web server settings.
-# ## See https://rabbitmq.com/management.html for details.
-#
-# management.tcp.port = 15672
-# management.tcp.ip = 0.0.0.0
-#
-# management.tcp.shutdown_timeout = 7000
-# management.tcp.max_keepalive = 120
-# management.tcp.idle_timeout = 120
-# management.tcp.inactivity_timeout = 120
-# management.tcp.request_timeout = 120
-# management.tcp.compress = true
-
-## HTTPS listener settings.
-## See https://rabbitmq.com/management.html and https://rabbitmq.com/ssl.html for details.
-##
-# management.ssl.port = 15671
-# management.ssl.cacertfile = /path/to/ca_certificate.pem
-# management.ssl.certfile = /path/to/server_certificate.pem
-# management.ssl.keyfile = /path/to/server_key.pem
-
-## More TLS options
-# management.ssl.honor_cipher_order = true
-# management.ssl.honor_ecc_order = true
-# management.ssl.client_renegotiation = false
-# management.ssl.secure_renegotiate = true
-
-## Supported TLS versions
-# management.ssl.versions.1 = tlsv1.2
-# management.ssl.versions.2 = tlsv1.1
-
-## Cipher suites the server is allowed to use
-# management.ssl.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
-# management.ssl.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
-# management.ssl.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
-# management.ssl.ciphers.4 = ECDHE-RSA-AES256-SHA384
-# management.ssl.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384
-# management.ssl.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384
-# management.ssl.ciphers.7 = ECDH-ECDSA-AES256-SHA384
-# management.ssl.ciphers.8 = ECDH-RSA-AES256-SHA384
-# management.ssl.ciphers.9 = DHE-RSA-AES256-GCM-SHA384
-
-
-
-## One of 'basic', 'detailed' or 'none'. See
-## https://rabbitmq.com/management.html#fine-stats for more details.
-# management.rates_mode = basic
-
-## Configure how long aggregated data (such as message rates and queue
-## lengths) is retained. Please read the plugin's documentation in
-## https://rabbitmq.com/management.html#configuration for more
-## details.
-## Your can use 'minute', 'hour' and 'day' keys or integer key (in seconds)
-# management.sample_retention_policies.global.minute = 5
-# management.sample_retention_policies.global.hour = 60
-# management.sample_retention_policies.global.day = 1200
-
-# management.sample_retention_policies.basic.minute = 5
-# management.sample_retention_policies.basic.hour = 60
-
-# management.sample_retention_policies.detailed.10 = 5
-
-## ----------------------------------------------------------------------------
-## RabbitMQ Shovel Plugin
-##
-## Related doc guide: https://rabbitmq.com/shovel.html
-## ----------------------------------------------------------------------------
-
-## Shovel plugin config example is defined in additional.config file
-
-
-## ----------------------------------------------------------------------------
-## RabbitMQ STOMP Plugin
-##
-## Related doc guide: https://rabbitmq.com/stomp.html
-## ----------------------------------------------------------------------------
-
-# =======================================
-# STOMP section
-# =======================================
-
-## See https://rabbitmq.com/stomp.html for details.
-
-## TCP listeners.
-##
-# stomp.listeners.tcp.1 = 127.0.0.1:61613
-# stomp.listeners.tcp.2 = ::1:61613
-
-## TCP listener settings
-##
-# stomp.tcp_listen_options.backlog = 2048
-# stomp.tcp_listen_options.recbuf = 131072
-# stomp.tcp_listen_options.sndbuf = 131072
-#
-# stomp.tcp_listen_options.keepalive = true
-# stomp.tcp_listen_options.nodelay = true
-#
-# stomp.tcp_listen_options.exit_on_close = true
-# stomp.tcp_listen_options.send_timeout = 120
-
-## Proxy protocol support
-##
-# stomp.proxy_protocol = false
-
-## TLS listeners
-## See https://rabbitmq.com/stomp.html and https://rabbitmq.com/ssl.html for details.
-# stomp.listeners.ssl.default = 61614
-#
-# ssl_options.cacertfile = path/to/cacert.pem
-# ssl_options.certfile = path/to/cert.pem
-# ssl_options.keyfile = path/to/key.pem
-# ssl_options.verify = verify_peer
-# ssl_options.fail_if_no_peer_cert = true
-
-
-## Number of Erlang processes that will accept connections for the TCP
-## and TLS listeners.
-##
-# stomp.num_acceptors.tcp = 10
-# stomp.num_acceptors.ssl = 1
-
-## Additional TLS options
-
-## Extract a name from the client's certificate when using TLS.
-##
-# stomp.ssl_cert_login = true
-
-## Set a default user name and password. This is used as the default login
-## whenever a CONNECT frame omits the login and passcode headers.
-##
-## Please note that setting this will allow clients to connect without
-## authenticating!
-##
-# stomp.default_user = guest
-# stomp.default_pass = guest
-
-## If a default user is configured, or you have configured use TLS client
-## certificate based authentication, you can choose to allow clients to
-## omit the CONNECT frame entirely. If set to true, the client is
-## automatically connected as the default user or user supplied in the
-## TLS certificate whenever the first frame sent on a session is not a
-## CONNECT frame.
-##
-# stomp.implicit_connect = true
-
-## Whether or not to enable proxy protocol support.
-## Once enabled, clients cannot directly connect to the broker
-## anymore. They must connect through a load balancer that sends the
-## proxy protocol header to the broker at connection time.
-## This setting applies only to STOMP clients, other protocols
-## like MQTT or AMQP have their own setting to enable proxy protocol.
-## See the plugins or broker documentation for more information.
-##
-# stomp.proxy_protocol = false
-
-## ----------------------------------------------------------------------------
-## RabbitMQ MQTT Adapter
-##
-## See https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
-## for details
-## ----------------------------------------------------------------------------
-
-# =======================================
-# MQTT section
-# =======================================
-
-## TCP listener settings.
-##
-# mqtt.listeners.tcp.1 = 127.0.0.1:61613
-# mqtt.listeners.tcp.2 = ::1:61613
-
-## TCP listener options (as per the broker configuration).
-##
-# mqtt.tcp_listen_options.backlog = 4096
-# mqtt.tcp_listen_options.recbuf = 131072
-# mqtt.tcp_listen_options.sndbuf = 131072
-#
-# mqtt.tcp_listen_options.keepalive = true
-# mqtt.tcp_listen_options.nodelay = true
-#
-# mqtt.tcp_listen_options.exit_on_close = true
-# mqtt.tcp_listen_options.send_timeout = 120
-
-## TLS listener settings
-## ## See https://rabbitmq.com/mqtt.html and https://rabbitmq.com/ssl.html for details.
-#
-# mqtt.listeners.ssl.default = 8883
-#
-# ssl_options.cacertfile = /path/to/tls/ca_certificate_bundle.pem
-# ssl_options.certfile = /path/to/tls/server_certificate.pem
-# ssl_options.keyfile = /path/to/tls/server_key.pem
-# ssl_options.verify = verify_peer
-# ssl_options.fail_if_no_peer_cert = true
-#
-
-
-## Number of Erlang processes that will accept connections for the TCP
-## and TLS listeners.
-##
-# mqtt.num_acceptors.tcp = 10
-# mqtt.num_acceptors.ssl = 10
-
-## Whether or not to enable proxy protocol support.
-## Once enabled, clients cannot directly connect to the broker
-## anymore. They must connect through a load balancer that sends the
-## proxy protocol header to the broker at connection time.
-## This setting applies only to STOMP clients, other protocols
-## like STOMP or AMQP have their own setting to enable proxy protocol.
-## See the plugins or broker documentation for more information.
-##
-# mqtt.proxy_protocol = false
-
-## Set the default user name and password used for anonymous connections (when client
-## provides no credentials). Anonymous connections are highly discouraged!
-##
-# mqtt.default_user = guest
-# mqtt.default_pass = guest
-
-## Enable anonymous connections. If this is set to false, clients MUST provide
-## credentials in order to connect. See also the mqtt.default_user/mqtt.default_pass
-## keys. Anonymous connections are highly discouraged!
-##
-# mqtt.allow_anonymous = true
-
-## If you have multiple vhosts, specify the one to which the
-## adapter connects.
-##
-# mqtt.vhost = /
-
-## Specify the exchange to which messages from MQTT clients are published.
-##
-# mqtt.exchange = amq.topic
-
-## Specify TTL (time to live) to control the lifetime of non-clean sessions.
-##
-# mqtt.subscription_ttl = 1800000
-
-## Set the prefetch count (governing the maximum number of unacknowledged
-## messages that will be delivered).
-##
-# mqtt.prefetch = 10
-
-
-## ----------------------------------------------------------------------------
-## RabbitMQ AMQP 1.0 Support
-##
-## See https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md.
-## ----------------------------------------------------------------------------
-
-# =======================================
-# AMQP 1.0 section
-# =======================================
-
-
-## Connections that are not authenticated with SASL will connect as this
-## account. See the README for more information.
-##
-## Please note that setting this will allow clients to connect without
-## authenticating!
-##
-# amqp1_0.default_user = guest
-
-## Enable protocol strict mode. See the README for more information.
-##
-# amqp1_0.protocol_strict_mode = false
-
-## Logging settings.
-##
-## See https://rabbitmq.com/logging.html and https://github.com/erlang-lager/lager for details.
-##
-
-## Log directory, taken from the RABBITMQ_LOG_BASE env variable by default.
-##
-# log.dir = /var/log/rabbitmq
-
-## Logging to file. Can be false or a filename.
-## Default:
-# log.file = rabbit.log
-
-## To disable logging to a file
-# log.file = false
-
-## Log level for file logging
-##
-# log.file.level = info
-
-## File rotation config. No rotation by default.
-## DO NOT SET rotation date to ''. Leave the value unset if "" is the desired value
-# log.file.rotation.date = $D0
-# log.file.rotation.size = 0
-
-## Logging to console (can be true or false)
-##
-# log.console = false
-
-## Log level for console logging
-##
-# log.console.level = info
-
-## Logging to the amq.rabbitmq.log exchange (can be true or false)
-##
-# log.exchange = false
-
-## Log level to use when logging to the amq.rabbitmq.log exchange
-##
-# log.exchange.level = info
-
-
-
-## ----------------------------------------------------------------------------
-## RabbitMQ LDAP Plugin
-##
-## Related doc guide: https://rabbitmq.com/ldap.html.
-##
-## ----------------------------------------------------------------------------
-
-# =======================================
-# LDAP section
-# =======================================
-
-##
-## Connecting to the LDAP server(s)
-## ================================
-##
-
-## Specify servers to bind to. You *must* set this in order for the plugin
-## to work properly.
-##
-# auth_ldap.servers.1 = your-server-name-goes-here
-
-## You can define multiple servers
-# auth_ldap.servers.2 = your-other-server
-
-## Connect to the LDAP server using TLS
-##
-# auth_ldap.use_ssl = false
-
-## Specify the LDAP port to connect to
-##
-# auth_ldap.port = 389
-
-## LDAP connection timeout, in milliseconds or 'infinity'
-##
-# auth_ldap.timeout = infinity
-
-## Or number
-# auth_ldap.timeout = 500
-
-## Enable logging of LDAP queries.
-## One of
-## - false (no logging is performed)
-## - true (verbose logging of the logic used by the plugin)
-## - network (as true, but additionally logs LDAP network traffic)
-##
-## Defaults to false.
-##
-# auth_ldap.log = false
-
-## Also can be true or network
-# auth_ldap.log = true
-# auth_ldap.log = network
-
-##
-## Authentication
-## ==============
-##
-
-## Pattern to convert the username given through AMQP to a DN before
-## binding
-##
-# auth_ldap.user_dn_pattern = cn=${username},ou=People,dc=example,dc=com
-
-## Alternatively, you can convert a username to a Distinguished
-## Name via an LDAP lookup after binding. See the documentation for
-## full details.
-
-## When converting a username to a dn via a lookup, set these to
-## the name of the attribute that represents the user name, and the
-## base DN for the lookup query.
-##
-# auth_ldap.dn_lookup_attribute = userPrincipalName
-# auth_ldap.dn_lookup_base = DC=gopivotal,DC=com
-
-## Controls how to bind for authorisation queries and also to
-## retrieve the details of users logging in without presenting a
-## password (e.g., SASL EXTERNAL).
-## One of
-## - as_user (to bind as the authenticated user - requires a password)
-## - anon (to bind anonymously)
-## - {UserDN, Password} (to bind with a specified user name and password)
-##
-## Defaults to 'as_user'.
-##
-# auth_ldap.other_bind = as_user
-
-## Or can be more complex:
-# auth_ldap.other_bind.user_dn = User
-# auth_ldap.other_bind.password = Password
-
-## If user_dn and password defined - other options is ignored.
-
-# -----------------------------
-# Too complex section of LDAP
-# -----------------------------
-
-##
-## Authorisation
-## =============
-##
-
-## The LDAP plugin can perform a variety of queries against your
-## LDAP server to determine questions of authorisation.
-##
-## Related doc guide: https://rabbitmq.com/ldap.html#authorisation.
-
-## Following configuration should be defined in advanced.config file
-## DO NOT UNCOMMENT THESE LINES!
-
-## Set the query to use when determining vhost access
-##
-## {vhost_access_query, {in_group,
-## "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}},
-
-## Set the query to use when determining resource (e.g., queue) access
-##
-## {resource_access_query, {constant, true}},
-
-## Set queries to determine which tags a user has
-##
-## {tag_queries, []}
-# ]},
-# -----------------------------
-
diff --git a/hpc-rabbitmq/scripts/local.env b/hpc-rabbitmq/scripts/local.env
deleted file mode 100644
index fd1dd3a8d..000000000
--- a/hpc-rabbitmq/scripts/local.env
+++ /dev/null
@@ -1,5 +0,0 @@
-## HCP RabbitMQ Conf
-HPC_RABBITMQ_USER=user
-HPC_RABBITMQ_PASSWORD=user
-HPC_RABBITMQ_HOST=hpc-rabbitmq
-RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq
diff --git a/hpc-rabbitmq/scripts/production.env b/hpc-rabbitmq/scripts/production.env
deleted file mode 100644
index d2a457b76..000000000
--- a/hpc-rabbitmq/scripts/production.env
+++ /dev/null
@@ -1,5 +0,0 @@
-## HPC RabbitMQ Config (Staging)
-HPC_RABBITMQ_USER=hpc_user
-HPC_RABBITMQ_PASSWORD=HH7YdkZXdcoNobm9
-HPC_RABBITMQ_HOST=hpc-rabbitmq
-RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq
diff --git a/hpc-rabbitmq/scripts/setup.sh b/hpc-rabbitmq/scripts/setup.sh
deleted file mode 100644
index 5a7dbd930..000000000
--- a/hpc-rabbitmq/scripts/setup.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-( rabbitmqctl wait $RABBITMQ_PID_FILE && \
- rabbitmqctl add_user $HPC_RABBITMQ_USER $HPC_RABBITMQ_PASSWORD && \
- rabbitmqctl set_permissions $HPC_RABBITMQ_USER ".*" ".*" ".*" ) &
-rabbitmq-server $@
diff --git a/hpc-rabbitmq/scripts/staging.env b/hpc-rabbitmq/scripts/staging.env
deleted file mode 100644
index d2a457b76..000000000
--- a/hpc-rabbitmq/scripts/staging.env
+++ /dev/null
@@ -1,5 +0,0 @@
-## HPC RabbitMQ Config (Staging)
-HPC_RABBITMQ_USER=hpc_user
-HPC_RABBITMQ_PASSWORD=HH7YdkZXdcoNobm9
-HPC_RABBITMQ_HOST=hpc-rabbitmq
-RABBITMQ_PID_FILE=/var/lib/rabbitmq/mnesia/rabbitmq
diff --git a/iipsrv/Dockerfile b/iipsrv/Dockerfile
index c277c0fc4..4c6b41bbf 100644
--- a/iipsrv/Dockerfile
+++ b/iipsrv/Dockerfile
@@ -1,26 +1,32 @@
-FROM alpine:3
+FROM alpine AS builder
-RUN apk update
-RUN apk upgrade
RUN apk add --no-cache \
autoconf \
automake \
build-base \
libtool \
libpng-dev \
- m4 \
- make \
openjpeg-dev \
- pkgconfig \
tiff-dev
-RUN wget https://github.com/ruven/iipsrv/archive/refs/heads/master.zip
-RUN unzip master.zip
-WORKDIR iipsrv-master
+RUN wget https://github.com/ruven/iipsrv/archive/refs/heads/master.zip && unzip master.zip
+WORKDIR /iipsrv-master
RUN ./autogen.sh
RUN ./configure --enable-openjpeg
RUN make
+FROM alpine
+
+RUN apk add --no-cache \
+ libgcc \
+ libstdc++ \
+ libgomp \
+ libpng \
+ openjpeg \
+ tiff
+
+COPY --from=builder /iipsrv-master/src/iipsrv.fcgi /fcgi-bin/iipsrv.fcgi
+
ENV JPEG_QUALITY 90
ENV FILESYSTEM_PREFIX /rodan/data/
ENV VERBOSITY 2
@@ -28,5 +34,4 @@ ENV PORT 9003
EXPOSE ${PORT}
-
-ENTRYPOINT ./src/iipsrv.fcgi --bind 0.0.0.0:${PORT}
+ENTRYPOINT /fcgi-bin/iipsrv.fcgi --bind 0.0.0.0:${PORT}
diff --git a/nginx/Dockerfile b/nginx/Dockerfile
index 0a6123dab..678290475 100644
--- a/nginx/Dockerfile
+++ b/nginx/Dockerfile
@@ -1,13 +1,4 @@
ARG VERSION
-FROM ddmal/rodan-client:${VERSION} as webapp
-
-# Add local configuration and build.
-RUN rm -rf /code/configuration.json
-COPY ./config/configuration.json /code/
-RUN /code/node_modules/.bin/gulp dist
-
-
-###########################################################
FROM ddmal/rodan-main:${VERSION} as rodan-static
RUN touch /code/Rodan/database.log /code/Rodan/rodan.log
@@ -35,10 +26,8 @@ RUN apt-get -qq update \
# Add configuration files.
COPY ./config/nginx.conf /etc/nginx/nginx.conf
COPY ./config/ssl.conf /etc/nginx/conf.d/ssl.conf
-COPY ./config/ssl-http.conf /etc/nginx/conf.d/ssl-http.conf
COPY ./config/error.conf /etc/nginx/conf.d/error.conf
COPY ./config/rodan.conf /etc/nginx/sites-available/rodan.conf
-COPY ./config/rodan.stream /etc/nginx/sites-available/rodan.stream
RUN mkdir -p /rodan/data
RUN chown -R www-data /rodan
@@ -47,32 +36,15 @@ RUN chown -R www-data /rodan
RUN rm /usr/share/nginx/html/*
COPY ./html/ /var/www/default/
-# Add Rodan Client
-COPY --from=webapp /code/dist/* /var/www/default/dist/
-RUN set -e \
- && mkdir /var/www/default/dist/resources \
- && mv /var/www/default/dist/favicon.ico /var/www/default/dist/resources/ \
- && mv /var/www/default/dist/grids-responsive-min.css /var/www/default/dist/resources/
# Add Rodan Static files
COPY --from=rodan-static /code/Rodan/staticfiles /rodan/static
-# Create and add SSL certificates.
-#RUN mkdir /etc/nginx/keys
-#COPY ./certs/local_cert.pem /etc/nginx/keys/cert.pem
-#COPY ./certs/local_key.pem /etc/nginx/keys/key.pem
-#COPY ./certs/local_dhparam.pem /etc/nginx/keys/dhparam.pem
-
-RUN mkdir -p /etc/letsencrypt
-RUN mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
-
-# This script corrects permissions in the file system
COPY ./scripts/setup /run/
RUN chmod +x /run/setup
-# This script starts nginx for development
+COPY ../scripts/wait-for-app /run/
+RUN chmod +x /run/wait-for-app
+
+# This script starts nginx
COPY ./scripts/start /run/
RUN chmod +x /run/start
-
-# This script starts nginx for production
-COPY ./scripts/start-production /run/
-RUN chmod +x /run/start-production
diff --git a/nginx/Dockerfile.arm b/nginx/Dockerfile.arm
deleted file mode 100644
index 962ea88e3..000000000
--- a/nginx/Dockerfile.arm
+++ /dev/null
@@ -1,78 +0,0 @@
-ARG VERSION
-FROM ddmal/rodan-client:${VERSION} as webapp
-
-# Add local configuration and build.
-RUN rm -rf /code/configuration.json
-COPY ./config/configuration.json /code/
-RUN /code/node_modules/.bin/gulp dist
-
-
-###########################################################
-FROM ddmal/rodan-main:${VERSION} as rodan-static
-
-RUN touch /code/Rodan/database.log /code/Rodan/rodan.log
-
-RUN export DJANGO_SECRET_KEY=localdev \
- && export DJANGO_ACCESS_LOG=None \
- && export DJANGO_DEBUG_LOG=None \
- && export DJANGO_ALLOWED_HOSTS=* \
- && export CELERY_JOB_QUEUE=None \
- # Check to see if the static folder exists
- && mkdir /code/Rodan/rodan/static \
- # If it does, erase everything.
- || rm -rf /code/Rodan/rodan/static/* \
- && python3 /code/Rodan/manage.py collectstatic --noinput
-
-
-###########################################################
-FROM nginx:1.19
-
-# Install OS dependencies
-RUN apt-get -qq update \
- && apt-get -qq install openssl certbot unzip -y \
- && rm -rf /var/lib/apt/lists/*
-
-# Add configuration files.
-COPY ./config/nginx.conf /etc/nginx/nginx.conf
-COPY ./config/ssl.conf /etc/nginx/conf.d/ssl.conf
-COPY ./config/ssl-http.conf /etc/nginx/conf.d/ssl-http.conf
-COPY ./config/error.conf /etc/nginx/conf.d/error.conf
-COPY ./config/rodan.conf /etc/nginx/sites-available/rodan.conf
-COPY ./config/rodan_m1.stream /etc/nginx/sites-available/rodan.stream
-
-RUN mkdir -p /rodan/data
-RUN chown -R www-data /rodan
-
-# Add 40x and 50x pages.
-RUN rm /usr/share/nginx/html/*
-COPY ./html/ /var/www/default/
-
-# Add Rodan Client
-COPY --from=webapp /code/dist/* /var/www/default/dist/
-RUN set -e \
- && mkdir /var/www/default/dist/resources \
- && mv /var/www/default/dist/favicon.ico /var/www/default/dist/resources/ \
- && mv /var/www/default/dist/grids-responsive-min.css /var/www/default/dist/resources/
-# Add Rodan Static files
-COPY --from=rodan-static /code/Rodan/staticfiles /rodan/static
-
-# Create and add SSL certificates.
-#RUN mkdir /etc/nginx/keys
-#COPY ./certs/local_cert.pem /etc/nginx/keys/cert.pem
-#COPY ./certs/local_key.pem /etc/nginx/keys/key.pem
-#COPY ./certs/local_dhparam.pem /etc/nginx/keys/dhparam.pem
-
-RUN mkdir -p /etc/letsencrypt
-RUN mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
-
-# This script corrects permissions in the file system
-COPY ./scripts/setup /run/
-RUN chmod +x /run/setup
-
-# This script starts nginx for development
-COPY ./scripts/start /run/
-RUN chmod +x /run/start
-
-# This script starts nginx for production
-COPY ./scripts/start-production /run/
-RUN chmod +x /run/start-production
diff --git a/nginx/Dockerfile.production b/nginx/Dockerfile.production
deleted file mode 100644
index 75edf5fde..000000000
--- a/nginx/Dockerfile.production
+++ /dev/null
@@ -1,7 +0,0 @@
-FROM ddmal/nginx:nightly
-ARG SERVER_HOST
-
-# [TODO] Run basic config test. It will check to make sure hosts upstream are online.
-# But health checks will reboot the current instance, and not others. Do not only rely on this.
-# HEALTHCHECK --interval=5m --timeout=3s \
-# CMD service nginx configtest || exit 1
diff --git a/nginx/certs/local_cert.pem b/nginx/certs/local_cert.pem
deleted file mode 100644
index 3101b9005..000000000
--- a/nginx/certs/local_cert.pem
+++ /dev/null
@@ -1,33 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFtjCCA56gAwIBAgIJANcherjxf2hXMA0GCSqGSIb3DQEBCwUAMHAxCzAJBgNV
-BAYTAkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRkwFwYD
-VQQKDBBNY0dpbGxVbml2ZXJzaXR5MQ4wDAYDVQQLDAVERE1BTDESMBAGA1UEAwwJ
-bG9jYWxob3N0MB4XDTE4MDgyNzE2MDA1N1oXDTI4MDgyNDE2MDA1N1owcDELMAkG
-A1UEBhMCQ0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxGTAX
-BgNVBAoMEE1jR2lsbFVuaXZlcnNpdHkxDjAMBgNVBAsMBURETUFMMRIwEAYDVQQD
-DAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO2rtS
-DQBMp6ay/1xcKOl7mj5MvdYkxOI0FJSBoqk+8KMUF7f9+eXTMeDMRpA6VCluj2SW
-5271rk35m7CIAMa3KdZ+7K4VLVSL8IfP0787ti1Npdg2OxHTMQwlqiXi6qCEEhYz
-OxYgVpyobVnVsenHut1ijN1ZFs4yXWCuX+s23Ku08Gnh+iYU6zBVWg+F60SP21Iw
-oBsNn1HpJGoI5GLwb1ptxVhykudA/G8Zj5/LlEGlZDeMQlwuroBHzQkDap35FYNz
-Koje57SOJxxbP4jwWFvVyNPhiBww9rDmSMreXiCtGjS43Gd3x5Tvvuk5HKThPSlv
-ikWHWfcGkzUDTpOsxjNAKzYDOsUJHCvbMtkQpub7LXD8jGSIKUta2oVcc1UaWzPd
-SiPw0+GNe6+6sdCeiMgOxbNZxwISjTFrVzXjKhyOwaq19beV9toVxavcgzWwAr+m
-guOzikPEzaPKdtbyXFvEo1ucO6eKF/Nx7/Xgr59TM5Ygqw+UGuaMwseCcvS2Fgxs
-HGNGlXfk/+atmEd03+f+RDlccVs5gmHD7LT5WM0p/eyHqqIkW45HDYQCttzH5Nqz
-Q/aMOCPC4+03+8TvFKjOrFGZwiRIevN3c8njP3gNLqxY3t0Uk0kearTzaLAwdgOn
-cZf++ZufVtqgQdnS2939Ln6jAJd26nnyHbAqkQIDAQABo1MwUTAdBgNVHQ4EFgQU
-dRW0ichLzNOLAWfRMzwpvrGWziUwHwYDVR0jBBgwFoAUdRW0ichLzNOLAWfRMzwp
-vrGWziUwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAb3m+PKK5
-wq1aisyAQP/rc667j8qZOcrqb6KBxsNEBwPucOet+bW1UFW7wvJYzIcY9Yr4Mz0o
-uj+llg3XjTA75hxTIkc/Ajua7jnYbTV3IHDAKdbjkPYPaQpjlM21ElwUN0dcj6z7
-ykcnZZ2n2tckS50j3wVTiEEm8JSDTYgxdbVQn//kaK4LiTpy2bvoa+y6QvcQebfP
-avEMIkW8aosPeH1N9CgckJ9e5RW8FO6kc+Av47ZGW4Ph+vlna/eJo04rcc142sOx
-UujJ4eiGlfb0plGzmmb7XTEtodmFjGh0GeNg7Q0aluirFoTDUJCat+ctIufvUPgm
-7jbSclq0IqfAHp5up11tOWpaqDUdrM9fQRjomHLpZUCWjcrwvh2eI6PdKIDrfGwg
-kvmJk/59Yy7ckyy/12/cKaPJty9W7ZIFsPizYzmQ/XrwEfmNWPjYUTjhjq24va+A
-0bHvHtfJv79KzaS6xzUeegogfh5JI5cQT359Uagd9NGoKezYrDA00YsddEWD1hNF
-erN+t8zlk3EfpH2ExgB7ZfTWp/E8X5HiiLpEs9/+pF18bM4YtmRe23RuUmrUKgoe
-YCnnHaP6fwws5Wn9gBCsVaUOh8u4vjz/O/51LIqIeFvXk7z5i5QpQIBdJpkXw6sB
-hLq5J39nu77U8OOOW/91+Xi9ipm2qS98giY=
------END CERTIFICATE-----
diff --git a/nginx/certs/local_dhparam.pem b/nginx/certs/local_dhparam.pem
deleted file mode 100644
index 213f62939..000000000
--- a/nginx/certs/local_dhparam.pem
+++ /dev/null
@@ -1,8 +0,0 @@
------BEGIN DH PARAMETERS-----
-MIIBCAKCAQEA8k4EAa+Ly8/NLclE9EzhUC/yy+wvJlt15p88K7IDrFM1nuOMCzDo
-ugCBAL0MczxOIXyDij3XdO9CCFpYDkwp5KvAaiFGQ9aOgAHVuVizWKQYZitBWDJj
-PdW98Ze5Ax4CyzaW4t+A5d3uZ2WeJyyEUDd73Lmy248ftFEsXGqrRVrXgFQbXZu9
-HGFCgoizP9wPaANXBZX1ScNrvjEAApaW9hvRV8iqxJrkiejW/+DB83CavkOL1Lt8
-wxN5wU5MZy9YPr64eltYwjjmwkTYBx1RGlW17gLwmIFZXp7GQV/hGDvgaiD5Hzxz
-s6Avj2rNMLV+vmGUUTnKd71FgnyZwJBdawIBAg==
------END DH PARAMETERS-----
diff --git a/nginx/certs/local_key.pem b/nginx/certs/local_key.pem
deleted file mode 100644
index e61a0acc0..000000000
--- a/nginx/certs/local_key.pem
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDO2rtSDQBMp6ay
-/1xcKOl7mj5MvdYkxOI0FJSBoqk+8KMUF7f9+eXTMeDMRpA6VCluj2SW5271rk35
-m7CIAMa3KdZ+7K4VLVSL8IfP0787ti1Npdg2OxHTMQwlqiXi6qCEEhYzOxYgVpyo
-bVnVsenHut1ijN1ZFs4yXWCuX+s23Ku08Gnh+iYU6zBVWg+F60SP21IwoBsNn1Hp
-JGoI5GLwb1ptxVhykudA/G8Zj5/LlEGlZDeMQlwuroBHzQkDap35FYNzKoje57SO
-JxxbP4jwWFvVyNPhiBww9rDmSMreXiCtGjS43Gd3x5Tvvuk5HKThPSlvikWHWfcG
-kzUDTpOsxjNAKzYDOsUJHCvbMtkQpub7LXD8jGSIKUta2oVcc1UaWzPdSiPw0+GN
-e6+6sdCeiMgOxbNZxwISjTFrVzXjKhyOwaq19beV9toVxavcgzWwAr+mguOzikPE
-zaPKdtbyXFvEo1ucO6eKF/Nx7/Xgr59TM5Ygqw+UGuaMwseCcvS2FgxsHGNGlXfk
-/+atmEd03+f+RDlccVs5gmHD7LT5WM0p/eyHqqIkW45HDYQCttzH5NqzQ/aMOCPC
-4+03+8TvFKjOrFGZwiRIevN3c8njP3gNLqxY3t0Uk0kearTzaLAwdgOncZf++Zuf
-VtqgQdnS2939Ln6jAJd26nnyHbAqkQIDAQABAoICAQCk8FKHNWi0tsW8WtQphFHQ
-RghBJun2/aqk/nf/+lTbpANVBSin8jhos4/dMrLUX8F9sAb0MOwQKIFyc8tKVtwc
-ttaa9FxG9JNC1nNkqyIEGdp73K7PZ0BqVuSpr8dv7cg6JzXeedHFzWoy/qawN6IC
-qaTXbR0eaYnXLQ/nWwJyB3k+2KiFEPKGoZYzqJFSJmvQDYC21yNbNFua/Hc0Se/+
-abwAZWiGS07sSZzJE/XF3ZyOpZ+JTmy0qF4PYpU6TSxTrezXyuXCX51f8B2zQLEP
-fFUV3YHdhqt7+2jI5ugkcYe6n3fEo7I5F0JR/Ld427c5BozgrK+OIpVPf9e4oFIs
-9R9/0zGJ4j/96S3M48lzbyf3452B2+N1hQONmyDuADFuv6VlTOS7MRQxTKVD8O0R
-V++rBDfEuYubJ3aMX2RpruI4H+Fob4Y+bNTdxE9SQrMWFTxAK3LTsKryu6ZPutFY
-v+2vrfzBfH+mIld33RaH6Qoo1zEXQIMXQxS/RjtAuQqvlyt0Q1PDcUCiroeQ0n/z
-xK1ZqxrTzGxpi0ZPOdWhu1/C/yTqoYTZY+8cQh6XAGiLuF43obKt4J57GVtR5cvf
-LFdkHKth+/i4AM4AVr3xWkjz9kvBSCs5tsrR2mfme2YBEil2LJJUJoDgGxRg/Jz5
-I7uKjGStQ4Qu7KH+xxIA8QKCAQEA9xhNbeSgGAujcknLaTqS+bU+a14wAkCoTPQD
-r9vzAmBoh9YJSdrm2+ld/sAbsxb2fmMWqeeHJN8QfuEM3bNUAOHrqHrZC844gNrL
-Pk23YvSgGmGvtFIFP+UeM+mrip1LcMGTv1KcxJoHZ/GILJQU2Fyk4+v92MuBxkwi
-HXNNpiAtorcidRCdB6KOkwmzcXObvoEK1czdQRs8FukSM6oP2lixJlGsFx0jWn9x
-cd/H7dzuhqK8dFYlY8aOIfXQKG5AXYhX66SKo2VZfrP/xFYlElr/8eILIEvBuSYh
-AIEJwNwDY/j5VnhrzrjMKI+WoOblaOlBkN93aH+onoSm/+DxDQKCAQEA1k8rnKkJ
-kNnvQdeldvG2NhxWwEYLLzIv21ssW2XgIBzWEmyLacg/UrbT8Fc5a8dgdph4nv5m
-Ibnf/SZXrOFrpJA4YYpkdfO9umiQl2vAU6vCr2+KCzUNagwtKhxvK6F+0l769fP7
-/tL8TUmY49hI/Ue8s8w4W9RKV+AmcuW98UGUIpC6eb0j6bTPOHz7b1Jxfe0rFwuU
-AeaYeG3/X8Bvz58xd1j4FeQEklJQuaIUFEhRP6PkGQjXuPGBg47HfXFqbdPFGZLD
-fpz5h7BvRTbFaSXHwDBiJ0iIL5rE1jWS8HY/cL50/qxUlxoSQ4R8fM9pdxtdK7oY
-nC0sK29cgI/WlQKCAQAlqWGb3137bEK0V8UWO+RNBTAHY2rD3SEJ4aNyOX8XnKQy
-GBCAXkoTuMUn4BYYvOZDK004Bl8V4p38CMdSP1QNcmHd4yOT5hG8qhySWXwbLBf/
-DWafgGTmcUCiPvpzfTgTbp3bancUjDmWwTy1NrjapXxIdR7S3WnhVJdaj8mFCaCL
-DYjF+QtGL6O1i6P7JdjWN4r0PW53zvPgthOdJk2WRTBzG720JC/QSl57MdWiTqtY
-gBNjVAIM7CWbzYC1uOA8oVxtQT4UW41Bf6P7Q/oQiyg5sO9rM8DKPKKJFiHrcF1f
-7oHqiR49evM7N2+JBMhwriTdNQJZPiPwTV264Ik9AoIBAQDI/YdRbddi2oHhpnWw
-kBDrvrg9q3Nh2Be6ClAXh/wjIehDbzlxBDUfRgiPJ77aripyD51QwBbZGpJPwV4I
-7YEe3YODN1/wn6AY62hwGsZNspDsKBe3WxIxmyngjLpWmSdv9VQ4x5JW81lcwuF5
-Dqelo1n+5lEVDoyKzdZBe+YgFfjwUfwRoKnFzaVqvQyy4wc9quj2vA0bm0Dz8XXI
-P5qdhhfGbtJ89VS0Ri8fajqaqxhIL1UFhZ2L/jQRRh8iLvQ5/Jql2Vcvr9j2wSoa
-J7wNWTl1rergHM5clzJ0E9qzWrM08eqXztemvvTSDbcS9xNaeXdwQyBBmLwMIG0I
-xd3hAoIBAGwm037UTBHY98G5XyLAcMh4UHRAzTC9u4mShnK2CZDQj0u1OMIx6u6C
-VijQImAxqRealRCoY7M7VoKtwb4EPQgBq/WzqAzMILqgpFN/a6I6UxW47XLLU7bl
-9TIDRftPTcZw8keecdVaHGP/ct6FATh+4cLCqBYXen7KSwprjvbE9RJRXi+ZOUnz
-VAXqREQOGgy0iBWp4FeHY7M8RGPL3rrp5sgLCX5FFAgMVauS4oWnlYMuSvkOuk9W
-eYSPm6qoP77Km48KgG8y64pEmB/mOQZw7JgB2vwbruK43KR11oxiFKwmUEaJPRrG
-TXmq4KesHBzKPnL6PBiA+VaMFkjFWL0=
------END PRIVATE KEY-----
diff --git a/nginx/config/configuration.json b/nginx/config/configuration.json
deleted file mode 100644
index 5d3e68e7a..000000000
--- a/nginx/config/configuration.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "SERVER_HOST": "localhost",
- "SERVER_PORT": "80/api",
- "SERVER_HTTPS": false,
- "SERVER_SOCKET_AVAILABLE": false,
- "SERVER_AUTHENTICATION_TYPE": "token",
- "ADMIN_CLIENT":
- {
- "NAME": "",
- "EMAIL": ""
- },
- "DEBUG": false,
- "WORKFLOWBUILDERGUI":
- {
- "USER_AGENT": "rodan-standard",
- "GRID":
- {
- "DIMENSION": 20,
- "LINE_COLOR": "#606060",
- "LINE_WIDTH": 0.5
- },
- "ZOOM_MAX": 3.0,
- "ZOOM_MIN": 1.0,
- "ZOOM_RATE": 0.05,
- "ZOOM_INITIAL": 1.7,
- "WORKFLOWJOB_WIDTH": 20,
- "WORKFLOWJOB_HEIGHT": 22,
- "PORT_WIDTH": 8,
- "PORT_HEIGHT": 8,
- "OUTPUTPORT_COLOR": "#00ff00",
- "INPUTPORT_COLOR_SATISFIED": "#00ff00",
- "INPUTPORT_COLOR_UNSATISFIED": "#ff0000",
- "INPUTPORT_COLOR_CANDIDATE": "#00ff00",
- "STROKE_COLOR": "#000000",
- "FILL_COLOR": "#ccccff",
- "WORKFLOWJOBGROUP_FILL_COLOR": "#8888ff",
- "STROKE_WIDTH": 1,
- "FONT_SIZE": 10,
- "STROKE_COLOR_SELECTED": "#0000ff",
- "STROKE_WIDTH_SELECTED": 2,
- "CONNECTION_CIRCLE_RADIUS": 4,
- "HOVER_TIME": 1000
- }
-}
diff --git a/nginx/config/nginx.conf b/nginx/config/nginx.conf
index 44c57d182..870049230 100644
--- a/nginx/config/nginx.conf
+++ b/nginx/config/nginx.conf
@@ -1,4 +1,5 @@
# Run as a unique, less privileged user for security reasons.
+# Is this still necessary with docker?
user www-data www-data;
# Sets the worker threads to the number of CPU cores available in the system for best performance.
@@ -12,25 +13,15 @@ events {
worker_connections 1024;
}
+# Run nginx undaemonized.
+daemon off;
+
# Log errors and warnings to this file
-#no_tls error_log /var/log/nginx/error.log warn;
-#tls error_log /dev/stderr warn;
+error_log /var/log/nginx/error.log warn;
# The file storing the process ID of the nginx process
pid /var/run/nginx.pid;
-
-
-stream {
- log_format basic '$proxy_protocol_addr [$time_local] '
- '$protocol ($status) $bytes_sent $bytes_received '
- '$ssl_preread_server_name $upstream_addr'
- '$session_time';
- #tls include /etc/nginx/conf.d/ssl.conf;
- #tls ssl_session_cache shared:SSLSTREAM:10m;
- include /etc/nginx/sites-available/rodan.stream;
-}
-
http {
# Hide nginx version information.
# [TODO] Build nginx from source. This will let us do two things:
@@ -100,9 +91,5 @@ http {
# Sites and configurations.
include /etc/nginx/mime.types;
- # TLS is not needed when it is behind another NGINX router that automatically uses TLS for visitors.
- #tls include /etc/nginx/conf.d/ssl.conf;
- #tls ssl_session_cache shared:SSL:10m;
- #tls include /etc/nginx/conf.d/ssl-http.conf;
include /etc/nginx/sites-available/rodan.conf;
}
diff --git a/nginx/config/rodan.conf b/nginx/config/rodan.conf
index de38e4707..5e48eef6f 100644
--- a/nginx/config/rodan.conf
+++ b/nginx/config/rodan.conf
@@ -1,26 +1,7 @@
-upstream iip {
- server iipsrv:9003;
-}
-
-#tls server { # Redirect all http to SSL
-#tls listen 80;
-#tls listen [::]:80; # IPv6
-#tls include /etc/nginx/conf.d/error.conf;
-#tls location /.well-known/acme-challenge {
-#tls root /var/www/letsencrypt;
-#tls }
-#tls location / {
-#tls return 301 https://$host$request_uri;
-#tls }
-#tls }
-
server { # Rodan API
- #tls listen 443 ssl proxy_protocol;
- #tls listen [::]:443 ssl; # IPv6
- #no_tls listen 80;
- #no_tls listen [::]:80; # IPv6
- #tls access_log /dev/stdout main;
- #no_tls access_log /var/log/nginx/rodan.access.log main;
+ listen 80;
+ listen [::]:80; # IPv6
+ access_log /var/log/nginx/rodan.log main;
include /etc/nginx/conf.d/error.conf;
location /static/ { # Static files for API
@@ -31,7 +12,7 @@ server { # Rodan API
}
location /fcgi-bin/iipsrv.fcgi { # iipsrv
- fastcgi_pass iip;
+ fastcgi_pass iipsrv:9003;
limit_except GET {
deny all;
}
@@ -74,30 +55,16 @@ server { # Rodan API
deny all;
}
proxy_set_header Host $http_host;
- proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Scheme https;
proxy_set_header 'Access-Control-Allow-Origin' '*';
proxy_set_header 'Access-Control-Allow-Headers' 'Content-Type';
proxy_pass_request_headers on;
proxy_pass http://rodan-main:8000;
}
- #no_tls location /flower {
- #no_tls rewrite ^/flower/(.*)$ /$1 break;
- #no_tls proxy_pass http://rodan-main:5555;
- #no_tls proxy_set_header Host $host;
- #no_tls proxy_redirect off;
- #no_tls proxy_http_version 1.1;
- #no_tls proxy_set_header Upgrade $http_upgrade;
- #no_tls proxy_set_header Connection "upgrade";
- #no_tls }
-
location / {
proxy_pass_request_headers on;
include /etc/nginx/conf.d/error.conf;
- root /var/www/default/dist;
- }
-
- location /.well-known/acme-challenge {
- root /var/www/letsencrypt;
+ proxy_pass http://rodan-client;
}
}
diff --git a/nginx/config/rodan.stream b/nginx/config/rodan.stream
deleted file mode 100644
index 177e26189..000000000
--- a/nginx/config/rodan.stream
+++ /dev/null
@@ -1,8 +0,0 @@
-server {
- #tls listen 5671 ssl;
- #tls listen [::]:5671 ssl;
- #no_tls listen 5671;
- #no_tls listen [::]:5671;
-
- proxy_pass hpc-rabbitmq:5672;
-}
diff --git a/nginx/config/rodan_m1.stream b/nginx/config/rodan_m1.stream
deleted file mode 100644
index 7a34083df..000000000
--- a/nginx/config/rodan_m1.stream
+++ /dev/null
@@ -1,8 +0,0 @@
-server {
- #tls listen 5671 ssl;
- #tls listen [::]:5671 ssl;
- #no_tls listen 5671;
- #no_tls listen [::]:5671;
-
- proxy_pass rabbitmq:5672;
-}
diff --git a/nginx/config/ssl-http.conf b/nginx/config/ssl-http.conf
deleted file mode 100644
index c1ed5d324..000000000
--- a/nginx/config/ssl-http.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-# Additional ssl configuration for http/s
-ssl_stapling on;
-ssl_stapling_verify on;
-resolver 1.1.1.1 8.8.8.8 valid=300s;
-resolver_timeout 5s;
-
-add_header Strict-Transport-Security "max-age=63072000; includeSubDomains;";
-add_header X-Frame-Options DENY;
-add_header X-Content-Type-Options nosniff;
-add_header X-XSS-Protection "1; mode=block";
diff --git a/nginx/config/ssl.conf b/nginx/config/ssl.conf
index e38186543..c1ed5d324 100644
--- a/nginx/config/ssl.conf
+++ b/nginx/config/ssl.conf
@@ -1,10 +1,10 @@
-# SSL Configuration (2019-07)
-ssl_prefer_server_ciphers on;
-ssl_protocols TLSv1.2 TLSv1.3;
-ssl_certificate /etc/letsencrypt/live/SERVER_HOST/fullchain.pem;
-ssl_certificate_key /etc/letsencrypt/live/SERVER_HOST/privkey.pem;
-ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
-ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
-ssl_ecdh_curve secp384r1;
-ssl_session_timeout 10m;
-ssl_session_tickets off;
+# Additional ssl configuration for http/s
+ssl_stapling on;
+ssl_stapling_verify on;
+resolver 1.1.1.1 8.8.8.8 valid=300s;
+resolver_timeout 5s;
+
+add_header Strict-Transport-Security "max-age=63072000; includeSubDomains;";
+add_header X-Frame-Options DENY;
+add_header X-Content-Type-Options nosniff;
+add_header X-XSS-Protection "1; mode=block";
diff --git a/nginx/scripts/setup b/nginx/scripts/setup
index 3f41a7753..6713d140d 100644
--- a/nginx/scripts/setup
+++ b/nginx/scripts/setup
@@ -3,10 +3,6 @@ set -o errexit # Exit immediately if a command exits with a non-zero status.
set -o nounset # Treat unset variables as an error when substituting.
set -o xtrace # Print commands and their arguments as they are executed.
-#chmod 700 /etc/nginx/keys
-#chmod -R 600 /etc/nginx/keys/*
-#chown -R root /etc/nginx/keys
-
chown -R www-data:www-data /var/www/default
find /var/www/default -type d | xargs chmod 755
find /var/www/default -type f | xargs chmod 644
diff --git a/nginx/scripts/ssl b/nginx/scripts/ssl
deleted file mode 100644
index d3662cf5a..000000000
--- a/nginx/scripts/ssl
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-set -o errexit # Exit immediately if a command exits with a non-zero status.
-set -o nounset # Treat unset variables as an error when substituting.
-set -o xtrace # Print commands and their arguments as they are executed.
-
-echo "Creating local ssl certificates."
-
-# 2048 is ok for Local. Production should be 4096
-openssl dhparam -out ./nginx/certs/dhparam.pem 2048
-
-openssl req -x509 \
- -newkey rsa:4096 \
- -out ./nginx/certs/cert.pem \
- -keyout ./nginx/certs/key.pem \
- -days 3650 \
- -nodes \
- -subj '/C=CA/ST=Quebec/L=Montreal/O=McGillUniversity/OU=DDMAL/CN=localhost'
-
-echo "Done."
diff --git a/nginx/scripts/start b/nginx/scripts/start
index 66119c95c..f5d637239 100644
--- a/nginx/scripts/start
+++ b/nginx/scripts/start
@@ -4,9 +4,13 @@ set -o nounset # Treat unset variables as an error when substituting.
set -o xtrace # Print commands and their arguments as they are executed.
/run/setup
-sed -i "s/#no_tls //g" /etc/nginx/nginx.conf \
- /etc/nginx/sites-available/rodan.conf \
- /etc/nginx/sites-available/rodan.stream
+#sed -i "s/SERVER_HOST/${SERVER_HOST}/g" /etc/nginx/conf.d/ssl.conf
+
+# Wait for everything to be up.
+/run/wait-for-app iipsrv:9003
+/run/wait-for-app redis:6379
+/run/wait-for-app rodan-main:8000 --timeout=900
+/run/wait-for-app rodan-client:80
nginx
-tail -f /var/log/nginx/access.log & tail -f /var/log/nginx/error.log
+#tail -f /var/log/nginx/access.log & tail -f /var/log/nginx/error.log
diff --git a/nginx/scripts/start-production b/nginx/scripts/start-production
deleted file mode 100644
index a9552b3d0..000000000
--- a/nginx/scripts/start-production
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-set -o errexit # Exit immediately if a command exits with a non-zero status.
-set -o nounset # Treat unset variables as an error when substituting.
-set -o xtrace # Print commands and their arguments as they are executed.
-
-/run/setup
-sed -i "s/localhost/${SERVER_HOST}/g" /var/www/default/dist/configuration.json
-sed -i "s/SERVER_HOST/${SERVER_HOST}/g" /etc/nginx/conf.d/ssl.conf
-
-if [ $TLS -eq 1 ]; then
- if [ ! -f /etc/letsencrypt/ssl-dhparams.pem ]; then
- openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 4096
- fi
- sed -i "s/#tls //g" /etc/nginx/nginx.conf \
- /etc/nginx/sites-available/rodan.conf \
- /etc/nginx/sites-available/rodan.stream
- sed -i 's/"SERVER_PORT": "80/"SERVER_PORT": "443/g' /var/www/default/dist/configuration.json
- sed -i 's/"SERVER_HTTPS": false,/"SERVER_HTTPS": true,/g' /var/www/default/dist/configuration.json
- nginx
-fi
-
-tail -f /dev/null
\ No newline at end of file
diff --git a/nginx/scripts/wait-for-app b/nginx/scripts/wait-for-app
new file mode 100644
index 000000000..bbe404324
--- /dev/null
+++ b/nginx/scripts/wait-for-app
@@ -0,0 +1,177 @@
+#!/usr/bin/env bash
+# Use this script to test if a given TCP host/port are available
+
+cmdname=$(basename $0)
+
+echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
+
+usage()
+{
+ cat << USAGE >&2
+Usage:
+ $cmdname host:port [-s] [-t timeout] [-- command args]
+ -h HOST | --host=HOST Host or IP under test
+ -p PORT | --port=PORT TCP port under test
+ Alternatively, you specify the host and port as host:port
+ -s | --strict Only execute subcommand if the test succeeds
+ -q | --quiet Don't output any status messages
+ -t TIMEOUT | --timeout=TIMEOUT
+ Timeout in seconds, zero for no timeout
+ -- COMMAND ARGS Execute command with args after the test finishes
+USAGE
+ exit 1
+}
+
+wait_for()
+{
+ if [[ $TIMEOUT -gt 0 ]]; then
+ echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT"
+ else
+ echoerr "$cmdname: waiting for $HOST:$PORT without a timeout"
+ fi
+ start_ts=$(date +%s)
+ while :
+ do
+ if [[ $ISBUSY -eq 1 ]]; then
+ nc -z $HOST $PORT
+ result=$?
+ else
+ (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1
+ result=$?
+ fi
+ if [[ $result -eq 0 ]]; then
+ end_ts=$(date +%s)
+ echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds"
+ break
+ fi
+ sleep 1
+ done
+ return $result
+}
+
+wait_for_wrapper()
+{
+ # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
+ if [[ $QUIET -eq 1 ]]; then
+ timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
+ else
+ timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
+ fi
+ PID=$!
+ trap "kill -INT -$PID" INT
+ wait $PID
+ RESULT=$?
+ if [[ $RESULT -ne 0 ]]; then
+ echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT"
+ fi
+ return $RESULT
+}
+
+# process arguments
+while [[ $# -gt 0 ]]
+do
+ case "$1" in
+ *:* )
+ hostport=(${1//:/ })
+ HOST=${hostport[0]}
+ PORT=${hostport[1]}
+ shift 1
+ ;;
+ --child)
+ CHILD=1
+ shift 1
+ ;;
+ -q | --quiet)
+ QUIET=1
+ shift 1
+ ;;
+ -s | --strict)
+ STRICT=1
+ shift 1
+ ;;
+ -h)
+ HOST="$2"
+ if [[ $HOST == "" ]]; then break; fi
+ shift 2
+ ;;
+ --host=*)
+ HOST="${1#*=}"
+ shift 1
+ ;;
+ -p)
+ PORT="$2"
+ if [[ $PORT == "" ]]; then break; fi
+ shift 2
+ ;;
+ --port=*)
+ PORT="${1#*=}"
+ shift 1
+ ;;
+ -t)
+ TIMEOUT="$2"
+ if [[ $TIMEOUT == "" ]]; then break; fi
+ shift 2
+ ;;
+ --timeout=*)
+ TIMEOUT="${1#*=}"
+ shift 1
+ ;;
+ --)
+ shift
+ CLI=("$@")
+ break
+ ;;
+ --help)
+ usage
+ ;;
+ *)
+ echoerr "Unknown argument: $1"
+ usage
+ ;;
+ esac
+done
+
+if [[ "$HOST" == "" || "$PORT" == "" ]]; then
+ echoerr "Error: you need to provide a host and port to test."
+ usage
+fi
+
+TIMEOUT=${TIMEOUT:-15}
+STRICT=${STRICT:-0}
+CHILD=${CHILD:-0}
+QUIET=${QUIET:-0}
+
+# check to see if timeout is from busybox?
+# check to see if timeout is from busybox?
+TIMEOUT_PATH=$(realpath $(which timeout))
+if [[ $TIMEOUT_PATH =~ "busybox" ]]; then
+ ISBUSY=1
+ BUSYTIMEFLAG="-t"
+else
+ ISBUSY=0
+ BUSYTIMEFLAG=""
+fi
+
+if [[ $CHILD -gt 0 ]]; then
+ wait_for
+ RESULT=$?
+ exit $RESULT
+else
+ if [[ $TIMEOUT -gt 0 ]]; then
+ wait_for_wrapper
+ RESULT=$?
+ else
+ wait_for
+ RESULT=$?
+ fi
+fi
+
+if [[ $CLI != "" ]]; then
+ if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then
+ echoerr "$cmdname: strict mode, refusing to execute subprocess"
+ exit $RESULT
+ fi
+ exec "${CLI[@]}"
+else
+ exit $RESULT
+fi
diff --git a/production.yml b/production.yml
index cd4bdb35a..1adc3a54f 100644
--- a/production.yml
+++ b/production.yml
@@ -3,7 +3,7 @@ version: "3.4"
services:
nginx:
- image: "ddmal/nginx:v2.0.15"
+ image: "ddmal/nginx:v3.0.0"
deploy:
replicas: 1
resources:
@@ -23,7 +23,7 @@ services:
timeout: "10s"
retries: 10
start_period: "5m"
- command: /run/start-production
+ command: /run/start
environment:
TZ: America/Toronto
SERVER_HOST: rodan2.simssa.ca
@@ -35,10 +35,9 @@ services:
- "9002:9002"
volumes:
- "resources:/rodan/data"
- - "certbot:/etc/letsencrypt"
rodan-main:
- image: "ddmal/rodan-main:v2.0.15"
+ image: "ddmal/rodan-main:v3.0.0"
deploy:
replicas: 1
resources:
@@ -68,13 +67,18 @@ services:
volumes:
- "resources:/rodan/data"
+ rodan-client:
+ image: "ddmal/rodan-client:nightly"
+ volumes:
+ - "./rodan-client/config/configuration.json:/client/configuration.json"
+
iipsrv:
image: "ddmal/iipsrv:nightly"
volumes:
- "resources:/rodan/data"
celery:
- image: "ddmal/rodan-main:v2.0.15"
+ image: "ddmal/rodan-main:v3.0.0"
deploy:
replicas: 1
resources:
@@ -105,7 +109,7 @@ services:
- "resources:/rodan/data"
py3-celery:
- image: "ddmal/rodan-python3-celery:v2.0.15"
+ image: "ddmal/rodan-python3-celery:v3.0.0"
deploy:
replicas: 1
resources:
@@ -131,12 +135,11 @@ services:
CELERY_JOB_QUEUE: Python3
env_file:
- ./scripts/production.env
- - ./hpc-rabbitmq/scripts/production.env
volumes:
- "resources:/rodan/data"
gpu-celery:
- image: "ddmal/rodan-gpu-celery:v2.0.15"
+ image: "ddmal/rodan-gpu-celery:v3.0.0"
deploy:
replicas: 1
resources:
@@ -192,7 +195,7 @@ services:
TZ: America/Toronto
postgres:
- image: "ddmal/postgres-plpython:v2.0.15"
+ image: "ddmal/postgres-plpython:v3.0.0"
deploy:
replicas: 1
endpoint_mode: dnsrr
@@ -245,33 +248,7 @@ services:
env_file:
- ./scripts/production.env
- hpc-rabbitmq:
- image: "ddmal/hpc-rabbitmq:v2.0.15"
- deploy:
- replicas: 1
- resources:
- reservations:
- cpus: "1"
- memory: 2G
- limits:
- cpus: "1"
- memory: 2G
- restart_policy:
- condition: any
- delay: 5s
- window: 30s
- healthcheck:
- test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
- interval: "30s"
- timeout: "3s"
- retries: 3
- environment:
- TZ: America/Toronto
- env_file:
- - ./hpc-rabbitmq/scripts/production.env
-
volumes:
resources:
pg_backup:
pg_data:
- certbot:
diff --git a/python3-celery/Dockerfile b/python3-celery/Dockerfile
index 3c156e7cb..cb5ae9f6a 100644
--- a/python3-celery/Dockerfile
+++ b/python3-celery/Dockerfile
@@ -26,7 +26,7 @@ RUN yarn install
RUN yarn build
# Make Gamera files accessible to the main container.
-FROM ddmal/gamera4:fix_IC AS gamera
+FROM ddmal/gamera4:2.0.0 AS gamera
# This release is based on Debian 11 "Bullseye"
FROM python:3.7-slim
diff --git a/readme.md b/readme.md
index 4280a419c..ea2e27b88 100644
--- a/readme.md
+++ b/readme.md
@@ -4,7 +4,7 @@
- Master Branch ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/ddmal/rodan/master)
- Develop Branch ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/ddmal/rodan/develop)
-This repository contains Docker images that can be used to set up [Rodan](https://github.com/DDMAL/rodan) locally for development. These images can also be used in the future with slight modifications for deployment to a swarm production environment. Please see the wiki for more information about deploying Rodan. [Rodan-Docker Wiki](https://github.com/DDMAL/rodan-docker/wiki)
+This repository contains Docker images that can be used to set up [Rodan](https://github.com/DDMAL/rodan) locally for development. These images can also be used in the future with slight modifications for deployment to a swarm production environment. Please see the wiki for more information about deploying Rodan. [Rodan Wiki](https://github.com/DDMAL/Rodan/wiki)
#### Objectives
@@ -16,13 +16,13 @@ This repository contains Docker images that can be used to set up [Rodan](https:
If you are working on **Rodan** or **Rodan Jobs**
- Make sure you have Rodan submodule cloned in `${repository_root}/rodan/code` and **it is up to date** with the branch you wish to work with. The branches should be either `develop`, or the **name of the feature** you would like to include into develop. The `master` branch is only for version releases and is supposed to be a guaranteed working version.
-- Follow the instructions here: https://github.com/DDMAL/rodan-docker/wiki/Working-on-Rodan
+- Follow the instructions here: https://github.com/DDMAL/Rodan/wiki/Working-on-Rodan
- Note the `BRANCHES` environment variable in the installation scripts, you can set the environment variable locally by running the following command: `export BRANCHES="develop"`.
If you are working on **Rodan-Client**
- Make sure you have Rodan-Client cloned in `${repository_root}/rodan-client/code` and it is up to date with the branch you wish to work with.
-- Follow the instructions here: https://github.com/DDMAL/rodan-docker/wiki/Working-on-Rodan-Client
+- Follow the instructions here: https://github.com/DDMAL/Rodan/wiki/Working-on-Rodan-Client
## Tips for Interacting with Running Containers
diff --git a/rodan-client/Dockerfile b/rodan-client/Dockerfile
index 26e3d13c5..9941a729c 100644
--- a/rodan-client/Dockerfile
+++ b/rodan-client/Dockerfile
@@ -1,42 +1,43 @@
-FROM debian
-EXPOSE 9002
+# Alpine 3.15 is the last version to support Python 2.
+FROM node:12.22.6-alpine as builder
# Install OS packages.
-RUN apt-get -qq update \
- && apt-get -qq install -y \
- git \
- gnupg2 \
- libgif-dev \
- curl \
- build-essential
-# Add node
-RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
- && apt-get install -yq \
- nodejs=12.22.*
-# Add yarn
-RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
- && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
- && apt -qq update \
- && apt -qq install -y \
- yarn
-
-RUN rm -rf /var/lib/apt/lists/*
+RUN apk add --no-cache \
+ giflib-dev
+
+RUN apk add bash
+
+WORKDIR code
+
+# Install Yarn packages.
+COPY code/package.json code/yarn.lock ./
+RUN yarn install --inline-builds && yarn cache clean
# Install node project.
-COPY code/ /code/
-RUN set -x \
- && cd /code \
- # && npm install
- && yarn install
+COPY code/ .
# On some machines, the webpack dev server on the container won't accept connections from the host on localhost.
# Make the development server listen on 0.0.0.0 instead to accept connections from all addresses.
ENV RODAN_CLIENT_DEVELOP_HOST 0.0.0.0
-WORKDIR /code/node_modules/.bin
-COPY ./config/configuration.json /code/configuration.json
+# Build the project.
+COPY ./config/configuration.json configuration.json
+RUN yarn run dist
+
+# Host the project.
+FROM nginx:alpine
+EXPOSE 80
+
+# Copy nginx conf.
+COPY scripts/nginx.conf /etc/nginx/nginx.conf
+
+WORKDIR /client
+
+# Copy project from builder.
+COPY --from=builder /code/dist/ .
+#RUN mkdir resources \
+# && mv favicon.iso resources \
+# && mv grids-responsive-min.css resources
-# Template start script, in case the startup gets longer.
-COPY ./scripts/start /run/
-RUN sed -i 's/\r//' /run/start
-RUN chmod +x /run/start
+# Host server.
+CMD nginx
diff --git a/rodan-client/Dockerfile.old b/rodan-client/Dockerfile.old
new file mode 100644
index 000000000..d5a42d369
--- /dev/null
+++ b/rodan-client/Dockerfile.old
@@ -0,0 +1,42 @@
+FROM debian
+EXPOSE 9002
+
+# Install OS packages.
+RUN apt-get -qq update \
+ && apt-get -qq install -y \
+ git \
+ gnupg2 \
+ libgif-dev \
+ curl \
+ build-essential \
+ # Add npm
+ # && curl -sL https://deb.nodesource.com/setup_12.x | bash - \
+ # && apt-get install -yq \
+ # nodejs
+ # Add yarn
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
+ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
+ && apt -qq update \
+ && apt -qq install -y \
+ yarn
+
+RUN rm -rf /var/lib/apt/lists/*
+
+# Install node project.
+COPY code/ /code/
+RUN set -x \
+ && cd /code \
+ # && npm install
+ && yarn install
+
+# On some machines, the webpack dev server on the container won't accept connections from the host on localhost.
+# Make the development server listen on 0.0.0.0 instead to accept connections from all addresses.
+ENV RODAN_CLIENT_DEVELOP_HOST 0.0.0.0
+WORKDIR /code/node_modules/.bin
+
+COPY ./config/configuration.json /code/configuration.json
+
+# Template start script, in case the startup gets longer.
+COPY ./scripts/start /run/
+RUN sed -i 's/\r//' /run/start
+RUN chmod +x /run/start
diff --git a/rodan-client/code/gulpfile.js b/rodan-client/code/gulpfile.js
index e83be388d..546f6afbf 100644
--- a/rodan-client/code/gulpfile.js
+++ b/rodan-client/code/gulpfile.js
@@ -18,7 +18,7 @@ const WebpackDevServer = require("webpack-dev-server");
////////////////////////////////////////////////////////////////////////////////
// CONFIGURATION - Develop
////////////////////////////////////////////////////////////////////////////////
-const DEVELOP_HOST = process.env.RODAN_CLIENT_DEVELOP_HOST || "localhost";
+const DEVELOP_HOST = process.env.SERVER_HOST;
const DEVELOP_PORT = 9002;
const DEVELOP_SOURCEMAP = 'eval-source-map';
const DEVELOP_WEBROOT = '__develop__';
diff --git a/rodan-client/code/package-lock.json b/rodan-client/code/package-lock.json
new file mode 100644
index 000000000..3e5780626
--- /dev/null
+++ b/rodan-client/code/package-lock.json
@@ -0,0 +1,11360 @@
+{
+ "name": "rodan-client",
+ "version": "0.20.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "rodan-client",
+ "version": "0.20.0",
+ "license": "ISC",
+ "dependencies": {
+ "babel-preset-env": "^1.7.0",
+ "backbone": "^1.4.0",
+ "backbone.marionette": "^4.1.2",
+ "backbone.radio": "^2.0.0",
+ "bootstrap": "^4.4.1",
+ "eonasdan-bootstrap-datetimepicker": "4.17.47",
+ "file-saver": "^2.0.2",
+ "jquery": "^3.5.0",
+ "jqueryui": "^1.11.1",
+ "json-editor": "0.7.28",
+ "marionette.approuter": "^1.0.2",
+ "moment": "^2.25.3",
+ "moment-timezone": "^0.5.28",
+ "popper.js": "^1.16.1",
+ "underscore": "^1.10.2"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.9.6",
+ "@babel/preset-env": "^7.9.6",
+ "async": "^3.2.0",
+ "babel-loader": "^8.1.0",
+ "core-js": "^3.6.5",
+ "del": "^5.1.0",
+ "gulp": "^4.0.2",
+ "ip": "^1.1.4",
+ "paper": "^0.12.4",
+ "prompt-sync": "^4.2.0",
+ "recursive-readdir": "^2.2.2",
+ "regenerator-runtime": "^0.13.5",
+ "simple-git": "^1.132.0",
+ "tags-input": "^1.1.1",
+ "vinyl-fs": "^3.0.3",
+ "webpack": "^4.43.0",
+ "webpack-dev-server": "^3.11.0"
+ },
+ "engines": {
+ "node": "12.22.x"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
+ "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.12.0",
+ "invariant": "^2.2.4",
+ "semver": "^5.5.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.11.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz",
+ "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.11.6",
+ "@babel/helper-module-transforms": "^7.11.0",
+ "@babel/helpers": "^7.10.4",
+ "@babel/parser": "^7.11.5",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.11.5",
+ "@babel/types": "^7.11.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.11.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz",
+ "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.11.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+ "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+ "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
+ "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.10.4",
+ "browserslist": "^4.12.0",
+ "invariant": "^2.2.4",
+ "levenary": "^1.1.1",
+ "semver": "^5.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+ "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-member-expression-to-functions": "^7.10.5",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
+ "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4",
+ "regexpu-core": "^4.7.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regexpu-core": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
+ "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regjsparser": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/@babel/helper-define-map": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/types": "^7.10.5",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.11.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz",
+ "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+ "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+ "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+ "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+ "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-simple-access": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.11.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/helper-regex": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+ "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.11.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+ "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-wrap-function": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+ "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+ "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
+ "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+ "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+ "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+ "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+ "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.10.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+ "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+ "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
+ "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-json-strings": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+ "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
+ "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+ "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
+ "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
+ "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
+ "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
+ "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
+ "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+ "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
+ "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
+ "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
+ "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
+ "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz",
+ "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
+ "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-define-map": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "globals": "^11.1.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
+ "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
+ "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
+ "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
+ "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
+ "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
+ "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
+ "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
+ "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+ "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+ "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+ "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-simple-access": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
+ "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.10.4",
+ "@babel/helper-module-transforms": "^7.10.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
+ "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
+ "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
+ "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
+ "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
+ "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
+ "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
+ "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator/node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
+ "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
+ "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
+ "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
+ "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
+ "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
+ "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
+ "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
+ "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz",
+ "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.11.0",
+ "@babel/helper-compilation-targets": "^7.10.4",
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+ "@babel/plugin-proposal-class-properties": "^7.10.4",
+ "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+ "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+ "@babel/plugin-proposal-json-strings": "^7.10.4",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+ "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+ "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+ "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+ "@babel/plugin-proposal-private-methods": "^7.10.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.0",
+ "@babel/plugin-syntax-class-properties": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+ "@babel/plugin-syntax-top-level-await": "^7.10.4",
+ "@babel/plugin-transform-arrow-functions": "^7.10.4",
+ "@babel/plugin-transform-async-to-generator": "^7.10.4",
+ "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+ "@babel/plugin-transform-block-scoping": "^7.10.4",
+ "@babel/plugin-transform-classes": "^7.10.4",
+ "@babel/plugin-transform-computed-properties": "^7.10.4",
+ "@babel/plugin-transform-destructuring": "^7.10.4",
+ "@babel/plugin-transform-dotall-regex": "^7.10.4",
+ "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+ "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+ "@babel/plugin-transform-for-of": "^7.10.4",
+ "@babel/plugin-transform-function-name": "^7.10.4",
+ "@babel/plugin-transform-literals": "^7.10.4",
+ "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+ "@babel/plugin-transform-modules-amd": "^7.10.4",
+ "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+ "@babel/plugin-transform-modules-umd": "^7.10.4",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+ "@babel/plugin-transform-new-target": "^7.10.4",
+ "@babel/plugin-transform-object-super": "^7.10.4",
+ "@babel/plugin-transform-parameters": "^7.10.4",
+ "@babel/plugin-transform-property-literals": "^7.10.4",
+ "@babel/plugin-transform-regenerator": "^7.10.4",
+ "@babel/plugin-transform-reserved-words": "^7.10.4",
+ "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+ "@babel/plugin-transform-spread": "^7.11.0",
+ "@babel/plugin-transform-sticky-regex": "^7.10.4",
+ "@babel/plugin-transform-template-literals": "^7.10.4",
+ "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+ "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+ "@babel/plugin-transform-unicode-regex": "^7.10.4",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.11.5",
+ "browserslist": "^4.12.0",
+ "core-js-compat": "^3.6.2",
+ "invariant": "^2.2.2",
+ "levenary": "^1.1.1",
+ "semver": "^5.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+ "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz",
+ "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.11.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.11.5",
+ "@babel/types": "^7.11.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz",
+ "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+ "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.3",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+ "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+ "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.3",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "14.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz",
+ "integrity": "sha512-IzMhbDYCpv26pC2wboJ4MMOa9GKtjplXfcAqrMeNJpUUwpM/2ATt2w1JPUXwS6spu856TvKZL2AOmeU2rAxskw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.5",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+ "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": ">=5.0.0"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-wrap": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-wrap": "0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "node_modules/anymatch/node_modules/normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "remove-trailing-separator": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/append-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+ "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-filter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+ "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-initial": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+ "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-slice": "^1.0.0",
+ "is-number": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-initial/node_modules/is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-last": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-last/node_modules/is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-sort": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+ "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-compare": "^1.0.0",
+ "get-value": "^2.0.6",
+ "kind-of": "^5.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-sort/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ }
+ },
+ "node_modules/assert/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/assert/node_modules/util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "2.0.1"
+ }
+ },
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-done": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+ "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.2",
+ "process-nextick-args": "^2.0.0",
+ "stream-exhaust": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-settle": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+ "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-done": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "license": "MIT"
+ },
+ "node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 6.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/babel-loader/node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "node_modules/babel-preset-env/node_modules/browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "license": "MIT"
+ },
+ "node_modules/babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/babel-types/node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "license": "MIT",
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/bach": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-filter": "^1.1.1",
+ "arr-flatten": "^1.0.1",
+ "arr-map": "^2.0.0",
+ "array-each": "^1.0.0",
+ "array-initial": "^1.0.0",
+ "array-last": "^1.1.1",
+ "async-done": "^1.2.2",
+ "async-settle": "^1.0.0",
+ "now-and-later": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/backbone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz",
+ "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "underscore": ">=1.8.3"
+ }
+ },
+ "node_modules/backbone.marionette": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/backbone.marionette/-/backbone.marionette-4.1.2.tgz",
+ "integrity": "sha512-T8wWxZZnuYjylONTnWZsGsgXtdx2ZrE38pZWJI9LmPqzYK5j0T8uduapFO7OEpsW5rtdbBgwof30xhzAkbb5eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "backbone.radio": "^2.0.0"
+ },
+ "peerDependencies": {
+ "backbone": "^1.3.3",
+ "underscore": "^1.8.3"
+ }
+ },
+ "node_modules/backbone.radio": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/backbone.radio/-/backbone.radio-2.0.0.tgz",
+ "integrity": "sha1-u+hnKzc+MT+Z820vvPWD/nfQT0I=",
+ "peerDependencies": {
+ "backbone": "^1.3.3",
+ "underscore": "^1.8.3"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/bonjour": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-flatten": "^2.1.0",
+ "deep-equal": "^1.0.1",
+ "dns-equal": "^1.0.0",
+ "dns-txt": "^2.0.2",
+ "multicast-dns": "^6.0.1",
+ "multicast-dns-service-types": "^1.1.0"
+ }
+ },
+ "node_modules/bonjour/node_modules/array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bootstrap": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
+ "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ },
+ "peerDependencies": {
+ "jquery": "1.9.1 - 3",
+ "popper.js": "^1.16.1"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz",
+ "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001125",
+ "electron-to-chromium": "^1.3.564",
+ "escalade": "^3.0.2",
+ "node-releases": "^1.1.61"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/buffer-indexof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "12.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+ "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "bluebird": "^3.5.5",
+ "chownr": "^1.1.1",
+ "figgy-pudding": "^3.5.1",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.1.15",
+ "infer-owner": "^1.0.3",
+ "lru-cache": "^5.1.1",
+ "mississippi": "^3.0.0",
+ "mkdirp": "^0.5.1",
+ "move-concurrently": "^1.0.1",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^2.6.3",
+ "ssri": "^6.0.1",
+ "unique-filename": "^1.1.1",
+ "y18n": "^4.0.0"
+ }
+ },
+ "node_modules/cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001131",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz",
+ "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==",
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ },
+ "optionalDependencies": {
+ "fsevents": "^1.2.7"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cloneable-readable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+ "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "process-nextick-args": "^2.0.0",
+ "readable-stream": "^2.3.5"
+ }
+ },
+ "node_modules/code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/collection-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-map": "^2.0.2",
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-disposition/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/convert-source-map/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/copy-concurrently": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ }
+ },
+ "node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/copy-props": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
+ "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "each-props": "^1.3.0",
+ "is-plain-object": "^2.0.1"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+ "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.8.5",
+ "semver": "7.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cyclist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "license": "MIT"
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^5.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-compare/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^1.0.0",
+ "ip-regex": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/default-resolution": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
+ "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "globby": "^10.0.1",
+ "graceful-fs": "^4.2.2",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.1",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/del/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dns-packet": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip": "^1.1.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/dns-txt": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-indexof": "^1.0.0"
+ }
+ },
+ "node_modules/domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4",
+ "npm": ">=1.2"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/each-props": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+ "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.1",
+ "object.defaults": "^1.1.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.3.568",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.568.tgz",
+ "integrity": "sha512-j9MlEwgTHVW/lq93Hw8yhzA886oLjDm3Hz7eDkWP2v4fzLVuqOWhpNluziSnmR/tBqgoYldagbLknrdg+B7Tlw==",
+ "license": "ISC"
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+ "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
+ "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/enhanced-resolve/node_modules/memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.3.0 <5.0.0 || >=5.10"
+ }
+ },
+ "node_modules/eonasdan-bootstrap-datetimepicker": {
+ "version": "4.17.47",
+ "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz",
+ "integrity": "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=",
+ "license": "MIT",
+ "dependencies": {
+ "bootstrap": "^3.3",
+ "jquery": "^1.8.3 || ^2.0 || ^3.0",
+ "moment": "^2.10",
+ "moment-timezone": "^0.4.0"
+ },
+ "peerDependencies": {
+ "bootstrap": "^3.3",
+ "jquery": "^1.8.3 || ^2.0 || ^3.0",
+ "moment": "^2.10",
+ "moment-timezone": "^0.4.0"
+ }
+ },
+ "node_modules/eonasdan-bootstrap-datetimepicker/node_modules/bootstrap": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
+ "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eonasdan-bootstrap-datetimepicker/node_modules/moment-timezone": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz",
+ "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=",
+ "license": "MIT",
+ "dependencies": {
+ "moment": ">= 2.6.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.17.6",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+ "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.0",
+ "is-regex": "^1.1.0",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "node_modules/es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz",
+ "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "original": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+ "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "type": "^2.0.0"
+ }
+ },
+ "node_modules/ext/node_modules/type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
+ "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fancy-log": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+ "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-gray": "^0.1.1",
+ "color-support": "^1.1.3",
+ "parse-node-version": "^1.0.0",
+ "time-stamp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-glob/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
+ "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+ "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/figgy-pudding": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/file-saver": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
+ "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==",
+ "license": "MIT"
+ },
+ "node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^3.1.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/findup-sync/node_modules/is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fined": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+ "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "is-plain-object": "^2.0.3",
+ "object.defaults": "^1.1.0",
+ "object.pick": "^1.2.0",
+ "parse-filepath": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/flagged-respawn": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/flush-write-stream": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.3.6"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+ "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "node_modules/fs-mkdirp-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+ "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "through2": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.1",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ }
+ },
+ "node_modules/glob-parent/node_modules/is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend": "^3.0.0",
+ "glob": "^7.1.1",
+ "glob-parent": "^3.1.0",
+ "is-negated-glob": "^1.0.0",
+ "ordered-read-streams": "^1.0.0",
+ "pumpify": "^1.3.5",
+ "readable-stream": "^2.1.5",
+ "remove-trailing-separator": "^1.0.1",
+ "to-absolute-glob": "^2.0.0",
+ "unique-stream": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/glob-watcher": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz",
+ "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^2.0.0",
+ "async-done": "^1.2.0",
+ "chokidar": "^2.0.0",
+ "is-negated-glob": "^1.0.0",
+ "just-debounce": "^1.0.0",
+ "normalize-path": "^3.0.0",
+ "object.defaults": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glogg": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
+ "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sparkles": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gulp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
+ "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob-watcher": "^5.0.3",
+ "gulp-cli": "^2.2.0",
+ "undertaker": "^1.2.1",
+ "vinyl-fs": "^3.0.0"
+ },
+ "bin": {
+ "gulp": "bin/gulp.js"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/gulp-cli": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz",
+ "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^1.0.1",
+ "archy": "^1.0.0",
+ "array-sort": "^1.0.0",
+ "color-support": "^1.1.3",
+ "concat-stream": "^1.6.0",
+ "copy-props": "^2.0.1",
+ "fancy-log": "^1.3.2",
+ "gulplog": "^1.0.0",
+ "interpret": "^1.4.0",
+ "isobject": "^3.0.1",
+ "liftoff": "^3.1.0",
+ "matchdep": "^2.0.0",
+ "mute-stdout": "^1.0.0",
+ "pretty-hrtime": "^1.0.0",
+ "replace-homedir": "^1.0.0",
+ "semver-greatest-satisfied-range": "^1.1.0",
+ "v8flags": "^3.2.0",
+ "yargs": "^7.1.0"
+ },
+ "bin": {
+ "gulp": "bin/gulp.js"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/gulp-cli/node_modules/cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "node_modules/gulp-cli/node_modules/get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gulp-cli/node_modules/require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gulp-cli/node_modules/which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gulp-cli/node_modules/wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gulp-cli/node_modules/y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gulp-cli/node_modules/yargs": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz",
+ "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "5.0.0-security.0"
+ }
+ },
+ "node_modules/gulp-cli/node_modules/yargs-parser": {
+ "version": "5.0.0-security.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz",
+ "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^3.0.0",
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glogg": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+ "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
+ "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "http-proxy": "^1.17.0",
+ "is-glob": "^4.0.0",
+ "lodash": "^4.17.11",
+ "micromatch": "^3.1.10"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/iferr": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^3.0.0",
+ "resolve-cwd": "^2.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/infer-owner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/internal-ip": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-gateway": "^4.2.0",
+ "ipaddr.js": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-relative": "^1.0.0",
+ "is-windows": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-absolute-url": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz",
+ "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-descriptor/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negated-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-path-inside": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd/node_modules/is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-is-inside": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unc-path": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unc-path-regex": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-valid-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
+ "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==",
+ "license": "MIT"
+ },
+ "node_modules/jqueryui": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/jqueryui/-/jqueryui-1.11.1.tgz",
+ "integrity": "sha1-hxhVBwX1Vo0RmRlhaQlNtzsikbw=",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/json-editor": {
+ "version": "0.7.28",
+ "resolved": "https://registry.npmjs.org/json-editor/-/json-editor-0.7.28.tgz",
+ "integrity": "sha1-KqWwmQorUHZ4kVjn3YotIQjOnMU=",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json3": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/just-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/killable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/last-run": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+ "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-resolution": "^2.0.0",
+ "es6-weak-map": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.6.3"
+ }
+ },
+ "node_modules/lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "invert-kv": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lead": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+ "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flush-write-stream": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levenary": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+ "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/liftoff": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
+ "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend": "^3.0.0",
+ "findup-sync": "^3.0.0",
+ "fined": "^1.0.1",
+ "flagged-respawn": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "object.map": "^1.0.0",
+ "rechoir": "^0.6.2",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/liftoff/node_modules/findup-sync": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.3.0 <5.0.0 || >=5.10"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/loader-utils/node_modules/json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "license": "MIT"
+ },
+ "node_modules/loglevel": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
+ "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/make-iterator/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/marionette.approuter": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/marionette.approuter/-/marionette.approuter-1.0.2.tgz",
+ "integrity": "sha512-XjcKb1Y6KROCmdZxO/rtOdRhd3Hfrs+7zWjtfiuCFS3VZa2IQjNgKUuIGmaKDZte2AmKRRMaPvXMh22nKYFh8A==",
+ "peerDependencies": {
+ "backbone": "^1.3.3",
+ "backbone.marionette": "^4.0.0",
+ "underscore": "^1.8.3"
+ }
+ },
+ "node_modules/matchdep": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "findup-sync": "^2.0.0",
+ "micromatch": "^3.0.4",
+ "resolve": "^1.4.0",
+ "stack-trace": "0.0.10"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/micromatch/node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/micromatch/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/micromatch/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/micromatch/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.44.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mississippi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^3.0.0",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-deep/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz",
+ "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.31",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
+ "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": ">= 2.9.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/move-concurrently": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^1.3.1",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/multicast-dns-service-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mute-stdout": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
+ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "dev": true,
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/node-libs-browser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.1",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/node-libs-browser/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "1.1.61",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz",
+ "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/now-and-later": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
+ "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+ "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
+ "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.0",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.assign/node_modules/es-abstract": {
+ "version": "1.18.0-next.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz",
+ "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.0",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-each": "^1.0.1",
+ "array-slice": "^1.0.0",
+ "for-own": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.reduce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+ "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/opn": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-wsl": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ordered-read-streams": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+ "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "node_modules/original": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "url-parse": "^1.4.3"
+ }
+ },
+ "node_modules/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lcid": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true,
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/paper": {
+ "version": "0.12.11",
+ "resolved": "https://registry.npmjs.org/paper/-/paper-0.12.11.tgz",
+ "integrity": "sha512-m6TKiyUr1A8zz6qdyBdYkb63OSRcNODlWZDxjEXFHtRjSlmMckFeSDdnuLYXsgwzcv3s36LgtrPk88y+gmA5JA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/parallel-transform": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cyclist": "^1.0.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ }
+ },
+ "node_modules/parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-absolute": "^1.0.0",
+ "map-cache": "^0.2.0",
+ "path-root": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true,
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-root-regex": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+ "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ },
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/portfinder/node_modules/async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/portfinder/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/prompt-sync": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
+ "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-ansi": "^5.0.0"
+ }
+ },
+ "node_modules/prompt-sync/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prompt-sync/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "node_modules/pumpify/node_modules/pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg/node_modules/path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/readable-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "3.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+ "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "license": "BSD",
+ "dependencies": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regex-not/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regex-not/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "license": "BSD",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/remove-bom-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+ "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5",
+ "is-utf8": "^0.2.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/remove-bom-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "remove-bom-buffer": "^3.0.0",
+ "safe-buffer": "^5.1.0",
+ "through2": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/replace-ext": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/replace-homedir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+ "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1",
+ "is-absolute": "^1.0.0",
+ "remove-trailing-separator": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-options": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+ "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "value-or-function": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/run-queue": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "1.10.8",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
+ "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-forge": "^0.10.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/semver-greatest-satisfied-range": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+ "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sver-compat": "^1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/http-errors": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+ "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "license": "(MIT AND BSD-3-Clause)",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simple-git": {
+ "version": "1.132.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz",
+ "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.0.1"
+ }
+ },
+ "node_modules/simple-git/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+ "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.10.0",
+ "uuid": "^3.4.0",
+ "websocket-driver": "0.6.5"
+ }
+ },
+ "node_modules/sockjs-client": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+ "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.5",
+ "eventsource": "^1.0.7",
+ "faye-websocket": "~0.11.1",
+ "inherits": "^2.0.3",
+ "json3": "^3.3.2",
+ "url-parse": "^1.4.3"
+ }
+ },
+ "node_modules/sockjs-client/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/sockjs-client/node_modules/faye-websocket": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/sockjs/node_modules/websocket-driver": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sparkles": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+ "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/spdy/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-string/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-string/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ssri": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "figgy-pudding": "^3.5.1"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/stream-each": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-utf8": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/sver-compat": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+ "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es6-iterator": "^2.0.1",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/tags-input": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tags-input/-/tags-input-1.1.1.tgz",
+ "integrity": "sha1-1r1+kS8Wqb1BwDyKMFnkJFUoElo=",
+ "dev": true
+ },
+ "node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+ "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cacache": "^12.0.2",
+ "find-cache-dir": "^2.1.0",
+ "is-wsl": "^1.1.0",
+ "schema-utils": "^1.0.0",
+ "serialize-javascript": "^4.0.0",
+ "source-map": "^0.6.1",
+ "terser": "^4.1.2",
+ "webpack-sources": "^1.4.0",
+ "worker-farm": "^1.7.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0"
+ }
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/through2-filter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
+ "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "through2": "~2.0.0",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/timers-browserify": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "setimmediate": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-absolute-glob": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+ "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-absolute": "^1.0.0",
+ "is-negated-glob": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex/node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-through": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+ "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "through2": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz",
+ "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==",
+ "license": "MIT"
+ },
+ "node_modules/undertaker": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
+ "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-flatten": "^1.0.1",
+ "arr-map": "^2.0.0",
+ "bach": "^1.0.0",
+ "collection-map": "^1.0.0",
+ "es6-weak-map": "^2.0.1",
+ "fast-levenshtein": "^1.0.0",
+ "last-run": "^1.1.0",
+ "object.defaults": "^1.0.0",
+ "object.reduce": "^1.0.0",
+ "undertaker-registry": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "node_modules/unique-stream": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
+ "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "through2-filter": "^3.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+ "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uri-js/node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+ "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "2.0.3"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/util/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/v8flags": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+ "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/value-or-function": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vinyl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+ "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^2.1.1",
+ "clone-buffer": "^1.0.0",
+ "clone-stats": "^1.0.0",
+ "cloneable-readable": "^1.0.0",
+ "remove-trailing-separator": "^1.0.1",
+ "replace-ext": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vinyl-fs": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
+ "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fs-mkdirp-stream": "^1.0.0",
+ "glob-stream": "^6.1.0",
+ "graceful-fs": "^4.0.0",
+ "is-valid-glob": "^1.0.0",
+ "lazystream": "^1.0.0",
+ "lead": "^1.0.0",
+ "object.assign": "^4.0.4",
+ "pumpify": "^1.3.5",
+ "readable-stream": "^2.3.3",
+ "remove-bom-buffer": "^3.0.0",
+ "remove-bom-stream": "^1.2.0",
+ "resolve-options": "^1.1.0",
+ "through2": "^2.0.0",
+ "to-through": "^2.0.0",
+ "value-or-function": "^3.0.0",
+ "vinyl": "^2.0.0",
+ "vinyl-sourcemap": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vinyl-sourcemap": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+ "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "append-buffer": "^1.0.2",
+ "convert-source-map": "^1.5.0",
+ "graceful-fs": "^4.1.6",
+ "normalize-path": "^2.1.1",
+ "now-and-later": "^2.0.0",
+ "remove-bom-buffer": "^3.0.0",
+ "vinyl": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vinyl-sourcemap/node_modules/normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "remove-trailing-separator": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/watchpack": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+ "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0"
+ },
+ "optionalDependencies": {
+ "chokidar": "^3.4.1",
+ "watchpack-chokidar2": "^2.0.0"
+ }
+ },
+ "node_modules/watchpack-chokidar2": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+ "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "chokidar": "^2.1.8"
+ },
+ "engines": {
+ "node": "<8.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/watchpack/node_modules/binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/chokidar": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+ "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.4.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.1.2"
+ }
+ },
+ "node_modules/watchpack/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/readdirp": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+ "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "4.44.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
+ "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^6.4.1",
+ "ajv": "^6.10.2",
+ "ajv-keywords": "^3.4.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^4.3.0",
+ "eslint-scope": "^4.0.3",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^2.4.0",
+ "loader-utils": "^1.2.3",
+ "memory-fs": "^0.4.1",
+ "micromatch": "^3.1.10",
+ "mkdirp": "^0.5.3",
+ "neo-async": "^2.6.1",
+ "node-libs-browser": "^2.2.1",
+ "schema-utils": "^1.0.0",
+ "tapable": "^1.1.3",
+ "terser-webpack-plugin": "^1.4.3",
+ "watchpack": "^1.7.4",
+ "webpack-sources": "^1.4.1"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ },
+ "webpack-command": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+ "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "memory-fs": "^0.4.1",
+ "mime": "^2.4.4",
+ "mkdirp": "^0.5.1",
+ "range-parser": "^1.2.1",
+ "webpack-log": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+ "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-html": "0.0.7",
+ "bonjour": "^3.5.0",
+ "chokidar": "^2.1.8",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^1.6.0",
+ "debug": "^4.1.1",
+ "del": "^4.1.1",
+ "express": "^4.17.1",
+ "html-entities": "^1.3.1",
+ "http-proxy-middleware": "0.19.1",
+ "import-local": "^2.0.0",
+ "internal-ip": "^4.3.0",
+ "ip": "^1.1.5",
+ "is-absolute-url": "^3.0.3",
+ "killable": "^1.0.1",
+ "loglevel": "^1.6.8",
+ "opn": "^5.5.0",
+ "p-retry": "^3.0.1",
+ "portfinder": "^1.0.26",
+ "schema-utils": "^1.0.0",
+ "selfsigned": "^1.10.7",
+ "semver": "^6.3.0",
+ "serve-index": "^1.9.1",
+ "sockjs": "0.3.20",
+ "sockjs-client": "1.4.0",
+ "spdy": "^4.0.2",
+ "strip-ansi": "^3.0.1",
+ "supports-color": "^6.1.0",
+ "url": "^0.11.0",
+ "webpack-dev-middleware": "^3.7.2",
+ "webpack-log": "^2.0.0",
+ "ws": "^6.2.1",
+ "yargs": "^13.3.2"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 6.11.5"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/webpack-log": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^3.0.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-log/node_modules/ansi-colors": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/worker-farm": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.7"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/yargs-parser/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/rodan-client/code/package.json b/rodan-client/code/package.json
index 27d2bb788..8a9f83547 100644
--- a/rodan-client/code/package.json
+++ b/rodan-client/code/package.json
@@ -55,12 +55,11 @@
"backbone": "^1.4.0",
"backbone.marionette": "^4.1.2",
"backbone.radio": "^2.0.0",
- "bootstrap": "^4.4.1",
- "eonasdan-bootstrap-datetimepicker": "4.17.47",
"file-saver": "^2.0.2",
"jquery": "^3.5.0",
"jqueryui": "^1.11.1",
"json-editor": "0.7.28",
+ "marionette.approuter": "^1.0.2",
"moment": "^2.25.3",
"moment-timezone": "^0.5.28",
"popper.js": "^1.16.1",
diff --git a/rodan-client/code/resources/images/clear-filters.svg b/rodan-client/code/resources/images/clear-filters.svg
new file mode 100644
index 000000000..36e3dca80
--- /dev/null
+++ b/rodan-client/code/resources/images/clear-filters.svg
@@ -0,0 +1,12 @@
+
+
+
+ clear-filter
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rodan-client/code/resources/images/dropdown-arrow.svg b/rodan-client/code/resources/images/dropdown-arrow.svg
new file mode 100644
index 000000000..9d990ed6c
--- /dev/null
+++ b/rodan-client/code/resources/images/dropdown-arrow.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/rodan-client/code/resources/images/filter-icon.svg b/rodan-client/code/resources/images/filter-icon.svg
new file mode 100644
index 000000000..4a34b2103
--- /dev/null
+++ b/rodan-client/code/resources/images/filter-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Application.js b/rodan-client/code/src/js/Application.js
index 045c7e0e6..55674d0ed 100644
--- a/rodan-client/code/src/js/Application.js
+++ b/rodan-client/code/src/js/Application.js
@@ -1,6 +1,5 @@
import _ from 'underscore';
import $ from 'jquery';
-import bootstrap from 'bootstrap';
import Marionette from 'backbone.marionette';
import moment from 'moment';
import Radio from 'backbone.radio';
@@ -33,6 +32,8 @@ import GlobalResourceLabelCollection from './Collections/Global/GlobalResourceLa
import LayoutViewMaster from './Views/Master/LayoutViewMaster';
import UpdateManager from './Managers/UpdateManager';
import TransferManager from './Managers/TransferManager';
+import Router from 'js/Router';
+import Backbone from 'backbone';
/**
* Main application class.
@@ -88,9 +89,7 @@ export default class Application extends Marionette.Application
{
this._transferManager = new TransferManager();
this._updateManager = new UpdateManager();
- // This is commented out because deleting a workflowRun throws a null error despite the error
- // being non-existent. Its errors are not very useful anyway. Fix in progress, see issue 475 (Rodan).
- // this._errorManager = new ErrorManager();
+ this._errorManager = new ErrorManager();
}
/**
@@ -195,6 +194,10 @@ export default class Application extends Marionette.Application
// Check authentication.
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_CHECK);
+
+ // Start router.
+ new Router();
+ Backbone.history.start();
}
/**
@@ -213,4 +216,4 @@ export default class Application extends Marionette.Application
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_SELECTED_COLLECTION);
}
}
-Application.prototype.region = '#region-master';
+Application.prototype.region = '#app';
diff --git a/rodan-client/code/src/js/Behaviors/BehaviorTable.js b/rodan-client/code/src/js/Behaviors/BehaviorTable.js
index e0924f77c..133a07e7c 100644
--- a/rodan-client/code/src/js/Behaviors/BehaviorTable.js
+++ b/rodan-client/code/src/js/Behaviors/BehaviorTable.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import _ from 'underscore';
-import datetimepicker from 'eonasdan-bootstrap-datetimepicker';
+// import datetimepicker from 'eonasdan-bootstrap-datetimepicker';
import 'jqueryui';
import BaseCollection from 'js/Collections/BaseCollection';
import Configuration from 'js/Configuration';
@@ -27,7 +27,7 @@ export default class BehaviorTable extends Marionette.Behavior
this._lastTarget = null;
this._multipleSelectionKey = Environment.getMultipleSelectionKey();
this._rangeSelectionKey = Environment.getRangeSelectionKey();
- this._submitSearch = _.debounce((filters) => this.view.collection.fetchFilter(filters), Configuration.SEARCH_DEBOUNCE_DELAY);
+ this._submitSearch = _.debounce((filters) => this.view.collection.fetchFilter(filters), Configuration.DEBOUNCE_DELAY);
}
/**
@@ -197,29 +197,22 @@ export default class BehaviorTable extends Marionette.Behavior
_injectFiltering(filterFields)
{
var filters = this._getFilters(this.view.collection, filterFields);
- for (var index in filters)
+
+ for (let index in filters)
{
- var $collectionItem = $(filters[index].collectionItem);
var $formInput = $(filters[index].input);
- $collectionItem.click((event) => this._handleFilterClick(event));
- $(this.el).find('#filter-menu ul').append($collectionItem);
$(this.el).find('#filter-inputs').append($formInput);
}
- // Setup datetimepickers.
- for (index in this._datetimepickerElements)
- {
- var elementId = this._datetimepickerElements[index];
- $(this.el).find(elementId).datetimepicker();
- $(this.el).find(elementId).data('DateTimePicker').format(Configuration.DATETIME_FORMAT);
- $(this.el).find(elementId).on('dp.change', () => this._handleSearch());
+ // Load label filters.
+ if (filterFields.labels) {
+ this._updateFilterLabels();
}
$(this.el).find('#filter-inputs input').on('change keyup paste mouseup', () => this._handleSearch());
$(this.el).find('#filter-inputs select').on('change keyup paste mouseup', () => this._handleSearch());
this._filtersInjected = true;
- this._hideFormElements();
}
/**
@@ -253,41 +246,68 @@ export default class BehaviorTable extends Marionette.Behavior
{
var templateChoice = _.template($(this.options.templateFilterChoice).html());
var templateInput = _.template($(this.options.templateFilterMultipleEnum).html());
- var labelCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_RESOURCELABEL_COLLECTION);
- var project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
- var project_resources = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_CURRENT, {data: {project: project.id}});
- var labels = new Set();
- project_resources.each(function (resource) {
- resource.attributes.labels.forEach(function ({ url }) {
- labels.add(url);
- });
- });
- var filtered_collection = labelCollection.filter(function (resource) { return labels.has(resource.attributes.url); });
- var labelModels = filtered_collection.map((label) => {
- return {
- label: label.get('name'),
- value: label.get('uuid')
- };
- });
var htmlChoice = templateChoice({label: label, field: field});
- var htmlInput = templateInput({label: label, field: field, values: labelModels});
+ var htmlInput = templateInput({label: label, field: field, values: [] }); // Values will be populated later
return {collectionItem: htmlChoice, input: htmlInput};
}
+ /**
+ * Update the label filters with the labels for the current project
+ */
+ _updateFilterLabels()
+ {
+ const project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+
+ if (!project) {
+ return;
+ }
+
+ const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'labels');
+ const ajaxSettings = {
+ url: route + '?resource__project=' + project.get('uuid'),
+ type: 'GET',
+ dataType: 'json',
+ success: (data) => {
+ const select = document.getElementById('labels');
+ if (select) {
+ const labels = data.results.map(label => {
+ const element = document.createElement('option');
+ element.value = label.uuid;
+ element.label = label.name;
+ return element;
+ });
+ select.replaceChildren(...labels);
+ }
+ },
+ };
+
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings});
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS - Event handlers
///////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Handles click events on "Add Search Filter" button.
+ */
+ _handleButtonAddFilter() {
+ $('#dropdown-menu-table-filter').toggleClass('hidden');
+ }
+
/**
* Handles filter click.
*/
_handleFilterClick(event)
{
var data = $(event.target).data();
- //this._hideFormElements();
if (data.id)
{
this._showFormElement(data.id);
}
+
+ // Hide filter menu dropdown.
+ $('#dropdown-menu-table-filter').toggleClass('hidden');
}
/**
@@ -306,6 +326,12 @@ export default class BehaviorTable extends Marionette.Behavior
for (var index in values)
{
var name = values[index].name;
+
+ // Format datetime values correctly.
+ if (name === 'updated__gt' || name === 'updated__lt' || name === 'created__gt' || name === 'created__lt') {
+ values[index].value = values[index].value.replace('T', ' ');
+ }
+
var value = values[index].value;
if (typeof filters[name] === 'undefined') {
filters[name] = value;
@@ -419,6 +445,10 @@ export default class BehaviorTable extends Marionette.Behavior
if (options)
{
this._injectFiltering(options.filter_fields);
+
+ if (options.filter_fields.labels) {
+ collection.on('add remove sync', () => this._updateFilterLabels());
+ }
}
}
@@ -512,6 +542,11 @@ export default class BehaviorTable extends Marionette.Behavior
this.view.collection.fetchPage({page: parseInt(event.currentTarget.value)});
}
+ _handleFiltersDropdown() {
+ $(this.el).find('#filter-inputs-wrapper').toggleClass('hidden');
+ $(this.el).find('#filter-inputs-dropdown-btn').toggleClass('open');
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
@@ -633,10 +668,12 @@ BehaviorTable.prototype.ui = {
paginationNext: '#pagination-next',
paginationFirst: '#pagination-first',
paginationLast: '#pagination-last',
+ buttonAddFilter: '#button-add-filter',
buttonSearch: '#button-search',
buttonRemove: '#button-remove',
buttonClearAll: '#button-clearall',
- paginationSelect: '#pagination-select'
+ paginationSelect: '#pagination-select',
+ filtersDropdown: '#filter-inputs-dropdown-btn',
};
BehaviorTable.prototype.events = {
'click @ui.paginationPrevious': '_handlePaginationPrevious',
@@ -644,12 +681,14 @@ BehaviorTable.prototype.events = {
'click @ui.paginationFirst': '_handlePaginationFirst',
'click @ui.paginationLast': '_handlePaginationLast',
'click th': '_handleSort',
+ 'click @ui.buttonAddFilter': '_handleButtonAddFilter',
'click @ui.buttonSearch': '_handleSearch',
'click @ui.buttonRemove': '_handleButtonRemove',
'click @ui.buttonClearAll': '_handleButtonClearAll',
'click tbody tr': '_handleLeftClickRow',
'contextmenu tbody tr': '_handleRowRightClick',
- 'change @ui.paginationSelect': '_handlePaginationSelect'
+ 'change @ui.paginationSelect': '_handlePaginationSelect',
+ 'click @ui.filtersDropdown': '_handleFiltersDropdown',
};
BehaviorTable.prototype.options = {
'templateControl': '#template-table_control',
diff --git a/rodan-client/code/src/js/Collections/BaseCollection.js b/rodan-client/code/src/js/Collections/BaseCollection.js
index 7863ae999..661dda7e6 100644
--- a/rodan-client/code/src/js/Collections/BaseCollection.js
+++ b/rodan-client/code/src/js/Collections/BaseCollection.js
@@ -275,6 +275,7 @@ export default class BaseCollection extends Backbone.Collection
var models = this.models.slice();
models[index1] = models.splice(index2, 1, models[index1])[0];
this.set(models);
+ this.trigger('sort', this, {});
}
}
diff --git a/rodan-client/code/src/js/Configuration.js b/rodan-client/code/src/js/Configuration.js
index 9ee01a182..9a005a15a 100644
--- a/rodan-client/code/src/js/Configuration.js
+++ b/rodan-client/code/src/js/Configuration.js
@@ -73,8 +73,8 @@ var Configuration = {
// Interval (in milliseconds) that the RunJob controller will use to reacquire interactive locks.
RUNJOB_ACQUIRE_INTERVAL: 5000,
- // Time (in miliseconds) that the client will wait before submitting a search.
- SEARCH_DEBOUNCE_DELAY: 400,
+ // Default debounce delay in milliseconds.
+ DEBOUNCE_DELAY: 400,
///////////////////////////////////////////////////////////////////////////////////////
// DON'T EDIT BELOW THIS LINE (unless you know what you're doing)
@@ -109,8 +109,8 @@ var Configuration = {
*/
Configuration.getServerURL = function()
{
- var url = this.SERVER_HOST + ':' + this.SERVER_PORT;
- return this.SERVER_HTTPS ? 'https://' + url : 'http://' + url;
+ var url = (this.SERVER_HTTPS ? 'https://' : 'http://') + this.SERVER_HOST + '/api/';
+ return url;
};
/**
diff --git a/rodan-client/code/src/js/Controllers/ControllerAuthentication.js b/rodan-client/code/src/js/Controllers/ControllerAuthentication.js
index 333f6274d..19e3605c9 100644
--- a/rodan-client/code/src/js/Controllers/ControllerAuthentication.js
+++ b/rodan-client/code/src/js/Controllers/ControllerAuthentication.js
@@ -4,6 +4,7 @@ import Cookie from 'js/Shared/Cookie';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';
import User from 'js/Models/User';
+import ViewActivationRequired from '../Views/Master/Main/Login/ViewActivationRequired';
/**
* Controls authentication.
@@ -55,7 +56,11 @@ export default class ControllerAuthentication extends BaseController
{
oldOnBeforeSend(xhr);
}
- xhr.setRequestHeader('X-CSRFToken', that._token.value);
+ if (that._token.value)
+ {
+ xhr.setRequestHeader('X-CSRFToken', that._token.value);
+ }
+
};
}
else if(Configuration.SERVER_AUTHENTICATION_TYPE === 'token')
@@ -66,7 +71,10 @@ export default class ControllerAuthentication extends BaseController
{
oldOnBeforeSend(xhr);
}
- xhr.setRequestHeader('Authorization', 'Token ' + that._token.value);
+ if (that._token.value)
+ {
+ xhr.setRequestHeader('Authorization', 'Token ' + that._token.value);
+ }
};
}
}
@@ -81,8 +89,19 @@ export default class ControllerAuthentication extends BaseController
{
Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_SAVED, (options) => this._handleEventGeneric(options));
Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_CHANGED_PASSWORD, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_REQUESTED, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_CONFIRMED, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_REGISTERED, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_ACTIVATED, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_RESENT_ACTIVATION_EMAIL, (options) => this._handleEventGeneric(options));
+ Radio.channel('rodan').on(RODAN_EVENTS.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED, (options) => this._handleActivationRequired(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_CHANGE_PASSWORD, (options) => this._handleRequestChangePassword(options));
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD, (options) => this._handleRequestResetPassword(options));
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD_CONFIRM, (options) => this._handleRequestResetPasswordConfirm(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_SAVE, (options) => this._handleRequestSaveUser(options));
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_REGISTER, (options) => this._handleRequestRegister(options));
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_ACTIVATE_ACCOUNT, (options) => this._handleRequestActivateAccount(options));
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__USER_RESEND_ACTIVATION, (options) => this._handleResendActivationEmail(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__AUTHENTICATION_USER, () => this._handleRequestUser());
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__AUTHENTICATION_LOGIN, options => this._login(options));
@@ -93,7 +112,7 @@ export default class ControllerAuthentication extends BaseController
/**
* Handle authentication response.
*/
- _handleAuthenticationResponse(event)
+ _handleAuthenticationResponse(event, email)
{
var request = event.currentTarget;
if (request.responseText === null)
@@ -119,8 +138,7 @@ export default class ControllerAuthentication extends BaseController
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_LOGINREQUIRED);
break;
case 403:
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SYSTEM_HANDLE_ERROR, {response: request});
- Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_LOGINREQUIRED);
+ Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED, {email});
break;
default:
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SYSTEM_HANDLE_ERROR, {response: request});
@@ -200,7 +218,7 @@ export default class ControllerAuthentication extends BaseController
var authRoute = this._getAuthenticationRoute();
var authType = Configuration.SERVER_AUTHENTICATION_TYPE;
var request = new XMLHttpRequest();
- request.onload = (event) => this._handleAuthenticationResponse(event);
+ request.onload = (event) => this._handleAuthenticationResponse(event, options.email);
request.ontimeout = (event) => this._handleTimeout(event);
request.open('POST', authRoute, true);
if (authType === 'session')
@@ -234,11 +252,11 @@ export default class ControllerAuthentication extends BaseController
*/
_setAuthenticationData(request)
{
- if (Configuration.SERVER_AUTHENTICATION_TYPE === 'token')
+ if (Configuration.SERVER_AUTHENTICATION_TYPE === 'token' && this._token.value)
{
request.setRequestHeader('Authorization', 'Token ' + this._token.value);
}
- else if (Configuration.SERVER_AUTHENTICATION_TYPE === 'session')
+ else if (Configuration.SERVER_AUTHENTICATION_TYPE === 'session' && this._token.value)
{
request.withCredentials = true;
request.setRequestHeader('X-CSRFToken', this._token.value);
@@ -347,6 +365,36 @@ export default class ControllerAuthentication extends BaseController
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, {title: 'Saving password', content: 'Please wait...'});
}
+ _handleRequestResetPassword(options)
+ {
+ const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-reset-password');
+ const ajaxSettings = {
+ success: (response) => this._handleRequestPasswordResetSuccess(response),
+ type: 'POST',
+ url: route,
+ data: { email: options.email }
+ };
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Requesting password reset', content: 'Please wait...'});
+ }
+
+ /**
+ * Handles password reset confirmation.
+ */
+ _handleRequestResetPasswordConfirm(options)
+ {
+ const route = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-reset-password-confirm');
+ const ajaxSettings = {
+ success: (response) => this._handleResetPasswordConfirmationSuccess(response),
+ error: (response) => this._handleResetPasswordConfirmationError(response),
+ type: 'POST',
+ url: route,
+ data: { uid: options.uid, token: options.token, new_password: options.new_password }
+ };
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Resetting password', content: 'Please wait...'});
+ }
+
/**
* Handle response from saving user.
*/
@@ -373,4 +421,145 @@ export default class ControllerAuthentication extends BaseController
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_CHANGED_PASSWORD);
}
+
+ /**
+ * Handle reset password request success
+ */
+ _handleRequestPasswordResetSuccess(response)
+ {
+ Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_REQUESTED);
+ }
+
+ /**
+ * Handle reset password confirm success.
+ */
+ _handleResetPasswordConfirmationSuccess(response)
+ {
+ Backbone.history.navigate('');
+ Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__USER_PASSWORD_RESET_CONFIRMED);
+ }
+
+ /**
+ * Handle error response from reset password attempt.
+ */
+ _handleResetPasswordConfirmationError(response)
+ {
+ const errors = Object.values(response.responseJSON);
+ const content = errors.flat().join(" ");
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content });
+ }
+
+ /**
+ * Handles registration request.
+ */
+ _handleRequestRegister(options)
+ {
+ const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, 'auth-register');
+ const ajaxSettings = {
+ success: (response) => this._handleRequestRegisterSuccess(response),
+ error: (response) => this._handleRequestRegisterError(response),
+ type: "POST",
+ url: route,
+ data: { first_name: options.firstName, last_name: options.lastName, username: options.username, email: options.email, password: options.password }
+ };
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: 'Registering', content: 'Please wait...'});
+ }
+
+ /**
+ * Handle success response from register attempt.
+ */
+ _handleRequestRegisterSuccess(response)
+ {
+ Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_REGISTERED);
+ }
+
+ /**
+ * Handle error response from register attempt.
+ */
+ _handleRequestRegisterError(response)
+ {
+ const errors = response.responseJSON;
+ Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_REGISTER_ERROR, { errors });
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: "An error occured during registration." });
+ }
+
+ /**
+ * Handles request to activate account.
+ */
+ _handleRequestActivateAccount(options)
+ {
+ const { uid, token } = options;
+ const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, "auth-activate");
+ const ajaxSettings = {
+ success: (response) => this._handleRequestActivateAccountSuccess(response),
+ error: (response) => this._handleRequestActivateAccountError(response),
+ type: "POST",
+ url: route,
+ data: { uid, token }
+ };
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: "Activate Account", content: "Activating your account..." });
+ }
+
+ /**
+ * Handle success response from activate account.
+ */
+ _handleRequestActivateAccountSuccess(response)
+ {
+ Backbone.history.navigate("");
+ Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_ACTIVATED);
+ }
+
+ /**
+ * Handles error response from activate account.
+ */
+ _handleRequestActivateAccountError(response)
+ {
+ const error = response.responseJSON.detail;
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: error });
+ }
+
+ /**
+ * Shows activation required modal.
+ */
+ _handleActivationRequired(options)
+ {
+ const view = new ViewActivationRequired(options);
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Activation Required", content: view });
+ }
+
+ /**
+ * Requests new activation email.
+ */
+ _handleResendActivationEmail(options)
+ {
+ const route = Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_GET_ROUTE, "auth-resend-activation");
+ const ajaxSettings = {
+ success: (response) => this._handleResendActivationEmailSuccess(response),
+ error: (response) => this._handleResendActivationEmailError(response),
+ type: "POST",
+ url: route,
+ data: { email: options.email }
+ };
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, { title: "Resending Activation Email", content: "Please wait..." });
+ }
+
+ /**
+ * Handle success response from resend activation email.
+ */
+ _handleResendActivationEmailSuccess(response)
+ {
+ Radio.channel("rodan").trigger(RODAN_EVENTS.EVENT__USER_RESENT_ACTIVATION_EMAIL);
+ }
+
+ /**
+ * Handle error response from resend activation email.
+ */
+ _handleResendActivationEmailError(response)
+ {
+ const error = response.status === 400 ? "Invalid username." : "An error occured while resending activation email.";
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_ERROR, { content: error });
+ }
}
diff --git a/rodan-client/code/src/js/Controllers/ControllerContextMenu.js b/rodan-client/code/src/js/Controllers/ControllerContextMenu.js
index 989364838..672cca735 100644
--- a/rodan-client/code/src/js/Controllers/ControllerContextMenu.js
+++ b/rodan-client/code/src/js/Controllers/ControllerContextMenu.js
@@ -51,10 +51,10 @@ export default class ControllerContextMenu extends BaseController
Radio.channel(channel).request(data.request, data.options);
};
- var anchor = $('' + label + ' ');
+ var anchor = $('' + label + ' ');
anchor.data('radio', {request: radiorequest, options: callOptions});
anchor.click(functionCall);
- $('#menu-context').append($('
').append(anchor));
+ $('#menu-context').append(anchor);
}
$('#menu-context').css('top', options.top);
$('#menu-context').css('left', options.left);
diff --git a/rodan-client/code/src/js/Controllers/ControllerModal.js b/rodan-client/code/src/js/Controllers/ControllerModal.js
index 41e3b7ed1..00c0328d4 100644
--- a/rodan-client/code/src/js/Controllers/ControllerModal.js
+++ b/rodan-client/code/src/js/Controllers/ControllerModal.js
@@ -46,7 +46,7 @@ export default class ControllerModal extends BaseController
{
var $modalElement = $('#modal-generic');
$('.modal-footer').removeClass('modal-footer-error');
- $modalElement.modal('hide');
+ $modalElement.hide();
this._waiting = false;
}
@@ -55,7 +55,9 @@ export default class ControllerModal extends BaseController
*/
_handleRequestModalShow(options)
{
+ console.log(options);
var $modalEl = $('#modal-generic');
+ console.log($modalEl);
if ($modalEl.is(':visible'))
{
return;
@@ -63,27 +65,28 @@ export default class ControllerModal extends BaseController
if (typeof options.content == 'string')
{
- this._layoutViewModal = new Marionette.View({template: _.template($('#template-modal_simple').text())});
+ this._layoutViewModal = new Marionette.View({ template: _.template($('#template-modal_simple').text()) });
+ this._layoutViewModal.setElement('
');
this._layoutViewModal.render();
- $modalEl.css({top: 0, left: 0, position: 'absolute'});
$modalEl.html(this._layoutViewModal.el);
$('.modal-title').text(options.title);
$('.modal-body').append(options.content);
- $modalEl.modal({backdrop: 'static', keyboard: false});
+ $('#modal-close').on('click', () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_HIDE));
+ $modalEl.show();
}
else
{
- this._layoutViewModal = new Marionette.View({template: _.template($('#template-modal').text())});
+ this._layoutViewModal = new Marionette.View({ template: _.template($('#template-modal').text()) });
+ this._layoutViewModal.setElement('
');
this._layoutViewModal.addRegions({modal_body: '#region-modal_body'});
this._layoutViewModal.render();
this._layoutViewModal.showChildView('modal_body', options.content);
- $modalEl.css({top: 0, left: 0, position: 'absolute'});
$modalEl.html(this._layoutViewModal.el);
- $modalEl.draggable({handle: '.modal-header'});
$('.modal-title').text(options.title);
- $modalEl.modal({backdrop: 'static'});
+ $('#modal-close').on('click', () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_HIDE));
+ $modalEl.show();
}
}
@@ -97,6 +100,7 @@ export default class ControllerModal extends BaseController
if ($modalEl.is(':visible'))
{
$('.modal-footer').text(options.title + ': ' + options.content);
+ $('.modal-footer').removeClass('modal-footer-error');
}
else
{
@@ -118,7 +122,7 @@ export default class ControllerModal extends BaseController
}
else
{
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: 'ERROR', content: options.content});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: options.title || 'Error', content: options.content});
}
$('.modal-footer').addClass('modal-footer-error');
}
diff --git a/rodan-client/code/src/js/Controllers/ControllerProject.js b/rodan-client/code/src/js/Controllers/ControllerProject.js
index e1779e820..e96609a57 100644
--- a/rodan-client/code/src/js/Controllers/ControllerProject.js
+++ b/rodan-client/code/src/js/Controllers/ControllerProject.js
@@ -3,7 +3,6 @@ import _ from 'underscore';
import BaseController from './BaseController';
import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection';
import BaseViewCollectionItem from 'js/Views/Master/Main/BaseViewCollectionItem';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import LayoutViewProjectUsers from 'js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers';
import Project from 'js/Models/Project';
import Radio from 'backbone.radio';
@@ -98,6 +97,7 @@ export default class ControllerProject extends BaseController
var collection = new UserCollection();
collection.fetch();
var userSelectionView = new BaseViewCollection({collection: collection,
+ el: '
',
template: _.template($('#template-main_user_selection').text()),
childView: BaseViewCollectionItem,
childViewContainer: 'select',
@@ -188,13 +188,14 @@ export default class ControllerProject extends BaseController
{
this._activeProject = options.project;
this._activeProject.fetch();
+
+ // default collection inside project view is the workflowrun collection
var collection = new WorkflowRunCollection();
collection.fetch({data: {project: this._activeProject.id}});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [collection]});
- var layoutView = new LayoutViewModel({template: _.template($('#template-main_layoutview_model_inverse').text())});
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: layoutView});
- layoutView.showItem(new ViewProject({model: this._activeProject}));
- layoutView.showCollection(new ViewWorkflowRunCollection({collection: collection}));
+ var viewProject = new ViewProject({model: this._activeProject});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: viewProject, options: {project: this._activeProject}});
+ viewProject.showCollection(new ViewWorkflowRunCollection({collection: collection}));
}
/**
diff --git a/rodan-client/code/src/js/Controllers/ControllerResource.js b/rodan-client/code/src/js/Controllers/ControllerResource.js
index ce6dfcea8..90a649c94 100644
--- a/rodan-client/code/src/js/Controllers/ControllerResource.js
+++ b/rodan-client/code/src/js/Controllers/ControllerResource.js
@@ -2,7 +2,6 @@ import $ from 'jquery';
import _ from 'underscore';
import BaseController from './BaseController';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import Radio from 'backbone.radio';
import Resource from 'js/Models/Resource';
import ResourceCollection from 'js/Collections/ResourceCollection';
@@ -10,6 +9,7 @@ import ViewResource from 'js/Views/Master/Main/Resource/Individual/ViewResource'
import ViewResourceMulti from 'js/Views/Master/Main/Resource/Individual/ViewResourceMulti';
import ViewResourceCollection from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollection';
import ViewResourceCollectionItem from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollectionItem';
+import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject';
/**
* Controller for Resources.
@@ -36,11 +36,11 @@ export default class ControllerResource extends BaseController
Radio.channel('rodan').on(RODAN_EVENTS.EVENT__RESOURCE_SAVED, options => this._handleSuccessGeneric(options));
// Requests
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, options => this._handleCommandShowLayoutView(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_CREATE, options => this._handleRequestResourceCreate(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_DELETE, options => this._handleCommandResourceDelete(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_DOWNLOAD, options => this._handleRequestResourceDownload(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SAVE, options => this._handleCommandResourceSave(options));
- Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, options => this._handleCommandShowLayoutView(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCE_VIEWER_ACQUIRE, options => this._handleRequestViewer(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, options => this._handleRequestResources(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__RESOURCES_LOAD_NO_PAGE, options => this._handleRequestResourcesNoPagination(options));
@@ -52,7 +52,7 @@ export default class ControllerResource extends BaseController
*/
_handleCommandShowLayoutView(options)
{
- this._layoutView = options.layoutView;
+ this._projectView = options.projectView;
}
/**
@@ -60,16 +60,18 @@ export default class ControllerResource extends BaseController
*/
_handleEventCollectionSelected(options)
{
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD_NO_PAGE, {data: {project: options.project.id}});
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, {data: {project: options.project.id}});
+ this._collection = new ResourceCollection();
+ this._collection.fetch({data: {project: options.project.id}});
+
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]});
- this._layoutView = new LayoutViewModel();
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView});
- var view = new ViewResourceCollection({collection: this._collection,
- template: _.template($('#template-main_resource_collection').text()),
- childView: ViewResourceCollectionItem,
- model: options.project});
- this._layoutView.showCollection(view);
+
+ const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+ this._projectView = new ViewProject({model: activeProject});
+
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView});
+
+ this._viewCollection = new ViewResourceCollection({collection: this._collection});
+ this._projectView.showCollection(this._viewCollection);
}
/**
@@ -100,13 +102,13 @@ export default class ControllerResource extends BaseController
}
if (this._selectedResources.size === 0) {
- this._layoutView.clearItemView();
+ this._projectView.clearCollectionItemInfoView();
}
else if (this._selectedResources.size === 1) {
- this._layoutView.showItem(new ViewResource({model: this._selectedResources.values().next().value}));
+ this._projectView.showCollectionItemInfo(new ViewResource({model: this._selectedResources.values().next().value}));
}
else {
- this._layoutView.showItem(new ViewResourceMulti({models: this._selectedResources}));
+ this._projectView.showCollectionItemInfo(new ViewResourceMulti({models: this._selectedResources}));
}
}
@@ -140,7 +142,7 @@ export default class ControllerResource extends BaseController
_handleCommandResourceDelete(options)
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW_IMPORTANT, {title: 'Deleting Resource', content: 'Please wait...'});
- this._layoutView.clearItemView();
+ this._projectView.clearCollectionItemInfoView();
options.resource.destroy({success: (model) => this._handleDeleteSuccess(model, this._collection)});
}
@@ -241,7 +243,7 @@ export default class ControllerResource extends BaseController
* Handle delete success.
*/
_handleDeleteSuccess(model, collection)
- {
+ {
collection.remove(model);
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_DELETED, {resource: model});
}
diff --git a/rodan-client/code/src/js/Controllers/ControllerResourceList.js b/rodan-client/code/src/js/Controllers/ControllerResourceList.js
index 93fe99090..b95ba35ef 100644
--- a/rodan-client/code/src/js/Controllers/ControllerResourceList.js
+++ b/rodan-client/code/src/js/Controllers/ControllerResourceList.js
@@ -2,7 +2,6 @@ import $ from 'jquery';
import _ from 'underscore';
import BaseController from './BaseController';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import LayoutViewResourceAssignment from 'js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment';
import Radio from 'backbone.radio';
import ResourceCollection from 'js/Collections/ResourceCollection';
diff --git a/rodan-client/code/src/js/Controllers/ControllerRunJob.js b/rodan-client/code/src/js/Controllers/ControllerRunJob.js
index df092e119..8e343f6f1 100644
--- a/rodan-client/code/src/js/Controllers/ControllerRunJob.js
+++ b/rodan-client/code/src/js/Controllers/ControllerRunJob.js
@@ -3,12 +3,12 @@ import _ from 'underscore';
import BaseController from './BaseController';
import Configuration from 'js/Configuration';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import Radio from 'backbone.radio';
import RunJobCollection from 'js/Collections/RunJobCollection';
import ViewRunJob from 'js/Views/Master/Main/RunJob/Individual/ViewRunJob';
import ViewRunJobCollection from 'js/Views/Master/Main/RunJob/Collection/ViewRunJobCollection';
import ViewRunJobCollectionItem from 'js/Views/Master/Main/RunJob/Collection/ViewRunJobCollectionItem';
+import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject';
/**
* Controller for RunJobs.
@@ -47,7 +47,7 @@ export default class ControllerRunJob extends BaseController
*/
_handleCommandShowLayoutView(options)
{
- this._layoutView = options.layoutView;
+ this._projectView = options.projectView;
}
/**
@@ -55,7 +55,7 @@ export default class ControllerRunJob extends BaseController
*/
_handleEventItemSelected(options)
{
- this._layoutView.showItem(new ViewRunJob({model: options.runjob}));
+ this._projectView.showCollectionItemInfo(new ViewRunJob({model: options.runjob}));
}
/**
@@ -66,12 +66,13 @@ export default class ControllerRunJob extends BaseController
this._collection = new RunJobCollection();
this._collection.fetch({data: {project: options.project.id}});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]});
- this._layoutView = new LayoutViewModel();
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView});
+ const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+ this._projectView = new ViewProject({model: activeProject});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView});
var view = new ViewRunJobCollection({collection: this._collection,
template: _.template($('#template-main_runjob_collection').text()),
childView: ViewRunJobCollectionItem});
- this._layoutView.showCollection(view);
+ this._projectView.showCollection(view);
}
/**
diff --git a/rodan-client/code/src/js/Controllers/ControllerServer.js b/rodan-client/code/src/js/Controllers/ControllerServer.js
index 189058a66..087039b38 100644
--- a/rodan-client/code/src/js/Controllers/ControllerServer.js
+++ b/rodan-client/code/src/js/Controllers/ControllerServer.js
@@ -49,6 +49,8 @@ export default class ControllerServer extends BaseController
oldOnBeforeSend(xhr);
}
+ xhr.setRequestHeader('Accept', 'application/json');
+
// Set a timeout for x seconds.
if (that._responseTimeout === null)
{
@@ -363,4 +365,4 @@ export default class ControllerServer extends BaseController
var ajaxSettings = this._applyAJAXResponseHandlers(options.settings);
$.ajax(ajaxSettings);
}
-}
\ No newline at end of file
+}
diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflow.js b/rodan-client/code/src/js/Controllers/ControllerWorkflow.js
index 67252df73..2184b38ba 100644
--- a/rodan-client/code/src/js/Controllers/ControllerWorkflow.js
+++ b/rodan-client/code/src/js/Controllers/ControllerWorkflow.js
@@ -1,11 +1,11 @@
import BaseController from './BaseController';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import Radio from 'backbone.radio';
import ViewWorkflow from 'js/Views/Master/Main/Workflow/Individual/ViewWorkflow';
import ViewWorkflowCollection from 'js/Views/Master/Main/Workflow/Collection/ViewWorkflowCollection';
import Workflow from 'js/Models/Workflow';
import WorkflowCollection from 'js/Collections/WorkflowCollection';
+import ViewProject from 'js/Views/Master/Main/Project/Individual/ViewProject';
/**
* Controller for Workflows.
@@ -46,10 +46,11 @@ export default class ControllerWorkflow extends BaseController
this._collection = new WorkflowCollection();
this._collection.fetch({data: {project: options.project.id}});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [this._collection]});
- this._layoutView = new LayoutViewModel();
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._layoutView});
+ const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+ this._projectView = new ViewProject({model: activeProject});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView});
this._viewCollection = new ViewWorkflowCollection({collection: this._collection});
- this._layoutView.showCollection(this._viewCollection);
+ this._projectView.showCollection(this._viewCollection);
}
/**
@@ -58,7 +59,7 @@ export default class ControllerWorkflow extends BaseController
_handleEventItemSelected(options)
{
this._viewItem = new ViewWorkflow({model: options.workflow});
- this._layoutView.showItem(this._viewItem);
+ this._projectView.showCollectionItemInfo(this._viewItem);
}
/**
@@ -70,7 +71,7 @@ export default class ControllerWorkflow extends BaseController
// Clear the individual view (if there).
if (this._viewItem !== null && options.workflow === this._viewItem.model)
{
- this._layoutView.clearItemView();
+ this._projectView.clearItemView();
}
options.workflow.destroy({success: (model) => this._handleDeleteSuccess(model, this._collection)});
}
diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js
index b98096317..8c15e3e8e 100644
--- a/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js
+++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowBuilder.js
@@ -40,9 +40,11 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
initialize()
{
- this._resourceAssignments = []; // this helps manage the list of resource assignments while building the resource
+ this._workflow = null;
+ this._resourceAssignments = {}; // this helps manage the list of resource assignments while building the resource
this._resourcesAvailable = []; // this is just a cache for resources that will work with a given input port
this._workflowRunOptions = {};
+ this._debouncedSave = _.debounce(this._saveResourceAssignments, Configuration.DEBOUNCE_DELAY);
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -86,6 +88,7 @@ export default class ControllerWorkflowBuilder extends BaseController
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_UNGROUP_WORKFLOWJOBGROUP, options => this._handleRequestWorkflowJobGroupUngroup(options), this);
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, options => this._handleRequestValidateWorkflow(options), this);
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS, options => this._handleRequestGetSatisfyingInputPorts(options), this);
+ Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, options => this._handleRequestClearResourceAssignments(options), this);
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -96,12 +99,45 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleEventBuilderSelected(options)
{
- this._resourceAssignments = [];
+ this._workflow = options.workflow;
+ this._resourceAssignments = {};
this._resourcesAvailable = [];
this._addPorts = true;
+ this._fetchResourceAssignments();
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_LOAD_WORKFLOW, {'workflow': options.workflow});
}
+ /**
+ * Fetches all resource assignments for this workflow, creates a ResourceCollection for
+ * each InputPort, and adds listeners to each ResourceCollection to save when changed.
+ */
+ _fetchResourceAssignments()
+ {
+ const ajaxSettings = {
+ url: this._workflow.get('url') + 'resourceassignments/',
+ method: 'GET',
+ dataType: 'json',
+ success: (response) => {
+ Object.entries(response).forEach(([url, resources]) => {
+ response[url] = this._createResourceAssignmentCollection(resources)
+ });
+ this._resourceAssignments = response;
+ }
+ }
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ }
+
+ /**
+ * Creates a new collection for the given InputPort and list of resources
+ * and binds a listener to the collection to save when changed.
+ */
+ _createResourceAssignmentCollection(resources)
+ {
+ const collection = new ResourceCollection(resources);
+ collection.on('all', () => this._debouncedSave());
+ return collection;
+ }
+
/**
* Handle request set add ports.
*/
@@ -118,7 +154,7 @@ export default class ControllerWorkflowBuilder extends BaseController
this._workflowRunOptions = {workflow: options.workflow, assignments: {}};
var inputPortTypes = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_INPUTPORTTYPE_COLLECTION);
var knownInputPorts = this._workflowRunOptions.workflow.get('workflow_input_ports').clone();
- for (var inputPortUrl in this._resourceAssignments)
+ for (const inputPortUrl of Object.keys(this._resourceAssignments))
{
// If our assignments for an InputPort are not needed, we just skip it.
var inputPort = knownInputPorts.findWhere({url: inputPortUrl});
@@ -175,6 +211,14 @@ export default class ControllerWorkflowBuilder extends BaseController
}
}
+ /**
+ * Handle request to clear all input port resource assignments.
+ */
+ _handleRequestClearResourceAssignments(options)
+ {
+ Object.values(this._resourceAssignments).forEach(collection => collection.reset());
+ }
+
/**
* Handle request show Resource assignment view.
*/
@@ -208,7 +252,7 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleWorkflowLoadSuccess(workflow)
{
- this._processWorkflow(workflow);
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_LOAD_COLLECTION, {workflow: workflow});
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOWBUILDER_LOADED_WORKFLOW, {workflow: workflow});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow});
}
@@ -229,8 +273,7 @@ export default class ControllerWorkflowBuilder extends BaseController
_handleRequestDeleteWorkflowJob(options)
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOB_DELETE, {workflowjob: options.workflowjob, workflow: options.workflow});
- Radio.channel('rodan').once(RODAN_EVENTS.EVENT__WORKFLOWJOB_DELETED,
- () => Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: options.workflow}));
+ Radio.channel('rodan').once(RODAN_EVENTS.EVENT__WORKFLOWJOB_DELETED, () => this._handleWorkflowJobDeletionSuccess(options.workflowjob, options.workflow));
}
/**
@@ -361,13 +404,32 @@ export default class ControllerWorkflowBuilder extends BaseController
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_CREATE, {workflowjobs: options.workflowjobs, workflow: options.workflow});
}
+ /**
+ * Save resource assignments.
+ */
+ _saveResourceAssignments()
+ {
+ const data = {};
+ Object.entries(this._resourceAssignments).forEach(([url, resources]) => {
+ data[url] = resources.models.map(resource => resource.get('url'));
+ });
+
+ const ajaxSettings = {
+ url: this._workflow.get('url') + 'resourceassignments/',
+ type: 'PUT',
+ contentType: 'application/json',
+ data: JSON.stringify(data),
+ };
+
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_REQUEST_AJAX, { settings: ajaxSettings });
+ }
+
/**
* Handle request assign Resource to InputPort.
*/
_handleRequestAssignResource(options)
{
- var url = options.inputport.get('url');
- var resourcesAssigned = this._getResourceAssignments(url);
+ var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url'));
resourcesAssigned.add(options.resource);
}
@@ -385,8 +447,7 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleMoveUpAssignedResource(options)
{
- var url = options.inputport.get('url');
- var resourcesAssigned = this._getResourceAssignments(url);
+ var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url'));
var index1 = resourcesAssigned.indexOf(options.resource);
var index2 = Math.max(0, index1 - 1);
resourcesAssigned.swapItems(index1, index2);
@@ -397,8 +458,7 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleMoveDownAssignedResource(options)
{
- var url = options.inputport.get('url');
- var resourcesAssigned = this._getResourceAssignments(url);
+ var resourcesAssigned = this._getResourceAssignments(options.inputport.get('url'));
var index1 = resourcesAssigned.indexOf(options.resource);
var index2 = Math.min(index1 + 1, resourcesAssigned.length - 1);
resourcesAssigned.swapItems(index1, index2);
@@ -541,6 +601,7 @@ export default class ControllerWorkflowBuilder extends BaseController
{
workflow.get('workflow_input_ports').add(model);
workflowJob.get('input_ports').add(model);
+ this._resourceAssignments[model.get('url')] = this._createResourceAssignmentCollection();
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow});
}
@@ -563,7 +624,7 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleConnectionCreationSuccess(model, workflow, inputPort, outputPort)
{
- workflow.get('connections').add(model);
+ workflow.get('workflow_connections').add(model);
inputPort.fetch(); // to get populated Connection array
outputPort.fetch(); // to get populated Connection array
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow});
@@ -575,6 +636,7 @@ export default class ControllerWorkflowBuilder extends BaseController
_handleInputPortDeletionSuccess(model, workflow, workflowJob)
{
workflowJob.get('input_ports').remove(model);
+ delete this._resourceAssignments[model.get('url')];
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow});
}
@@ -592,10 +654,19 @@ export default class ControllerWorkflowBuilder extends BaseController
*/
_handleConnectionDeletionSuccess(model, workflow)
{
- workflow.get('connections').remove(model);
+ workflow.get('workflow_connections').remove(model);
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow});
}
+ /**
+ * Handle WorkflowJob deletion success.
+ */
+ _handleWorkflowJobDeletionSuccess(model, workflow)
+ {
+ model.get("input_ports").forEach((inputPort) => delete this._resourceAssignments[inputPort.get('url')]);
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_VALIDATE_WORKFLOW, {workflow: workflow})
+ }
+
/**
* Handle validation failure.
*/
@@ -617,106 +688,6 @@ export default class ControllerWorkflowBuilder extends BaseController
connection.save({}, {success: (model) => this._handleConnectionCreationSuccess(model, workflow, inputPort, outputPort)});
}
- /**
- * Process workflow for GUI.
- */
- _processWorkflow(workflow)
- {
- // Process all WorkflowJobs and their associated ports.
- var connections = {};
- var workflowJobs = workflow.get('workflow_jobs');
- if (workflowJobs !== undefined)
- {
- for (var i = 0; i < workflowJobs.length; i++)
- {
- // Create WorkflowJob item then process connections.
- var workflowJob = workflowJobs.at(i);
- var tempConnections = this._processWorkflowJob(workflowJob);
-
- // For the connections returned, merge them into our master list.
- for (var connectionUrl in tempConnections)
- {
- var connection = tempConnections[connectionUrl];
- if (connections.hasOwnProperty(connectionUrl))
- {
- connections[connectionUrl].inputPort =
- connections[connectionUrl].inputPort === null ? connection.inputPort : connections[connectionUrl].inputPort;
- connections[connectionUrl].outputPort =
- connections[connectionUrl].outputPort === null ? connection.outputPort : connections[connectionUrl].outputPort;
- }
- else
- {
- connections[connectionUrl] = connection;
- }
- }
- }
- }
-
- // Process connections.
- for (var connectionUrl in connections)
- {
- var connection = connections[connectionUrl];
- var connectionId = BaseModel.parseIdFromUrl(connectionUrl);
- var connectionModel = new Connection({
- input_port: connection.inputPort.get('url'),
- output_port: connection.outputPort.get('url'),
- url: connectionUrl,
- uuid: connectionId
- });
- workflow.get('connections').add(connectionModel);
- }
-
- // Finally inport the WorkflowJobGroups.
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWJOBGROUP_LOAD_COLLECTION, {workflow: workflow});
- }
-
- /**
- * Process workflow job for GUI.
- */
- _processWorkflowJob(model)
- {
- // We want to keep track of what connections need to be made and return those.
- var connections = {};
-
- // Process input ports.
- var inputPorts = model.get('input_ports');
- if (inputPorts !== undefined)
- {
- for (var i = 0; i < inputPorts.length; i++)
- {
- var inputPort = inputPorts.at(i);
-
- // Get connections.
- var inputPortConnections = inputPort.get('connections');
- for (var k = 0; k < inputPortConnections.length; k++)
- {
- var connection = inputPortConnections[k];
- connections[connection] = {'inputPort': inputPort, 'outputPort': null};
- }
- }
- }
-
- // Process output ports.
- var outputPorts = model.get('output_ports');
- if (outputPorts !== undefined)
- {
- for (var j = 0; j < outputPorts.length; j++)
- {
- var outputPort = outputPorts.at(j);
-
- // Get connections.
- var outputPortConnections = outputPort.get('connections');
- for (var k = 0; k < outputPortConnections.length; k++)
- {
- var connection = outputPortConnections[k];
- connections[connection] = {'inputPort': null, 'outputPort': outputPort};
- }
- }
- }
-
- return connections;
- }
-
/**
* Attempts to validate Workflow.
*/
@@ -800,24 +771,6 @@ export default class ControllerWorkflowBuilder extends BaseController
return satisfiableJobs;
}
- /**
- * DEPRECATED
- * Return InputPort URL that has multiple assignments.
- * Returns null if DNE.
- */
- _getInputPortURLWithMultipleAssignments()
- {
- for (var inputPortUrl in this._resourceAssignments)
- {
- var resourceAssignments = this._getResourceAssignments(inputPortUrl);
- if (resourceAssignments.length > 1)
- {
- return inputPortUrl;
- }
- }
- return null;
- }
-
/**
* Returns resource assignment for given InputPort url.
*/
diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js
index 4e7f02ca1..4f9a6ece3 100644
--- a/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js
+++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowJobGroup.js
@@ -3,6 +3,7 @@ import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';
import WorkflowJobGroup from 'js/Models/WorkflowJobGroup';
import WorkflowJobGroupCollection from 'js/Collections/WorkflowJobGroupCollection';
+import wfbgui from 'js/WorkflowBuilderGUI';
/**
* Controller for WorkflowJobGroups.
@@ -56,7 +57,9 @@ export default class ControllerWorkflowJobGroup extends BaseController
{
urls.push(workflowJobs[index].get('url'));
}
- var workflowJobGroup = new WorkflowJobGroup({workflow_jobs: urls, workflow: workflow});
+ const boundingBox = wfbgui._getBoundingBox(workflowJobs);
+ const appearance = wfbgui._getBoundingBoxCenter(boundingBox);
+ var workflowJobGroup = new WorkflowJobGroup({ appearance, workflow_jobs: urls, workflow: workflow });
workflowJobGroup.save({}, {success: (model) => this._handleWorkflowJobGroupCreationSuccess(model)});
}
diff --git a/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js b/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js
index 90a08d6d3..8d73fdd34 100644
--- a/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js
+++ b/rodan-client/code/src/js/Controllers/ControllerWorkflowRun.js
@@ -5,6 +5,7 @@ import Radio from 'backbone.radio';
import ViewWorkflowRunCollection from 'js/Views/Master/Main/WorkflowRun/Collection/ViewWorkflowRunCollection';
import WorkflowRun from 'js/Models/WorkflowRun';
import WorkflowRunCollection from 'js/Collections/WorkflowRunCollection';
+import ViewProject from '../Views/Master/Main/Project/Individual/ViewProject';
/**
* Controller for WorkflowRun.
@@ -76,9 +77,12 @@ export default class ControllerWorkflowRun extends BaseController
var resources = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCES_LOAD, {data: {result_of_workflow_run: options.workflowrun.id}});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [runJobs, resources]});
- // Create view and show.
- this._viewItem = new LayoutViewIndividualWorkflowRun({runjobs: runJobs, resources: resources, model: options.workflowrun});
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._viewItem});
+ // Create view and show.
+ const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+ this._projectView = new ViewProject({model: activeProject});
+ this._viewItem = new LayoutViewIndividualWorkflowRun({projectView: this._projectView, activeProject: activeProject, runjobs: runJobs, resources: resources, model: options.workflowrun});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: this._projectView});
+ this._projectView.showCollection(this._viewItem);
}
/**
@@ -86,11 +90,18 @@ export default class ControllerWorkflowRun extends BaseController
*/
_handleEventCollectionSelected(options)
{
- var collection = new WorkflowRunCollection();
+ // create new worlfow run collection and populate it through a fetch
+ const collection = new WorkflowRunCollection();
collection.fetchSort(false, 'created', {data: {project: options.project.id}});
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__UPDATER_SET_COLLECTIONS, {collections: [collection]});
- var view = new ViewWorkflowRunCollection({collection: collection});
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: view});
+
+ // get active project and create project view
+ const activeProject = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
+ const projectView = new ViewProject({model: activeProject});
+
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: projectView});
+
+ projectView.showCollection(new ViewWorkflowRunCollection({collection: collection}));
}
/**
diff --git a/rodan-client/code/src/js/Controllers/ItemController.js b/rodan-client/code/src/js/Controllers/ItemController.js
index cd9d1ec38..bcfa8e7e1 100644
--- a/rodan-client/code/src/js/Controllers/ItemController.js
+++ b/rodan-client/code/src/js/Controllers/ItemController.js
@@ -21,8 +21,9 @@ class ItemController
/**
* Basic constructor
*/
- constructor()
+ constructor(options)
{
+ this._workflow = options.workflow;
this._selectedItems = {};
this._selectingMultiple = false;
this._overItem = null;
@@ -31,6 +32,7 @@ class ItemController
this._initializeRadio();
this._createSegments();
+ this._initializeItems();
}
/**
@@ -309,11 +311,47 @@ class ItemController
};
}
+ /**
+ * This creates all the items initially in the workflow.
+ */
+ _initializeItems()
+ {
+ // Initialize `WorkflowJobItem`s
+ const workflowJobs = this._workflow.get('workflow_jobs');
+ if (workflowJobs) {
+ workflowJobs.each(workflowJob => this._initializeWorkflowJobItem(workflowJob));
+ }
+
+ // Initialize `InputPortItem`s
+ const inputPorts = this._workflow.get('input_ports');
+ if (inputPorts) {
+ inputPorts.each(inputPort => this._initializeInputPortItem(inputPort));
+ }
+
+ // Initialize `OutputPortItem`s
+ const outputPorts = this._workflow.get('output_ports');
+ if (outputPorts) {
+ outputPorts.each(outputPort => this._initializeOutputPortItem(outputPort));
+ }
+
+ // Initialize `ConnectionItem`s
+ const connections = this._workflow.get('connections');
+ if (connections) {
+ connections.each(connection => this._initializeConnectionItem(connection));
+ }
+
+ // Initialize `WorkflowJobGroupItem`s
+ const workflowJobGroups = this._workflow.get('workflow_job_groups');
+ if (workflowJobGroups) {
+ workflowJobGroups.each(workflowJobGroup => this._initializeWorkflowJobGroupItem(workflowJobGroup));
+ }
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS - REST handlers
///////////////////////////////////////////////////////////////////////////////////////
/**
- * Handle event model sync.
+ * Handle event model sync. This creates new items as the workflow is updated.
*
* We check if an item exists for this model. If it does, don't do anything - the
* model will take care of itself. If it doesn't, we create a new model.
@@ -328,42 +366,24 @@ class ItemController
switch (options.model.constructor.name)
{
case 'WorkflowJob':
- {
- var item = new WorkflowJobItem({segments: this._segments.workflowJobItem, model: options.model, text: true});
+ this._initializeWorkflowJobItem(options.model);
break;
- }
-
case 'InputPort':
- {
- var item = new InputPortItem({segments: this._segments.portItem, model: options.model, workflowjoburl: options.model.get('workflow_job')});
+ this._initializeInputPortItem(options.model);
break;
- }
-
case 'OutputPort':
- {
- var item = new OutputPortItem({segments: this._segments.portItem, model: options.model, workflowjoburl: options.model.get('workflow_job')});
+ this._initializeOutputPortItem(options.model);
break;
- }
-
case 'Connection':
- {
- var item = new ConnectionItem({segments: this._segments.connection,
- model: options.model,
- inputporturl: options.model.get('input_port'),
- outputporturl: options.model.get('output_port')});
+ paper.project.layers['connections'].activate();
+ this._initializeConnectionItem(options.model);
+ paper.project.layers['default'].activate();
break;
- }
-
case 'WorkflowJobGroup':
- {
- var item = new WorkflowJobGroupItem({segments: this._segments.workflowJobItem, model: options.model, text: true});
+ this._initializeWorkflowJobGroupItem(options.model);
break;
- }
-
default:
- {
break;
- }
}
}
else if (options.options.task === 'destroy')
@@ -373,6 +393,36 @@ class ItemController
}
}
+ _initializeWorkflowJobItem(workflowJob)
+ {
+ return new WorkflowJobItem({segments: this._segments.workflowJobItem, model: workflowJob, text: true});
+ }
+
+ _initializeInputPortItem(inputPort)
+ {
+ return new InputPortItem({segments: this._segments.portItem, model: inputPort, workflowjoburl: inputPort.get('workflow_job')});
+ }
+
+ _initializeOutputPortItem(outputPort)
+ {
+ return new OutputPortItem({segments: this._segments.portItem, model: outputPort, workflowjoburl: outputPort.get('workflow_job')});
+ }
+
+ _initializeConnectionItem(connection)
+ {
+ return new ConnectionItem({
+ segments: this._segments.connection,
+ model: connection,
+ inputporturl: connection.get('input_port'),
+ outputporturl: connection.get('output_port')
+ });
+ }
+
+ _initializeWorkflowJobGroupItem(workflowJobGroup)
+ {
+ return new WorkflowJobGroupItem({segments: this._segments.workflowJobItem, model: workflowJobGroup, text: true});
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS - MouseEvent handlers
///////////////////////////////////////////////////////////////////////////////////////
diff --git a/rodan-client/code/src/js/Items/ConnectionItem.js b/rodan-client/code/src/js/Items/ConnectionItem.js
index 087fecb23..0b3d92b57 100644
--- a/rodan-client/code/src/js/Items/ConnectionItem.js
+++ b/rodan-client/code/src/js/Items/ConnectionItem.js
@@ -22,6 +22,7 @@ class ConnectionItem extends BaseItem
this.menuItems = [{label: 'Delete', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_CONNECTION, options: {connection: options.model, workflow: workflow}}];
this.strokeWidth = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].STROKE_WIDTH;
+ this.fillColor = null;
this._inputPortItem = null;
this._outputPortItem = null;
this._inputPortUrl = options.inputporturl;
@@ -37,6 +38,9 @@ class ConnectionItem extends BaseItem
this._circle.onMouseEnter = event => this._handleMouseEvent(event);
this._circle.onMouseLeave = event => this._handleMouseEvent(event);
this.addChild(this._circle);
+ this._padding = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].CONNECTION_PADDING;
+ this._offsetX = this._model.get('offset_x');
+ this._offsetY = this._model.get('offset_y');
}
/**
@@ -44,7 +48,7 @@ class ConnectionItem extends BaseItem
*/
isMoveable()
{
- return false;
+ return true;
}
/**
@@ -75,12 +79,43 @@ class ConnectionItem extends BaseItem
if (this._inputPortItem && this._outputPortItem)
{
this._circle.visible = this.visible;
- this.firstSegment.point.x = this._outputPortItem.position.x;
- this.firstSegment.point.y = this._outputPortItem.bounds.bottom;
- this.lastSegment.point.x = this._inputPortItem.position.x;
- this.lastSegment.point.y = this._inputPortItem.bounds.top;
- this._circle.position.x = this.firstSegment.point.x + ((this.lastSegment.point.x - this.firstSegment.point.x) / 2);
- this._circle.position.y = this.firstSegment.point.y + ((this.lastSegment.point.y - this.firstSegment.point.y) / 2);
+
+ this.removeSegments();
+
+ // If the input port is above the output port, we want to draw the connection in a different way using 5 line segments instead of 3.
+ if (this._inputPortItem.bounds.top < this._outputPortItem.bounds.bottom + 2 * this._padding) {
+ if (this._offsetX == null) {
+ this._circle.position.x = (this._inputPortItem.position.x + this._outputPortItem.position.x) / 2;
+ } else {
+ this._circle.position.x = this._outputPortItem.position.x + this._offsetX;
+ }
+
+ this._circle.position.y = (this._inputPortItem.position.y + this._outputPortItem.position.y) / 2;
+
+ const start = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom);
+ const p1 = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom + this._padding);
+ const p2 = new Point(this._circle.position.x, this._outputPortItem.bounds.bottom + this._padding);
+ const p3 = new Point(this._circle.position.x, this._inputPortItem.bounds.top - 5);
+ const p4 = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top - 5);
+ const end = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top);
+
+ this.add(start, p1, p2, p3, p4, end);
+ } else {
+ if (this._offsetY == null) {
+ this._circle.position.y = (this._inputPortItem.bounds.top + this._outputPortItem.bounds.bottom) / 2;
+ } else {
+ this._circle.position.y = this._clamp(this._outputPortItem.bounds.bottom + this._offsetY, this._outputPortItem.bounds.bottom + this._padding, this._inputPortItem.bounds.top - 5);
+ }
+
+ this._circle.position.x = (this._inputPortItem.position.x + this._outputPortItem.position.x) / 2;
+
+ const start = new Point(this._inputPortItem.position.x, this._inputPortItem.bounds.top);
+ const p1 = new Point(this._inputPortItem.position.x, this._circle.position.y);
+ const p2 = new Point(this._outputPortItem.position.x, this._circle.position.y);
+ const end = new Point(this._outputPortItem.position.x, this._outputPortItem.bounds.bottom);
+
+ this.add(start, p1, p2, end);
+ }
}
}
@@ -103,9 +138,49 @@ class ConnectionItem extends BaseItem
super.destroy();
}
+ /**
+ * Overrides move method to calculate and update offset instead of position.
+ */
+ move(delta)
+ {
+ if (this._inputPortItem.bounds.top < this._outputPortItem.bounds.bottom + 2 * this._padding) {
+ this._offsetX = (this._circle.position.x - this._outputPortItem.position.x) + delta.x;
+ } else {
+ this._offsetY = (this._circle.position.y - this._outputPortItem.bounds.bottom) + delta.y;
+ }
+ this._hasMoved = true;
+ }
+
+ /**
+ * Overrides updatePositionToServer to update offset instead of position.
+ */
+ updatePositionToServer()
+ {
+ if (this.isMoveable() && this._hasMoved)
+ {
+ // If an ID exists, we know it exists on the server, so we can patch it.
+ // Else if we haven't tried saving it before, do it. This should create
+ // a new model on the server.
+ if (this._modelId || !this._coordinateSetSaveAttempted)
+ {
+ this._coordinateSetSaveAttempted = true;
+ this._model.set({ offset_x: this._offsetX, offset_y: this._offsetY });
+ this._model.save();
+ this._hasMoved = false;
+ }
+ }
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
-}
+ /**
+ * Clamps a value between a min and max.
+ */
+ _clamp(value, min, max)
+ {
+ return Math.min(Math.max(value, min), max);
+ }
+ }
export default ConnectionItem;
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Items/LineItem.js b/rodan-client/code/src/js/Items/LineItem.js
index 90bfe1f5b..bb0357179 100644
--- a/rodan-client/code/src/js/Items/LineItem.js
+++ b/rodan-client/code/src/js/Items/LineItem.js
@@ -1,4 +1,5 @@
import BaseItem from './BaseItem';
+import Rodan from 'rodan';
/**
* Line item.
@@ -14,15 +15,29 @@ class LineItem extends BaseItem
constructor(options)
{
super(options);
- this.firstSegment.point = options.startPoint;
+ this.fillColor = null;
+ this._startPoint = options.startPoint;
+ this._padding = this._padding = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].CONNECTION_PADDING;
}
/**
* Sets endpoint.
*/
- setEndPoint(point)
+ setEndPoint(endpoint)
{
- this.lastSegment.point = point;
+ this.removeSegments();
+
+ if (this._startPoint.y + 2 * this._padding > endpoint.y) {
+ const p1 = new Point(this._startPoint.x, this._startPoint.y + this._padding);
+ const p2 = new Point((this._startPoint.x + endpoint.x) / 2, this._startPoint.y + this._padding);
+ const p3 = new Point((this._startPoint.x + endpoint.x) / 2, endpoint.y - this._padding);
+ const p4 = new Point(endpoint.x, endpoint.y - 5);
+ this.add(this._startPoint, p1, p2, p3, p4, endpoint);
+ } else {
+ const p1 = new Point(this._startPoint.x, (this._startPoint.y + endpoint.y) / 2);
+ const p2 = new Point(endpoint.x, (this._startPoint.y + endpoint.y) / 2);
+ this.add(this._startPoint, p1, p2, endpoint);
+ }
}
/**
diff --git a/rodan-client/code/src/js/Managers/ErrorManager.js b/rodan-client/code/src/js/Managers/ErrorManager.js
index c4db53c48..890cc7995 100644
--- a/rodan-client/code/src/js/Managers/ErrorManager.js
+++ b/rodan-client/code/src/js/Managers/ErrorManager.js
@@ -53,31 +53,7 @@ export default class ErrorHandler
}
else
{
- var response = options.response;
- var responseTextObject = JSON.parse(response.responseText);
- var message = 'An unknown error occured.';
-
- // Look for message in options first.
- if (options.hasOwnProperty('message'))
- {
- message = options.message;
- }
-
- // Go through the response text.
- var first = true;
- for(var property in responseTextObject)
- {
- if (responseTextObject.hasOwnProperty(property))
- {
- message += '\n';
- if (first)
- {
- message += '\n';
- first = false;
- }
- message += responseTextObject[property];
- }
- }
+ var message = options.message || 'An unknown error occured.';
this._showError(message, null);
}
}
@@ -92,7 +68,9 @@ export default class ErrorHandler
*/
_showError(text, error)
{
- console.error(error);
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, {content: text, title: 'Error'});
+ if (error) {
+ console.error(error);
+ }
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_ERROR, {content: text});
}
}
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Managers/UpdateManager.js b/rodan-client/code/src/js/Managers/UpdateManager.js
index 48ad16587..4e74a0e46 100644
--- a/rodan-client/code/src/js/Managers/UpdateManager.js
+++ b/rodan-client/code/src/js/Managers/UpdateManager.js
@@ -54,6 +54,8 @@ export default class UpdateManager
*/
_handleRequestUpdateClear(options)
{
- this._updater.clear();
+ if (this._updater) {
+ this._updater.clear();
+ }
}
}
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Models/Workflow.js b/rodan-client/code/src/js/Models/Workflow.js
index dd93579b1..c2cc9b2a8 100644
--- a/rodan-client/code/src/js/Models/Workflow.js
+++ b/rodan-client/code/src/js/Models/Workflow.js
@@ -20,7 +20,7 @@ export default class Workflow extends BaseModel
*/
initialize(options)
{
- this.set('connections', new ConnectionCollection(options.connections));
+ this.set('workflow_connections', new ConnectionCollection(options.connections));
this.set('workflow_input_ports', new InputPortCollection(options.workflow_input_ports));
this.set('workflow_output_ports', new OutputPortCollection(options.workflow_output_ports));
this.set('workflow_jobs', new WorkflowJobCollection(options.workflow_jobs));
@@ -45,43 +45,42 @@ export default class Workflow extends BaseModel
*/
parse(response)
{
- const workflow_runs = new WorkflowRunCollection();
- if (response.workflow_runs) {
- for (const workflow_run of response.workflow_runs) {
- workflow_runs.add(workflow_run);
- }
+ for (var i in response.workflow_runs)
+ {
+ var modelClass = this.get('workflow_runs').model;
+ var model = new modelClass(response.workflow_runs[i]);
+ this.get('workflow_runs').add(model, {merge: true});
}
+ response.workflow_runs = this.get('workflow_runs');
- const workflow_jobs = new WorkflowJobCollection();
- if (response.workflow_jobs) {
- for (const workflow_job of response.workflow_jobs) {
- workflow_jobs.add(workflow_job);
- }
+ for (var i in response.workflow_jobs)
+ {
+ var modelClass = this.get('workflow_jobs').model;
+ var model = new modelClass(response.workflow_jobs[i]);
+ this.get('workflow_jobs').add(model, {merge: true});
}
+ response.workflow_jobs = this.get('workflow_jobs');
- const workflow_input_ports = new InputPortCollection();
- if (response.workflow_input_ports) {
- for (const workflow_input_port of response.workflow_input_ports) {
- workflow_input_ports.add(workflow_input_port);
- }
- }
+ this.get('workflow_input_ports').set(response.workflow_input_ports, {merge: true, remove: true});
+ response.workflow_input_ports = this.get('workflow_input_ports');
- const workflow_output_ports = new OutputPortCollection();
- if (response.workflow_output_ports) {
- for (const workflow_output_port of response.workflow_output_ports) {
- workflow_output_ports.add(workflow_output_port);
- }
+ for (var i in response.workflow_output_ports)
+ {
+ var modelClass = this.get('workflow_output_ports').model;
+ var model = new modelClass(response.workflow_output_ports[i]);
+ this.get('workflow_output_ports').add(model, {merge: true});
}
-
- const parsed = {
- ...response,
- workflow_runs,
- workflow_jobs,
- workflow_input_ports,
- workflow_output_ports
+ response.workflow_output_ports = this.get('workflow_output_ports');
+
+ for (var i in response.workflow_connections)
+ {
+ var modelClass = this.get('workflow_connections').model;
+ var model = new modelClass(response.workflow_connections[i]);
+ this.get('workflow_connections').add(model, {merge: true});
}
+ response.workflow_connections = this.get('workflow_connections');
- return parsed;
+ return response;
}
}
Workflow.prototype.routeName = 'workflows';
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Router.js b/rodan-client/code/src/js/Router.js
new file mode 100644
index 000000000..945aff239
--- /dev/null
+++ b/rodan-client/code/src/js/Router.js
@@ -0,0 +1,26 @@
+import Radio from "backbone.radio";
+import RODAN_EVENTS from "js/Shared/RODAN_EVENTS";
+import ViewResetPassword from "js/Views/Master/Main/User/Individual/ViewResetPassword";
+import AppRouter from "marionette.approuter";
+
+const Router = AppRouter.extend({
+ controller: {
+ resetPassword(uid, token) {
+ const options = { uid, token };
+ const view = new ViewResetPassword(options);
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_HIDE);
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Reset Password", content: view });
+ },
+ activateAccount(uid, token) {
+ const options = { uid, token };
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_ACTIVATE_ACCOUNT, options);
+ },
+ },
+
+ appRoutes: {
+ "password-reset/:uid/:token": "resetPassword",
+ "activate/:uid/:token": "activateAccount",
+ }
+});
+
+export default Router;
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Shared/RODAN_EVENTS.js b/rodan-client/code/src/js/Shared/RODAN_EVENTS.js
index 0381edb26..f60176304 100644
--- a/rodan-client/code/src/js/Shared/RODAN_EVENTS.js
+++ b/rodan-client/code/src/js/Shared/RODAN_EVENTS.js
@@ -52,6 +52,8 @@ class RODAN_EVENTS
this.EVENT__AUTHENTICATION_LOGIN_SUCCESS = 'EVENT__AUTHENTICATION_LOGIN_SUCCESS';
/** Triggered after authentication attempt; user must log in. */
this.EVENT__AUTHENTICATION_LOGINREQUIRED = 'EVENT__AUTHENTICATION_LOGINREQUIRED';
+ /** Triggered if the account has not been activated. */
+ this.EVENT__AUTHENTICATION_ACTIVATION_REQUIRED = 'EVENT__AUTHENTICATION_ACTIVATION_REQUIRED';
/** Triggered on success of deauthentication. */
this.EVENT__AUTHENTICATION_LOGOUT_SUCCESS = 'EVENT__AUTHENTICATION_LOGOUT_SUCCESS';
/** Request check of authentication status. The client will make a request to the Rodan server. Upon response from the server, the client will fire one of the above AUTHENTICATION events. */
@@ -351,12 +353,28 @@ class RODAN_EVENTS
///////////////////////////////////////////////////////////////////////////////////////
/** Triggered when User has changed password. */
this.EVENT__USER_CHANGED_PASSWORD = 'EVENT__USER_CHANGED_PASSWORD';
+ /** Triggered when User has requested a password request email */
+ this.EVENT__USER_PASSWORD_RESET_REQUESTED = 'EVENT__USER_PASSWORD_RESET_REQUESTED';
+ /** Triggered when User has successfully reset password */
+ this.EVENT__USER_PASSWORD_RESET_CONFIRMED = 'EVENT__USER_PASSWORD_RESET_CONFIRMED';
/** Triggered when UserPreference for current User has been loaded. Sends {user_preference: UserPreference}. */
this.EVENT__USER_PREFERENCE_LOADED = 'EVENT__USER_PREFERENCE_LOADED';
/** Triggered when UserPreference saved. Sends {user_preference: UserPreference}. */
this.EVENT__USER_PREFERENCE_SAVED = 'EVENT__USER_PREFERENCE_SAVED';
/** Triggered when User has been saved. Sends {user: User}. */
this.EVENT__USER_SAVED = 'EVENT__USER_SAVED';
+ /** Triggered when there are errors in registration. Sends {errors: {[string]: string[]}} */
+ this.EVENT__USER_REGISTER_ERROR = 'EVENT__USER_REGISTER_ERROR';
+ /** Triggered when User has been registered. Sends {user: User}. */
+ this.EVENT__USER_REGISTERED = 'EVENT__USER_REGISTERED';
+ /** Triggered when an account is activated. */
+ this.EVENT__USER_ACTIVATED = 'EVENT__USER_ACTIVATED';
+ /** Triggered when User has requested a new activation email. */
+ this.EVENT__USER_RESENT_ACTIVATION_EMAIL = 'EVENT__USER_RESENT_ACTIVATION_EMAIL';
+ /** Request a password reset email. Takes in {username: string}. */
+ this.REQUEST__USER_RESET_PASSWORD = 'REQUEST__USER_RESET_PASSWORD';
+ /** Request password reset using token from email. Takes in {cid: string, token: string, new_password: string}. */
+ this.REQUEST__USER_RESET_PASSWORD_CONFIRM = 'REQUEST__USER_RESET_PASSWORD_CONFIRM';
/** Request current User's password be changed. Takes {currentpassword: string, newpassword: string}. */
this.REQUEST__USER_CHANGE_PASSWORD = 'REQUEST__USER_CHANGE_PASSWORD';
/** Request UserPreference for current User. Returns {user_preference: UserPreference (may be null if not yet loaded)}. */
@@ -365,6 +383,12 @@ class RODAN_EVENTS
this.REQUEST__USER_PREFERENCE_SAVE = 'REQUEST__USER_PREFERENCE_SAVE';
/** Request a User be saved/updated. Takes {user_preference: UserPreference}. */
this.REQUEST__USER_SAVE = 'REQUEST__USER_SAVE';
+ /** Request registration of new user */
+ this.REQUEST__USER_REGISTER = 'REQUEST__USER_REGISTER';
+ /** Request to activate account. Takes in {uid: string, token: string} */
+ this.REQUEST__USER_ACTIVATE_ACCOUNT = 'REQUEST__USER_ACTIVATE_ACCOUNT';
+ /** Request new activation email. Takes in {username: string} */
+ this.REQUEST__USER_RESEND_ACTIVATION = 'REQUEST__USER_RESEND_ACTIVATION';
///////////////////////////////////////////////////////////////////////////////////////
// Workflow
@@ -422,6 +446,8 @@ class RODAN_EVENTS
this.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN = 'REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN';
/** Request the Resources that are currently assigned to an InputPort. Takes {inputport: InputPort}. Returns [Resource]. */
this.REQUEST__WORKFLOWBUILDER_GET_RESOURCEASSIGNMENTS = 'REQUEST__WORKFLOWBUILDER_GET_RESOURCEASSIGNMENTS';
+ /** Request all InputPort resource assignments to be cleared. */
+ this.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS = 'REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS';
/** Request all InputPorts that could satisfy the provided OutputPort in the given Workflow. Takes {workflow: Workflow, outputport: OutputPort}. Returns [string] (InputPort URLs). */
this.REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS = 'REQUEST__WORKFLOWBUILDER_GET_SATISFYING_INPUTPORTS';
/** Request a Workflow (origin) be added to another Workflow (target). Takes {origin: Workflow, target: Workflow}. */
diff --git a/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js b/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js
index 71de7f672..f3b949b68 100644
--- a/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js
+++ b/rodan-client/code/src/js/Views/LayoutViewWorkflowBuilder.js
@@ -22,6 +22,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__UPDATER_CLEAR);
this._lastErrorCode = '';
this._lastErrorDetails = '';
+ this.setElement('
');
}
/**
@@ -58,11 +59,20 @@ class LayoutViewWorkflowBuilder extends Marionette.View
this.rodanChannel.on(Rodan.RODAN_EVENTS.EVENT__SERVER_ERROR, options => this._handleEventRodanError(options), this);
}
+ /**
+ * Hide all dropdowns in the workflow builder.
+ */
+ _hideDropdowns()
+ {
+ $('.dropdown-menu').hide();
+ }
+
/**
* Handle button zoom in.
*/
_handleButtonZoomIn()
{
+ this._hideDropdowns();
this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_IN);
}
@@ -71,6 +81,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View
*/
_handleButtonZoomOut()
{
+ this._hideDropdowns();
this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_OUT);
}
@@ -79,6 +90,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View
*/
_handleButtonZoomReset()
{
+ this._hideDropdowns();
this.guiChannel.request(GUI_EVENTS.REQUEST__WORKFLOWBUILDER_GUI_ZOOM_RESET);
}
@@ -87,14 +99,25 @@ class LayoutViewWorkflowBuilder extends Marionette.View
*/
_handleButtonEdit()
{
+ this._hideDropdowns();
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, {workflow: this.model});
}
+
+ /**
+ * Handle button clear assigned resources.
+ */
+ _handleButtonClearAssignedResources()
+ {
+ this._hideDropdowns();
+ this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, {workflow: this.model});
+ }
/**
* Handle button add job.
*/
_handleButtonAddJob()
{
+ this._hideDropdowns();
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, {workflow: this.model});
}
@@ -103,6 +126,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View
*/
_handleButtonImportWorkflow()
{
+ this._hideDropdowns();
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, {workflow: this.model});
}
@@ -111,6 +135,7 @@ class LayoutViewWorkflowBuilder extends Marionette.View
*/
_handleButtonRun()
{
+ this._hideDropdowns();
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, {workflow: this.model});
}
@@ -127,10 +152,10 @@ class LayoutViewWorkflowBuilder extends Marionette.View
* Handle click data status.
*/
_handleClickDataStatus()
- {
+ {
if (this._lastErrorCode !== '' || this._lastErrorDetails !== '')
{
- this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__MODAL_SHOW, {title: "ERROR", content: "Error code: " + this._lastErrorCode + " " + this._lastErrorDetails});
+ this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: "Invalid Workflow", content: this._lastErrorDetails });
}
}
@@ -141,27 +166,68 @@ class LayoutViewWorkflowBuilder extends Marionette.View
{
var checked = this.ui.checkboxAddPorts.is(':checked');
this.rodanChannel.request(Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SET_ADDPORTS, {addports: checked});
+ this._hideDropdowns();
+ }
+
+ /**
+ * Handle click on "Workflow" navbar button.
+ */
+ _handleClickWorkflowDropdownToggle()
+ {
+ this.ui.viewDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.settingsDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.workflowDropdownToggle.siblings('.dropdown-menu').toggle();
+ }
+
+ /**
+ * Handle click on "View" navbar button.
+ */
+ _handleClickViewDropdownToggle()
+ {
+ this.ui.settingsDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.workflowDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.viewDropdownToggle.siblings('.dropdown-menu').toggle();
}
+ /**
+ * Handle click on "Settings" navbar button.
+ */
+ _handleClickSettingsDropdownToggle()
+ {
+ this.ui.viewDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.workflowDropdownToggle.siblings('.dropdown-menu').hide();
+ this.ui.settingsDropdownToggle.siblings('.dropdown-menu').toggle();
+ }
+
+
/**
* Updates info of Workflow in view.
*/
_updateView(event, model)
{
- this.ui.workflowName.text(this.model.get('name'));
+ const workflowName = this.model.get('name');
+ this.ui.workflowName.text(workflowName);
if (this.model.get('valid'))
{
this._lastErrorCode = '';
this._lastErrorDetails = '';
- this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" is valid');
+ this.ui.dataStatus.text(`Workflow "${workflowName}" is valid.`);
+ this.ui.dataStatus.removeClass('text-danger');
}
else
{
- if (this._lastErrorCode == '' && this._lastErrorDetails == '') {
- this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" setup is incomplete.');
- } else {
- this.ui.dataStatus.text('Workflow "' + this.model.get('name') + '" is INVALID (click here for details)');
+ if (this._lastErrorCode == '' && this._lastErrorDetails == '')
+ {
+ this.ui.dataStatus.text(`Workflow "${workflowName}" setup is incomplete.`);
+ }
+ else if (this._lastErrorDetails == '') {
+ this.ui.dataStatus.text(`Workflow "${workflowName}" is invalid.`);
+ }
+ else
+ {
+ this.ui.dataStatus.text(`Workflow "${workflowName}" is invalid: ${this._lastErrorDetails}`);
}
+ this.ui.dataStatus.addClass('text-danger');
}
}
}
@@ -179,9 +245,13 @@ LayoutViewWorkflowBuilder.prototype.ui = {
checkboxAddPorts: '#checkbox-add_ports',
dataStatus: '#data-workflow_status',
buttonEdit: '#button-edit',
+ buttonClearAssignedResources: '#button-clear_assigned_resources',
buttonAddJob: '#button-add_job',
buttonImportWorkflow: '#button-import_workflow',
- buttonRun: '#button-run'
+ buttonRun: '#button-run',
+ workflowDropdownToggle: '#workflow-dropdown-toggle',
+ viewDropdownToggle: '#view-dropdown-toggle',
+ settingsDropdownToggle: '#settings-dropdown-toggle',
};
LayoutViewWorkflowBuilder.prototype.events = {
'click @ui.buttonZoomIn': '_handleButtonZoomIn',
@@ -190,9 +260,13 @@ LayoutViewWorkflowBuilder.prototype.events = {
'click @ui.dataStatus': '_handleClickDataStatus',
'change @ui.checkboxAddPorts': '_handleClickCheckboxAddPorts',
'click @ui.buttonEdit': '_handleButtonEdit',
+ 'click @ui.buttonClearAssignedResources': '_handleButtonClearAssignedResources',
'click @ui.buttonAddJob': '_handleButtonAddJob',
'click @ui.buttonImportWorkflow': '_handleButtonImportWorkflow',
- 'click @ui.buttonRun': '_handleButtonRun'
+ 'click @ui.buttonRun': '_handleButtonRun',
+ 'click @ui.workflowDropdownToggle': '_handleClickWorkflowDropdownToggle',
+ 'click @ui.viewDropdownToggle': '_handleClickViewDropdownToggle',
+ 'click @ui.settingsDropdownToggle': '_handleClickSettingsDropdownToggle'
};
LayoutViewWorkflowBuilder.prototype.modelEvents = {
'all': '_updateView'
diff --git a/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js b/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js
index ae4757e44..3e2da8ad1 100644
--- a/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js
+++ b/rodan-client/code/src/js/Views/Master/LayoutViewMaster.js
@@ -18,13 +18,17 @@ export default class LayoutViewMaster extends Marionette.View
*/
initialize()
{
+ // Replace default Marionette wrapping div with our own div that has an ID.
+ this.setElement('
');
+
+ // Add regions.
this.addRegions({
regionMain: '#region-main',
regionNavigation: '#region-navigation',
- regionStatus: '#region-status'
+ regionStatus: '#requests-status'
});
- this._initializeViews();
+ this._initializeViews();
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js b/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js
index 31ed53e18..a7c368326 100644
--- a/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js
+++ b/rodan-client/code/src/js/Views/Master/Main/BaseViewCollection.js
@@ -6,4 +6,5 @@ import Marionette from 'backbone.marionette';
export default class BaseViewCollection extends Marionette.CollectionView {}
BaseViewCollection.prototype.modelEvents = { 'all': 'render' };
BaseViewCollection.prototype.childViewContainer = 'tbody';
-BaseViewCollection.prototype.allowMultipleSelection = false;
\ No newline at end of file
+BaseViewCollection.prototype.allowMultipleSelection = false;
+BaseViewCollection.prototype.el = '
';
\ No newline at end of file
diff --git a/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js
index 6e96979c6..55942b7a5 100644
--- a/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js
+++ b/rodan-client/code/src/js/Views/Master/Main/InputPort/ViewInputPortCollectionItem.js
@@ -18,9 +18,21 @@ export default class ViewInputPortCollectionItem extends BaseViewCollectionItem
* @param {object} options Marionette.View options object; 'options.workflow' (Workflow) and 'options.workflowjob' (WorkflowJob) must also be provided
*/
initialize(options)
- {
+ {
this._workflow = options.workflow;
this._workflowJob = options.workflowjob;
+
+ this._minimum = this._getMinimumInputPortCount();
+
+ this._inputPorts = this._workflowJob.get("input_ports");
+ this._inputPorts.on("change add remove reset", () => this._handleInputPortsChange());
+ }
+
+ templateContext()
+ {
+ return {
+ disableDelete: this._getCurrentInputPortCount() <= this._minimum
+ };
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -33,6 +45,27 @@ export default class ViewInputPortCollectionItem extends BaseViewCollectionItem
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_INPUTPORT, {inputport: this.model, workflow: this._workflow, workflowjob: this._workflowJob});
}
+
+ _handleInputPortsChange()
+ {
+ this.render(); // We need to re-render if the the job's input port changes to disable/enable delete button.
+ }
+
+ _getCurrentInputPortCount()
+ {
+ return this._inputPorts.where({ input_port_type: this.model.get("input_port_type") }).length;
+ }
+
+ _getMinimumInputPortCount()
+ {
+ const jobCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION);
+ const inputPortTypes = jobCollection.get(this._workflowJob.getJobUuid()).get("input_port_types");
+
+ const portTypeUrl = this.model.get("input_port_type");
+ const portType = inputPortTypes.findWhere({url: portTypeUrl});
+
+ return portType.get("minimum");
+ }
}
ViewInputPortCollectionItem.prototype.ui = {
buttonDelete: '#button-delete'
diff --git a/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js
index a5ecaa6fb..0cb1f5074 100644
--- a/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js
+++ b/rodan-client/code/src/js/Views/Master/Main/InputPortType/ViewInputPortTypeCollectionItem.js
@@ -21,6 +21,15 @@ export default class ViewInputPortTypeCollectionItem extends BaseViewCollectionI
{
this._workflowJob = options.workflowjob;
this._workflow = options.workflow;
+ this._inputPorts = this._workflowJob.get("input_ports");
+ this._inputPorts.on("change add remove reset", () => this._handleInputPortsChange());
+ }
+
+ templateContext()
+ {
+ return {
+ current: this._getCurrentInputPortCount()
+ };
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -33,6 +42,16 @@ export default class ViewInputPortTypeCollectionItem extends BaseViewCollectionI
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_ADD_INPUTPORT, {inputporttype: this.model, workflowjob: this._workflowJob, workflow: this._workflow});
}
+
+ _handleInputPortsChange()
+ {
+ this.render(); // We need to re-render if the the job's input port changes to update the current count.
+ }
+
+ _getCurrentInputPortCount()
+ {
+ return this._inputPorts.where({ input_port_type: this.model.get("url") }).length;
+ }
}
ViewInputPortTypeCollectionItem.prototype.tagName = 'tr';
ViewInputPortTypeCollectionItem.prototype.template = _.template($('#template-main_inputporttype_collection_item').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js b/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js
index ee498bd46..79285eb52 100644
--- a/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js
+++ b/rodan-client/code/src/js/Views/Master/Main/LayoutViewMain.js
@@ -18,8 +18,12 @@ export default class LayoutViewMain extends Marionette.View
*/
initialize()
{
+ this.setElement('
');
this.addRegions({
- region: 'div'
+ region: {
+ el: 'div',
+ replaceElement: true
+ }
});
this._initializeRadio();
}
diff --git a/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js b/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js
index 5b5e28503..ee01836d2 100644
--- a/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js
+++ b/rodan-client/code/src/js/Views/Master/Main/LayoutViewModel.js
@@ -1,55 +1,130 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import Marionette from 'backbone.marionette';
-
-/**
- * This is a layout to help render a Collection and a single item.
- * We're using a LayoutView as opposed to a CompositeView because the single model
- * that would be associated with the CompositveView is not initially known, so it can't
- * rerender.
- */
-export default class LayoutViewModel extends Marionette.View
-{
-///////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC METHODS
-///////////////////////////////////////////////////////////////////////////////////////
- /**
- * Initializes the instance.
- */
- initialize()
- {
- this.addRegions({
- regionCollection: '#region-main_layoutview_model_collection',
- regionItem: '#region-main_layoutview_model_item'
- });
- }
-
- /**
- * Show a Collection view.
- *
- * @param {Marionette.View} view Collection view to show
- */
- showCollection(view)
- {
- this.showChildView('regionCollection', view);
- }
-
- /**
- * Show an item view.
- *
- * @param {Marionette.View} view item view to show
- */
- showItem(view)
- {
- this.showChildView('regionItem', view);
- }
-
- /**
- * Clears item view.
- */
- clearItemView()
- {
- this.getRegion('regionItem').empty();
- }
-}
-LayoutViewModel.prototype.template = _.template($('#template-main_layoutview_model').text());
+// import $ from 'jquery';
+// import _ from 'underscore';
+// import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
+// import Marionette from 'backbone.marionette';
+// import Radio from 'backbone.radio';
+
+// /**
+// * This is a layout to help render a Collection and a single item.
+// * We're using a LayoutView as opposed to a CompositeView because the single model
+// * that would be associated with the CompositveView is not initially known, so it can't
+// * rerender.
+// */
+// export default class LayoutViewModel extends Marionette.View
+// {
+// ///////////////////////////////////////////////////////////////////////////////////////
+// // PUBLIC METHODS
+// ///////////////////////////////////////////////////////////////////////////////////////
+// /**
+// * Initializes the instance.
+// */
+// initialize()
+// {
+// console.log(this);
+// this.setElement('
');
+// this.addRegions({
+// regionCollection: '#region-main_layoutview_model_collection',
+// regionProjectInfo: '#region-main_layoutview_model_item',
+// regionCollectionItemInfo: '#region-main_layoutview_model_collection_item'
+// });
+// }
+
+// /**
+// * Show a Collection view.
+// *
+// * @param {Marionette.View} view Collection view to show
+// */
+// showCollection(view)
+// {
+// console.log(view);
+// this.showChildView('regionCollection', view);
+// }
+
+// /**
+// * Show an item view.
+// *
+// * @param {Marionette.View} view item view to show
+// */
+// showItem(view)
+// {
+// console.log(view);
+// this.showChildView('regionProjectInfo', view);
+// }
+
+// /**
+// * Show an item view. This is for the secondary item view.
+// *
+// * @param {Marionette.View} view item view to show
+// */
+// showSecondaryItem(view) {
+// this.showChildView('regionCollectionItemInfo', view);
+// }
+
+// /**
+// * Clears item view.
+// */
+// clearItemView()
+// {
+// this.getRegion('regionCollectionItemInfo').empty();
+// }
+
+// /**
+// * Handle RunJob button.
+// */
+// _handleButtonRunJobs()
+// {
+// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED_COLLECTION, {project: this.model});
+// }
+
+// /**
+// * Handle click resource count.
+// */
+// _handleClickResourceCount()
+// {
+// console.log(this);
+// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_SELECTED_COLLECTION, {project: this.model});
+// }
+
+// /**
+// * Handle click workflow count.
+// */
+// _handleClickWorkflowCount()
+// {
+// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {project: this.model});
+// }
+
+// /**
+// * Handle click button ResourceLists.
+// */
+// _handleButtonResourceLists()
+// {
+// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCELIST_SELECTED_COLLECTION, {project: this.model});
+// }
+
+// /**
+// * Handle button Project users.
+// */
+// _handleButtonProjectUsers()
+// {
+// Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_USERS_SELECTED, {project: this.model});
+// }
+// }
+
+
+// LayoutViewModel.prototype.ui = {
+// // buttonResourceLists: '#button-resourcelists',
+// resourceCount: '#resource_count',
+// workflowCount: '#workflow_count',
+// buttonRunJobs: '#button-runjobs',
+// buttonUsers: '#button-project_users'
+// };
+
+// LayoutViewModel.prototype.events = {
+// 'click @ui.resourceCount': '_handleClickResourceCount',
+// 'click @ui.workflowCount': '_handleClickWorkflowCount',
+// 'click @ui.buttonRunJobs': '_handleButtonRunJobs',
+// 'click @ui.buttonResourceLists': '_handleButtonResourceLists',
+// 'click @ui.buttonUsers': '_handleButtonProjectUsers'
+// };
+
+// LayoutViewModel.prototype.template = _.template($('#template-main_layoutview_model').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js
new file mode 100644
index 000000000..bb7cf39d0
--- /dev/null
+++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewActivationRequired.js
@@ -0,0 +1,39 @@
+import Marionette from "backbone.marionette";
+import Radio from "backbone.radio";
+import $ from "jquery";
+import RODAN_EVENTS from "js/Shared/RODAN_EVENTS";
+import _ from "underscore";
+
+/**
+ * Activation required view.
+ */
+export default class ViewActivationRequired extends Marionette.View {
+
+ initialize(options) {
+ this._email = options.email;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ // PRIVATE METHODS
+ ///////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Handle resend activation email.
+ */
+ _handleButtonSubmit() {
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESEND_ACTIVATION, { email: this._email });
+ }
+}
+
+ViewActivationRequired.prototype.modelEvents = {
+ "all": "render"
+};
+
+ViewActivationRequired.prototype.ui = {
+ buttonSubmit: "#button-resend_activation_email",
+};
+
+ViewActivationRequired.prototype.events = {
+ "click @ui.buttonSubmit": "_handleButtonSubmit"
+};
+
+ViewActivationRequired.prototype.template = _.template($("#template-main_activation-required").text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js
new file mode 100644
index 000000000..f4375ae4d
--- /dev/null
+++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewForgotPassword.js
@@ -0,0 +1,32 @@
+import Marionette from "backbone.marionette";
+import Radio from "backbone.radio";
+import $ from "jquery";
+import RODAN_EVENTS from "js/Shared/RODAN_EVENTS";
+import _ from "underscore";
+
+/**
+ * Forgot password view.
+ */
+export default class ViewForgotPassword extends Marionette.View {
+ ///////////////////////////////////////////////////////////////////////////////////////
+ // PRIVATE METHODS
+ ///////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Handle save button.
+ */
+ _handleButtonSubmit() {
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD, { email: this.ui.textEmail.val() });
+ }
+}
+ViewForgotPassword.prototype.modelEvents = {
+ "all": "render"
+};
+ViewForgotPassword.prototype.ui = {
+ buttonSubmit: "#button-request_password_reset",
+ textEmail: "#text-email",
+ textMessage: "#text-message",
+};
+ViewForgotPassword.prototype.events = {
+ "click @ui.buttonSubmit": "_handleButtonSubmit"
+};
+ViewForgotPassword.prototype.template = _.template($("#template-main_forgot-password").text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js
index c800e8a94..612cdf8a9 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewLogin.js
@@ -3,6 +3,8 @@ import _ from 'underscore';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Marionette from 'backbone.marionette';
import Radio from 'backbone.radio';
+import ViewForgotPassword from './ViewForgotPassword';
+import ViewRegister from './ViewRegister';
/**
* Login view.
@@ -30,6 +32,24 @@ export default class ViewLogin extends Marionette.View
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_LOGIN, { email: this.ui.textEmail.val(), password: this.ui.textPassword.val() });
}
+
+ /**
+ * Handle register button.
+ */
+ _handleButtonRegister()
+ {
+ const content = new ViewRegister();
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: 'Register', content });
+ }
+
+ /**
+ * Handle forgot password button.
+ */
+ _handleButtonForgotPassword()
+ {
+ const content = new ViewForgotPassword();
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__MODAL_SHOW, { title: 'Forgot Password', content });
+ }
}
ViewLogin.prototype.modelEvents = {
'all': 'render'
@@ -37,9 +57,13 @@ ViewLogin.prototype.modelEvents = {
ViewLogin.prototype.ui = {
textEmail: '#text-login_email',
textPassword: '#text-login_password',
- buttonLogin: '#button-login'
+ buttonLogin: '#button-login',
+ buttonRegister: '#button-register',
+ buttonForgotPassword: '#button-forgot_password'
};
ViewLogin.prototype.events = {
- 'click @ui.buttonLogin': '_handleButton'
+ 'click @ui.buttonLogin': '_handleButton',
+ 'click @ui.buttonRegister': '_handleButtonRegister',
+ 'click @ui.buttonForgotPassword': '_handleButtonForgotPassword'
};
ViewLogin.prototype.template = _.template($('#template-main_login').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js b/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js
new file mode 100644
index 000000000..cc8d91a1f
--- /dev/null
+++ b/rodan-client/code/src/js/Views/Master/Main/Login/ViewRegister.js
@@ -0,0 +1,133 @@
+import Marionette from "backbone.marionette";
+import Radio from "backbone.radio";
+import $ from "jquery";
+import RODAN_EVENTS from "js/Shared/RODAN_EVENTS";
+import _ from "underscore";
+
+/**
+ * Forgot password view.
+ */
+export default class ViewRegister extends Marionette.View {
+ initialize() {
+ Radio.channel("rodan").on(RODAN_EVENTS.EVENT__USER_REGISTER_ERROR, options => this._handleRegisterError(options));
+ }
+ ///////////////////////////////////////////////////////////////////////////////////////
+ // PRIVATE METHODS
+ ///////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Handle register button.
+ */
+ _handleButtonRegister() {
+ const valid = this._validateFields();
+ if (valid) {
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_REGISTER, {
+ username: this.ui.textUsername.val(),
+ email: this.ui.textEmail.val(),
+ password: this.ui.textPassword.val(),
+ });
+ }
+ }
+
+ /**
+ * Validate all fields.
+ */
+ _validateFields() {
+ this._validateUsername();
+ this._validateEmail();
+ this._validatePassword();
+ this._validatePasswordConfirm();
+ return this.ui.errorUsername.text() === "" && this.ui.errorEmail.text() === "" && this.ui.errorPassword.text() === "" && this.ui.errorPasswordConfirm.text() === "";
+ }
+
+ /**
+ * Validate username.
+ */
+ _validateUsername() {
+ const username = this.ui.textUsername.val();
+ if (username === "") {
+ this.ui.errorUsername.text("Username cannot be empty.");
+ } else {
+ this.ui.errorUsername.text("");
+ }
+ }
+
+ /**
+ * Validate email.
+ */
+ _validateEmail() {
+ const email = this.ui.textEmail.val();
+ if (email === "") {
+ this.ui.errorEmail.text("Email cannot be empty.");
+ } else if (!/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(email)) {
+ this.ui.errorEmail.text("Invalid email.");
+ } else {
+ this.ui.errorEmail.text("");
+ }
+ }
+
+ /**
+ * Validate password.
+ */
+ _validatePassword() {
+ const password = this.ui.textPassword.val();
+ if (password === "") {
+ this.ui.errorPassword.text("Password cannot be empty.");
+ } else {
+ this.ui.errorPassword.text("");
+ }
+ }
+
+ /**
+ * Validate password confirm.
+ */
+ _validatePasswordConfirm() {
+ const password = this.ui.textPassword.val();
+ const passwordConfirm = this.ui.textPasswordConfirm.val();
+ if (password !== passwordConfirm) {
+ this.ui.errorPasswordConfirm.text("Passwords do not match.");
+ } else {
+ this.ui.errorPasswordConfirm.text("");
+ }
+ }
+
+ /**
+ * Handle errors returned from server.
+ * @param {{errors: {[string]: string[]}}} options map from field name to error messages
+ */
+ _handleRegisterError(options) {
+ const errorMap = options.errors;
+ for (const [key, errors] of Object.entries(errorMap)) {
+ if (key === "username") {
+ this.ui.errorUsername.text(errors.join(" "));
+ } else if (key === "email") {
+ this.ui.errorEmail.text(errors.join(" "));
+ } else if (key === "password") {
+ this.ui.errorPassword.text(errors.join(" "));
+ } else if (key === "password_confirm") {
+ this.ui.errorPasswordConfirm.text(errors.join(" "));
+ }
+ }
+ }
+}
+
+ViewRegister.prototype.modelEvents = {
+ "all": "render"
+};
+
+ViewRegister.prototype.ui = {
+ buttonRegister: "#button-register",
+ textUsername: "#text-username",
+ textEmail: "#text-email",
+ textPassword: "#text-password",
+ textPasswordConfirm: "#text-password_confirm",
+ errorUsername: "#error-username",
+ errorEmail: "#error-email",
+ errorPassword: "#error-password",
+ errorPasswordConfirm: "#error-password_confirm"
+};
+
+ViewRegister.prototype.events = {
+ "click @ui.buttonRegister": "_handleButtonRegister"
+};
+
+ViewRegister.prototype.template = _.template($("#template-main_register").text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js
index c10d50e80..efd2a7b96 100644
--- a/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js
+++ b/rodan-client/code/src/js/Views/Master/Main/OutputPort/ViewOutputPortCollectionItem.js
@@ -21,6 +21,18 @@ export default class ViewOutputPortCollectionItem extends BaseViewCollectionItem
{
this._workflow = options.workflow;
this._workflowJob = options.workflowjob;
+
+ this._minimum = this._getMinimumOutputPortCount();
+
+ this._outputPorts = this._workflowJob.get("output_ports");
+ this._outputPorts.on("change add remove reset", () => this._handleOutputPortsChange());
+ }
+
+ templateContext()
+ {
+ return {
+ disableDelete: this._getCurrentOutputPortCount() <= this._minimum
+ }
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -33,6 +45,27 @@ export default class ViewOutputPortCollectionItem extends BaseViewCollectionItem
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_REMOVE_OUTPUTPORT, {outputport: this.model, workflow: this._workflow, workflowjob: this._workflowJob});
}
+
+ _handleOutputPortsChange()
+ {
+ this.render(); // We need to re-render if the the job's output port changes to disable/enable delete button.
+ }
+
+ _getCurrentOutputPortCount()
+ {
+ return this._outputPorts.where({ output_port_type: this.model.get("output_port_type") }).length;
+ }
+
+ _getMinimumOutputPortCount()
+ {
+ const jobCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION);
+ const outputPortTypes = jobCollection.get(this._workflowJob.getJobUuid()).get("output_port_types");
+
+ const portTypeUrl = this.model.get("output_port_type");
+ const portType = outputPortTypes.findWhere({url: portTypeUrl});
+
+ return portType.get("minimum");
+ }
}
ViewOutputPortCollectionItem.prototype.ui = {
buttonDelete: '#button-delete'
diff --git a/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js b/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js
index 29675235b..fad3c988a 100644
--- a/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js
+++ b/rodan-client/code/src/js/Views/Master/Main/OutputPortType/ViewOutputPortTypeCollectionItem.js
@@ -21,6 +21,15 @@ export default class ViewOutputPortTypeCollectionItem extends BaseViewCollection
{
this._workflowJob = options.workflowjob;
this._workflow = options.workflow;
+ this._outputPorts = this._workflowJob.get("output_ports");
+ this._outputPorts.on("change add remove reset", () => this._handleOutputPortsChange());
+ }
+
+ templateContext()
+ {
+ return {
+ current: this._getCurrentOutputPortCount()
+ }
}
///////////////////////////////////////////////////////////////////////////////////////
@@ -33,6 +42,16 @@ export default class ViewOutputPortTypeCollectionItem extends BaseViewCollection
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_ADD_OUTPUTPORT, {outputporttype: this.model, workflowjob: this._workflowJob, workflow: this._workflow});
}
+
+ _handleOutputPortsChange()
+ {
+ this.render(); // We need to re-render if the the job's output port changes to update the current count.
+ }
+
+ _getCurrentOutputPortCount()
+ {
+ return this._outputPorts.where({ output_port_type: this.model.get("url") }).length;
+ }
}
ViewOutputPortTypeCollectionItem.prototype.tagName = 'tr';
ViewOutputPortTypeCollectionItem.prototype.template = _.template($('#template-main_outputporttype_collection_item').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js b/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js
index 75680f460..8136c87e6 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Project/Collection/ViewProjectCollection.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import _ from 'underscore';
+import _, { initial } from 'underscore';
import BehaviorTable from 'js/Behaviors/BehaviorTable';
import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
@@ -11,6 +11,11 @@ import ViewProjectCollectionItem from './ViewProjectCollectionItem';
*/
export default class ViewProjectCollection extends BaseViewCollection
{
+ initialize() {
+ super.initialize();
+ this.setElement('
');
+ }
+
_handleButtonNewProject()
{
var user = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_USER);
diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js
index e8ad7ab40..f11974686 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/LayoutViewProjectUsers.js
@@ -28,6 +28,7 @@ export default class LayoutViewProjectUsers extends Marionette.View
this._viewProjectWorkers = options.viewprojectworkers;
this._viewUsers = options.viewusers;
this._project = options.project;
+ this.setElement('
');
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js
index 3a142617e..d6898d31b 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Project/Individual/ViewProject.js
@@ -7,8 +7,58 @@ import Radio from 'backbone.radio';
/**
* Project view.
*/
-export default class ViewProject extends Marionette.CollectionView
+export default class ViewProject extends Marionette.View
{
+
+ /**
+ * Initializes the instance.
+ */
+ initialize()
+ {
+ this.setElement('
');
+ this.addRegions({
+ regionCollection: '#region-collection-container',
+ // regionProjectInfo: '#region-project-details-panel',
+ regionCollectionItemInfo: '#region-collection-item-details-panel'
+ });
+ }
+
+ /**
+ * Show a Collection view.
+ *
+ * @param {Marionette.View} view Collection view to show
+ */
+ showCollection(view)
+ {
+ this.showChildView('regionCollection', view);
+ }
+
+ /**
+ * Show an item view.
+ *
+ * @param {Marionette.View} view item view to show
+ */
+ // showProjectInfo(view)
+ // {
+ // this.showChildView('regionProjectInfo', view);
+ // }
+
+ /**
+ * Show an item view. This is for the secondary item view.
+ *
+ * @param {Marionette.View} view item view to show
+ */
+ showCollectionItemInfo(view) {
+ this.showChildView('regionCollectionItemInfo', view);
+ }
+
+ /**
+ * Clears item view.
+ */
+ clearCollectionItemInfoView()
+ {
+ this.getRegion('regionCollectionItemInfo').empty();
+ }
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
@@ -17,9 +67,15 @@ export default class ViewProject extends Marionette.CollectionView
*/
_handleButtonSave()
{
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_SAVE,
- {project: this.model,
- fields: {name: _.escape(this.ui.textName.val()), description: _.escape(this.ui.textDescription.val())}});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_SAVE,
+ {
+ project: this.model,
+ fields: {
+ name: _.escape(this.ui.textName.val()),
+ description: _.escape(this.ui.textDescription.val())
+ }
+ }
+ );
}
/**
@@ -29,68 +85,91 @@ export default class ViewProject extends Marionette.CollectionView
{
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_DELETE, {project: this.model});
}
-
+
/**
- * Handle RunJob button.
- */
+ * Handle RunJob button.
+ */
_handleButtonRunJobs()
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED_COLLECTION, {project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#button-runjobs').addClass('active');
}
/**
- * Handle click resource count.
- */
+ * Handle click resource count.
+ */
_handleClickResourceCount()
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCE_SELECTED_COLLECTION, {project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#resource_count').addClass('active');
}
/**
- * Handle click workflow count.
- */
+ * Handle click workflow count.
+ */
_handleClickWorkflowCount()
{
- Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {project: this.model});
+ Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOW_SELECTED_COLLECTION, {view: this, project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#workflow_count').addClass('active');
}
/**
- * Handle click button ResourceLists.
+ * Handle button WorkflowRuns.
*/
+ _handleButtonWorkflowRuns()
+ {
+ Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__WORKFLOWRUN_SELECTED_COLLECTION, {project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#button-workflow_runs').addClass('active');
+ }
+
+ /**
+ * Handle click button ResourceLists.
+ */
_handleButtonResourceLists()
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RESOURCELIST_SELECTED_COLLECTION, {project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#resource_count').addClass('active');
}
/**
- * Handle button Project users.
- */
+ * Handle button Project users.
+ */
_handleButtonProjectUsers()
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_USERS_SELECTED, {project: this.model});
+ $('.project-nav-bar-btn').removeClass('active');
+ $('#button-project_users').addClass('active');
}
}
-ViewProject.prototype.modelEvents = {
- 'all': 'render'
- };
+
ViewProject.prototype.ui = {
- buttonSave: '#button-save_project',
- buttonDelete: '#button-delete_project',
- buttonResourceLists: '#button-resourcelists',
- resourceCount: '#resource_count',
- workflowCount: '#workflow_count',
- buttonRunJobs: '#button-runjobs',
- textName: '#text-project_name',
- textDescription: '#text-project_description',
- buttonUsers: '#button-project_users'
- };
+ // buttonResourceLists: '#button-resourcelists',
+ resourceCount: '#resource_count',
+ workflowCount: '#workflow_count',
+ buttonRunJobs: '#button-runjobs',
+ buttonUsers: '#button-project_users',
+ buttonWorkflowRuns: '#button-workflow_runs',
+ buttonDeleteProject: '#button-delete_project',
+ buttonSaveProject: '#button-save_project',
+ textName: '#text-project_name',
+ textDescription: '#text-project_description'
+};
+
ViewProject.prototype.events = {
- 'click @ui.buttonSave': '_handleButtonSave',
- 'click @ui.buttonDelete': '_handleButtonDelete',
- 'click @ui.resourceCount': '_handleClickResourceCount',
- 'click @ui.workflowCount': '_handleClickWorkflowCount',
- 'click @ui.buttonRunJobs': '_handleButtonRunJobs',
- 'click @ui.buttonResourceLists': '_handleButtonResourceLists',
- 'click @ui.buttonUsers': '_handleButtonProjectUsers'
- };
+ 'click @ui.resourceCount': '_handleClickResourceCount',
+ 'click @ui.workflowCount': '_handleClickWorkflowCount',
+ 'click @ui.buttonRunJobs': '_handleButtonRunJobs',
+ 'click @ui.buttonResourceLists': '_handleButtonResourceLists',
+ 'click @ui.buttonUsers': '_handleButtonProjectUsers',
+ 'click @ui.buttonWorkflowRuns': '_handleButtonWorkflowRuns',
+ 'click @ui.buttonDeleteProject': '_handleButtonDelete',
+ 'click @ui.buttonSaveProject': '_handleButtonSave'
+};
+
+// ViewProject.prototype.template = _.template($('#template-main_layoutview_model').text());
ViewProject.prototype.template = _.template($('#template-main_project_individual').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js
index 485ec078e..35e80d2de 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Collection/ViewResourceCollection.js
@@ -5,6 +5,7 @@ import BehaviorTable from 'js/Behaviors/BehaviorTable';
import BaseViewCollection from 'js/Views/Master/Main/BaseViewCollection';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';
+import ViewResourceCollectionItem from './ViewResourceCollectionItem';
/**
* View for Resource Collection.
@@ -24,10 +25,11 @@ export default class ViewResourceCollection extends BaseViewCollection
for (var i = 0; i < this.ui.fileInput[0].files.length; i++)
{
var file = this.ui.fileInput[0].files[i];
- var escapedFile = new File([file.slice(0, file.size)], _.escape(_.escape(file.name))); // This won't work with only one escape!
+ var escapedFile = new File([file.slice(0, file.size)], _.escape(_.escape(file.name))); // This won't work with only one escape!
+ const project = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__PROJECT_GET_ACTIVE);
Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_CREATE,
{
- project: this.model,
+ project: project,
file: escapedFile,
resourcetype: this.octetStreamType,
label_names: this.ui.labelInput[0].value
@@ -62,6 +64,9 @@ export default class ViewResourceCollection extends BaseViewCollection
}
}
}
+
+ViewResourceCollection.prototype.template = _.template($('#template-main_resource_collection').text());
+ViewResourceCollection.prototype.childView = ViewResourceCollectionItem;
ViewResourceCollection.prototype.behaviors = [{behaviorClass: BehaviorTable, table: '#table-resources'}]
ViewResourceCollection.prototype.ui = {
fileInput: '#file-main_resource_file',
diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js
index 0d1e0b477..15c27de37 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResource.js
@@ -25,6 +25,7 @@ export default class ViewResource extends Marionette.CollectionView
this.collection.each(function(model) { model.unset('selected'); });
var resourceType = this.collection.findWhere({url: this.model.get('resource_type')});
resourceType.set('selected', 'selected');
+ this.setElement('
'); // set container element
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js
index 99242855d..30897d18f 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Resource/Individual/ViewResourceMulti.js
@@ -20,6 +20,7 @@ export default class ViewResourceMulti extends Marionette.CollectionView
this.labelNames = '';
this.isSameType = true;
this.isSameLabel = true;
+ this.setElement('
'); // set container element
for (let model of this._models) {
let modelResourceTypeURL = model.get('resource_type');
diff --git a/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js b/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js
index 700352cbf..d0900e375 100644
--- a/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js
+++ b/rodan-client/code/src/js/Views/Master/Main/ResourceAssignment/LayoutViewResourceAssignment.js
@@ -26,6 +26,7 @@ export default class LayoutViewResourceAssignment extends Marionette.View
this._viewAssignedResources = options.viewassignedresources;
this._viewAssignedResources.collection.on('update', this._updateAssignedCount);
+ this.setElement('
');
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js b/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js
index 676598b93..9e145b0e5 100644
--- a/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js
+++ b/rodan-client/code/src/js/Views/Master/Main/RunJob/Individual/ViewRunJob.js
@@ -9,9 +9,15 @@ import Radio from 'backbone.radio';
*/
export default class ViewRunJob extends Marionette.View
{
+
+ initialize() {
+ this.setElement('
');
+ }
+
///////////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
-///////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////
+
/**
* Set 'Open' button availability after render.
*
@@ -41,5 +47,5 @@ ViewRunJob.prototype.ui = {
};
ViewRunJob.prototype.events = {
'click @ui.buttonOpen': '_handleButtonOpen'
- };
+};
ViewRunJob.prototype.template = _.template($('#template-main_runjob_individual').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js
index caf1fa6e3..779238019 100644
--- a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js
+++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewPassword.js
@@ -20,7 +20,7 @@ export default class ViewPassword extends Marionette.CollectionView
var passwordError = this._checkPassword();
if (passwordError)
{
- this.ui.textmessage.text(passwordError);
+ this.ui.textMessage.text(passwordError);
}
else
{
@@ -54,7 +54,7 @@ ViewPassword.prototype.ui = {
buttonSave: '#button-save_password',
textPassword: '#text-password',
textPasswordConfirm: '#text-password_confirm',
- textmessage: '#text-message',
+ textMessage: '#text-message',
textPasswordCurrent: '#text-password_current'
};
ViewPassword.prototype.events = {
diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js
new file mode 100644
index 000000000..a3897eeef
--- /dev/null
+++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewResetPassword.js
@@ -0,0 +1,58 @@
+import Marionette from "backbone.marionette";
+import Radio from "backbone.radio";
+import $ from "jquery";
+import RODAN_EVENTS from "js/Shared/RODAN_EVENTS";
+import _ from "underscore";
+
+/**
+ * Password reset view.
+ */
+export default class ViewResetPassword extends Marionette.View {
+ initialize(options) {
+ this._uid = options.uid;
+ this._token = options.token;
+ }
+ ///////////////////////////////////////////////////////////////////////////////////////
+ // PRIVATE METHODS
+ ///////////////////////////////////////////////////////////////////////////////////////
+ /**
+ * Handle submit button.
+ */
+ _handleButtonSubmit() {
+ var passwordError = this._checkPassword();
+ if (passwordError) {
+ this.ui.textMessage.text(passwordError);
+ }
+ else {
+ Radio.channel("rodan").request(RODAN_EVENTS.REQUEST__USER_RESET_PASSWORD_CONFIRM, { uid: this._uid, token: this._token, new_password: this.ui.textPassword.val() });
+ }
+ }
+
+ /**
+ * Checks password fields. Will provide error text if passwords no good, else null.
+ */
+ _checkPassword() {
+ var password = this.ui.textPassword.val();
+ var confirm = this.ui.textPasswordConfirm.val();
+ if (!password) {
+ return "Your password cannot be empty. Come on, you must have done this before.";
+ }
+ else if (password !== confirm) {
+ return "Passwords do not match.";
+ }
+ return null;
+ }
+}
+ViewResetPassword.prototype.modelEvents = {
+ "all": "render"
+};
+ViewResetPassword.prototype.ui = {
+ buttonSubmit: "#button-reset_password",
+ textPassword: "#text-password",
+ textPasswordConfirm: "#text-password_confirm",
+ textMessage: "#text-message",
+};
+ViewResetPassword.prototype.events = {
+ "click @ui.buttonSubmit": "_handleButtonSubmit"
+};
+ViewResetPassword.prototype.template = _.template($("#template-main_user_reset-password").text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js
index 713390e82..9cfd0d081 100644
--- a/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js
+++ b/rodan-client/code/src/js/Views/Master/Main/User/Individual/ViewUser.js
@@ -21,6 +21,7 @@ export default class ViewUser extends Marionette.CollectionView
/** @ignore */
Radio.channel('rodan').on(RODAN_EVENTS.EVENT__USER_PREFERENCE_LOADED, (options) => this._handleUserPreferenceLoaded(options));
Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__MODAL_FORM_VALIDATION_ERROR, (options) => this._handleErrors(options));
+ this.setElement('
');
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js b/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js
index 24c9de11b..29ead9ef1 100644
--- a/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js
+++ b/rodan-client/code/src/js/Views/Master/Main/Workflow/Individual/ViewWorkflow.js
@@ -9,6 +9,10 @@ import Radio from 'backbone.radio';
*/
export default class ViewWorkflow extends Marionette.View
{
+
+ initialize() {
+ this.setElement('
');
+ }
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js
index b877a77d2..db99e7060 100644
--- a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js
+++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewControlWorkflowJob.js
@@ -20,6 +20,7 @@ export default class ViewControlWorkflowJob extends Marionette.View
initialize(options)
{
this._workflow = options.workflow;
+ this.setElement('
');
}
///////////////////////////////////////////////////////////////////////////////////////
diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js
index 7916b07e1..82d3e84dc 100644
--- a/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js
+++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowJob/ViewSettings.js
@@ -21,6 +21,7 @@ export default class ViewSettings extends Marionette.View
initialize(options)
{
this._workflow = options.workflow;
+ this.setElement('
');
}
/**
@@ -63,16 +64,19 @@ export default class ViewSettings extends Marionette.View
var jobUuid = this.model.getJobUuid();
var collection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOB_COLLECTION);
var job = collection.get(jobUuid);
+ console.log(job);
+ console.log(job.get('settings'));
var settingsSchema = {
schema: job.get('settings'),
- theme: 'bootstrap3',
+ theme: 'barebones',
disable_collapse: true,
disable_edit_json: true,
disable_properties: true,
no_additional_properties: true,
show_errors: 'always',
startval: startValues,
- form_name_root: ' '
+ form_name_root: ' ',
+ onClassName: () => { return 'content-wrapper row-content'; },
};
this._editor = new JSONEditor(element, settingsSchema);
}
@@ -90,8 +94,8 @@ ViewSettings.prototype.modelEvents = {
};
ViewSettings.prototype.ui = {
buttonSave: '#button-save_workflowjob_settings'
- };
+};
ViewSettings.prototype.events = {
'click @ui.buttonSave': '_handleButtonSave'
- };
+};
ViewSettings.prototype.template = _.template($('#template-main_workflowjob_settings').text());
diff --git a/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js b/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js
index 62e7e40b3..15866f98f 100644
--- a/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js
+++ b/rodan-client/code/src/js/Views/Master/Main/WorkflowRun/Individual/LayoutViewIndividualWorkflowRun.js
@@ -1,7 +1,6 @@
import $ from 'jquery';
import _ from 'underscore';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
-import LayoutViewModel from 'js/Views/Master/Main/LayoutViewModel';
import Marionette from 'backbone.marionette';
import Radio from 'backbone.radio';
import ViewResourceCollection from 'js/Views/Master/Main/Resource/Collection/ViewResourceCollection';
@@ -24,12 +23,16 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View
*/
initialize(options)
{
+ // console.log(options);
+ this._projectView = options.projectView;
+ this._activeProject = options.activeProject;
this._runJobs = options.runjobs;
this._resources = options.resources;
this.addRegions({
regionRunJobCollection: '#region-main_workflowrun_individual_runjobs',
regionResourceCollection: '#region-main_workflowrun_individual_resources'
});
+ this.setElement('
');
}
/**
@@ -37,34 +40,26 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View
*/
onRender()
{
- // Empty regions.
- this.getRegion('regionRunJobCollection').empty();
- this.getRegion('regionResourceCollection').empty();
-
- if (this.getRegion('regionRunJobCollection').el === undefined || this.getRegion('regionResourceCollection').el === undefined) {
- this.getRegion('regionRunJobCollection').el = '#region-main_workflowrun_individual_runjobs'
- this.getRegion('regionResourceCollection').el = '#region-main_workflowrun_individual_resources'
- }
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, {projectView: this._projectView});
+ Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RUNJOB_SHOWLAYOUTVIEW, {projectView: this._projectView});
// Create Resource collection view.
- this._layoutViewResources = new LayoutViewModel();
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RESOURCE_SHOWLAYOUTVIEW, {layoutView: this._layoutViewResources});
- this.showChildView('regionResourceCollection', this._layoutViewResources);
- this._viewResourceCollection = new ViewResourceCollection({collection: this._resources,
- template: _.template($('#template-main_workflowrun_individual_resources_collection').text()),
- childView: ViewResourceCollectionItem});
- this._layoutViewResources.showCollection(this._viewResourceCollection);
+ this._viewResourceCollection = new ViewResourceCollection({
+ collection: this._resources,
+ template: _.template($('#template-main_workflowrun_individual_resources_collection').text()),
+ childView: ViewResourceCollectionItem
+ });
// Create RunJob collection view.
- this._layoutViewRunJobs = new LayoutViewModel();
- Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__RUNJOB_SHOWLAYOUTVIEW, {layoutView: this._layoutViewRunJobs});
- this.showChildView('regionRunJobCollection', this._layoutViewRunJobs);
- this._viewRunJobCollection = new ViewRunJobCollection({collection: this._runJobs,
- template: _.template($('#template-main_runjob_collection_notitle').text()),
- childView: ViewRunJobCollectionItem});
- this._layoutViewRunJobs.showCollection(this._viewRunJobCollection);
+ this._viewRunJobCollection = new ViewRunJobCollection({
+ collection: this._runJobs,
+ template: _.template($('#template-main_runjob_collection_notitle').text()),
+ childView: ViewRunJobCollectionItem
+ });
- // Show Resources on default.
+ // Show Resource collection view by default.
+ // If needed, this can be changed to show RunJob collection view by default (_showRunJobs()).
+ // Consult with regular Rodan users and researchers before changing.
this._showResources();
}
@@ -76,13 +71,10 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View
*/
_showResources()
{
- this.getRegion('regionRunJobCollection').$el.hide();
- this.ui.buttonShowResources.css('text-decoration', 'underline');
- this.ui.buttonShowRunJobs.css('text-decoration', 'none');
- if (!this.getRegion('regionResourceCollection').$el.is(':visible'))
- {
- this.getRegion('regionResourceCollection').$el.toggle('fast');
- }
+ this.detachChildView('regionRunJobCollection');
+ this.showChildView('regionResourceCollection', this._viewResourceCollection)
+ this.ui.buttonShowResources.addClass('active');
+ this.ui.buttonShowRunJobs.removeClass('active');
}
/**
@@ -90,13 +82,11 @@ export default class LayoutViewIndividualWorkflowRun extends Marionette.View
*/
_showRunJobs()
{
- this.getRegion('regionResourceCollection').$el.hide();
- this.ui.buttonShowResources.css('text-decoration', 'none');
- this.ui.buttonShowRunJobs.css('text-decoration', 'underline');
- if (!this.getRegion('regionRunJobCollection').$el.is(':visible'))
- {
- this.getRegion('regionRunJobCollection').$el.toggle('fast');
- }
+ // Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__RUNJOB_SELECTED, {project: this._activeProject});
+ this.detachChildView('regionResourceCollection')
+ this.showChildView('regionRunJobCollection', this._viewRunJobCollection)
+ this.ui.buttonShowRunJobs.addClass('active');
+ this.ui.buttonShowResources.removeClass('active');
}
/**
diff --git a/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js b/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js
index e2cb14aea..8e65166a3 100644
--- a/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js
+++ b/rodan-client/code/src/js/Views/Master/Navigation/LayoutViewNavigation.js
@@ -23,9 +23,12 @@ export default class LayoutViewNavigation extends Marionette.View
*/
initialize()
{
+ // Replace default Marionette wrapping div with our own div that has an ID.
+ this.setElement('
');
+
this._initializeRadio();
this.addRegions({
- regionNavigationTree: '#region-navigation_tree'
+ regionNavigationTree: '#project-navigation-tree'
});
}
@@ -237,6 +240,7 @@ export default class LayoutViewNavigation extends Marionette.View
this.$el.find('#button-navigation_last').prop('disabled', false);
}
}
+
LayoutViewNavigation.prototype.template = _.template($('#template-navigation').text());
LayoutViewNavigation.prototype.ui = {
buttonLogout: '#button-navigation_logout',
diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js
index c6de0d4a9..3dec6000f 100644
--- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js
+++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNode.js
@@ -15,16 +15,15 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Initialize.
*/
- initialize()
- {
+ initialize() {
+ this.setElement('
');
Radio.channel('rodan-navigation').on(NAV_EVENTS.EVENT__NAVIGATION_SELECTED_NODE, event => this._handleEventNodeSelected(event));
}
/**
* Hide subviews on render (initially).
*/
- onRender()
- {
+ onRender() {
this._hideSubviews();
}
@@ -34,25 +33,23 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Sets highlight of this menu entry.
*/
- _setHighlight(highlight)
- {
- var node = $(this.$el.find('.node_text')[0]);
- if (highlight)
- {
- // TODO magic number
- node.css('background-color', '#444444');
+ _setHighlight(highlight) {
+ const node = $(this.$el.find('.node-text')[0]);
+
+ if (highlight) {
+ // adding 'highlighted' class will visually highlight the node
+ node.addClass('highlighted');
}
- else
- {
- node.css('background-color', '');
+ else {
+ // adding 'highlighted' class will visually un-highlight the node
+ node.removeClass('highlighted');
}
}
/**
* Handle click.
*/
- _handleClick(event)
- {
+ _handleClick(event) {
this._toggleSubviews();
event.stopPropagation();
this._sendClickEvents();
@@ -61,8 +58,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Toggle subview show.
*/
- _toggleSubviews()
- {
+ _toggleSubviews() {
var firstUl = $(this.$el.find(this.childViewContainer)[0]);
if (firstUl !== undefined && firstUl.find('div').length > 0)
{
@@ -71,10 +67,9 @@ export default class ViewNavigationNode extends Marionette.CollectionView
}
/**
- * Hide subvies.
+ * Hide subviews.
*/
- _hideSubviews()
- {
+ _hideSubviews() {
var firstUl = $(this.$el.find(this.childViewContainer)[0]);
if (firstUl !== undefined)
{
@@ -85,8 +80,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Show subviews.
*/
- _showSubviews()
- {
+ _showSubviews() {
// Show subviews.
var firstUl = $(this.$el.find(this.childViewContainer)[0]);
if (firstUl !== undefined)
@@ -98,8 +92,7 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Expand parent.
*/
- _expandParent()
- {
+ _expandParent() {
// Show parents.
if (this._parent !== null && this._parent !== undefined && this._parent instanceof ViewNavigationNode)
{
@@ -111,24 +104,25 @@ export default class ViewNavigationNode extends Marionette.CollectionView
/**
* Does highlighting.
*/
- _handleEventNodeSelected(event)
- {
+ _handleEventNodeSelected(event) {
if (this === event.node)
{
this._setHighlight(true);
this._expandParent();
}
- else
+ // we don't want to unhighlight the root node
+ // it should always remain the color of the primary app color
+ else /// if (!(event.node instanceof ViewNavigationNodeRoot))
{
this._setHighlight(false);
}
}
}
ViewNavigationNode.prototype.ui = {
- text: '.node_text'
+ text: '.node-text'
};
ViewNavigationNode.prototype.events = {
'click @ui.text': '_handleClick'
};
ViewNavigationNode.prototype.template = _.template($('#template-navigation_node').text());
-ViewNavigationNode.prototype.childViewContainer = 'ul';
+ViewNavigationNode.prototype.childViewContainer = '.navigation-tree-child-view-container';
diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js
index 50999da95..4e6050b4f 100644
--- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js
+++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRoot.js
@@ -31,9 +31,18 @@ export default class ViewNavigationNodeRoot extends ViewNavigationNode
{
Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_SELECTED_COLLECTION);
}
+
+ /**
+ * Handle click.
+ * We don't want to toggle subviews here, so we override the parent method.
+ */
+ _handleClick(event) {
+ event.stopPropagation();
+ this._sendClickEvents();
+ }
}
ViewNavigationNodeRoot.prototype.ui = {
- text: '.node_text'
+ text: '#my-projects-btn'
};
ViewNavigationNodeRoot.prototype.events = {
'click @ui.text': '_handleClick'
diff --git a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js
index 26ad51a28..d2808d061 100644
--- a/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js
+++ b/rodan-client/code/src/js/Views/Master/Navigation/ViewNavigationNodeRunJobs.js
@@ -1,5 +1,5 @@
-import $ from 'jquery';
-import _ from 'underscore';
+import $ from 'jquery';
+import _ from 'underscore';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import NAV_EVENTS from './Events';
import Radio from 'backbone.radio';
@@ -47,4 +47,4 @@ export default class ViewNavigationNodeRunJobs extends ViewNavigationNode
}
}
}
-ViewNavigationNodeRunJobs.prototype.template = _.template($('#template-navigation_runjobs').text());
+ViewNavigationNodeRunJobs.prototype.template = _.template($('#template-navigation_runjobs').text());
diff --git a/rodan-client/code/src/js/WorkflowBuilderGUI.js b/rodan-client/code/src/js/WorkflowBuilderGUI.js
index 5c4e97035..9523990da 100644
--- a/rodan-client/code/src/js/WorkflowBuilderGUI.js
+++ b/rodan-client/code/src/js/WorkflowBuilderGUI.js
@@ -73,7 +73,7 @@ class WorkflowBuilderGUI
"GRID":
{
"DIMENSION": 20,
- "LINE_COLOR": "#606060",
+ "LINE_COLOR": "#9e9e9ec7",
"LINE_WIDTH": 0.5
},
"DATABASE_COORDINATES_MULTIPLIER": 1500, // Legacy workflows stored coordinates in the database differently. This is to maintain backwards compatibility.
@@ -98,6 +98,7 @@ class WorkflowBuilderGUI
"STROKE_COLOR_SELECTED": "#0000ff",
"STROKE_WIDTH_SELECTED": 2,
"CONNECTION_CIRCLE_RADIUS": 4,
+ "CONNECTION_PADDING": 5,
"HOVER_TIME": 1000,
"LOCAL_STORAGE_ITEMS": ['scroll', 'zoom']
}
@@ -121,10 +122,13 @@ class WorkflowBuilderGUI
{
var view = new LayoutViewWorkflowBuilder({model: this.getWorkflow()});
Radio.channel('rodan').request(Rodan.RODAN_EVENTS.REQUEST__MAINREGION_SHOW_VIEW, {view: view});
- this._menuItems = [{label: 'Edit Name/Description', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, options: {workflow: this.getWorkflow()}},
- {label: 'Add Job', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, options: {workflow: this.getWorkflow()}},
- {label: 'Import Workflow', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, options: {workflow: this.getWorkflow()}},
- {label: 'Run', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, options: {workflow: this.getWorkflow()}}];
+ this._menuItems = [
+ { label: 'Edit Name/Description', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOW_VIEW, options: { workflow: this.getWorkflow() } },
+ { label: 'Add Job', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_JOBCOLLECTION_VIEW, options: { workflow: this.getWorkflow() } },
+ { label: 'Import Workflow', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_SHOW_WORKFLOWCOLLECTION_VIEW, options: { workflow: this.getWorkflow() } },
+ { label: 'Clear Assigned Resources', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CLEAR_RESOURCEASSIGNMENTS, options: { workflow: this.getWorkflow() } },
+ { label: 'Run', radiorequest: Rodan.RODAN_EVENTS.REQUEST__WORKFLOWBUILDER_CREATE_WORKFLOWRUN, options: { workflow: this.getWorkflow() } }
+ ];
}
/**
@@ -136,7 +140,7 @@ class WorkflowBuilderGUI
this._multipleSelectionKey = Rodan.Environment.getMultipleSelectionKey();
this._line = null;
this._zoomRate = Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_RATE;
- this._itemController = new ItemController();
+ this._itemController = new ItemController({ workflow: this._workflow });
paper.handleMouseEvent = event => this._itemController.handleMouseEvent(event);
window.addEventListener('keydown', (e) => {
@@ -219,6 +223,8 @@ class WorkflowBuilderGUI
{
paper.install(window);
paper.setup(canvasElementId);
+ new paper.Layer({ name: 'connections' });
+ new paper.Layer({ name: 'default' });
paper.view.onFrame = (event) => this._handleFrame(event);
this.drawGrid = drawGrid;
this.drawGrid(Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].GRID, paper);
@@ -515,7 +521,7 @@ class WorkflowBuilderGUI
{
const boundingBox = this._getWorkflowBoundingBox();
if (boundingBox) {
- const workflowCenter = this._getWorkflowCenter(boundingBox);
+ const workflowCenter = this._getBoundingBoxCenter(boundingBox);
paper.view.center = workflowCenter;
const width = boundingBox.bottomRight.x - boundingBox.topLeft.x + 2 * Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].WORKFLOW_PADDING;
const height = boundingBox.bottomRight.y - boundingBox.topLeft.y + 2 * Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].WORKFLOW_PADDING;
@@ -539,34 +545,48 @@ class WorkflowBuilderGUI
return Math.min(Math.max(zoom, Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_MIN), Rodan.Configuration.PLUGINS['rodan-client-wfbgui'].ZOOM_MAX);
}
+ /**
+ * Calculates the bounding box given a list of workflow jobs.
+ * @param {WorkflowJob[]} workflow_jobs - The workflow jobs to calculate the bounding box for.
+ * @returns the bounding box of the workflow jobs or null if no workflow_jobs are provided.
+ */
+ _getBoundingBox(workflow_jobs)
+ {
+ if (!workflow_jobs) return null;
+ let minX, maxX, minY, maxY;
+ workflow_jobs.forEach(job => {
+ const { x, y } = job.get('appearance');
+ minX = minX === undefined || x < minX ? x : minX;
+ maxX = maxX === undefined || x > maxX ? x : maxX;
+ minY = minY === undefined || y < minY ? y : minY;
+ maxY = maxY === undefined || y > maxY ? y : maxY;
+ });
+ const topLeft = { x: minX, y: minY };
+ const bottomRight = { x: maxX, y: maxY };
+ return { topLeft, bottomRight };
+ }
+
/**
* Calculate the bounding box of the workflow in paper.js project coordinates.
* @returns {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} The bounds of the workflow in paper.js project coordinates or null if there are no jobs.
*/
_getWorkflowBoundingBox()
{
- let minX, maxX, minY, maxY;
if (this._workflow && this._workflow.get('workflow_jobs').length > 0) {
- this._workflow.get('workflow_jobs').forEach(job => {
- const { x, y } = job.get('appearance');
- minX = minX === undefined || x < minX ? x : minX;
- maxX = maxX === undefined || x > maxX ? x : maxX;
- minY = minY === undefined || y < minY ? y : minY;
- maxY = maxY === undefined || y > maxY ? y : maxY;
- });
- const topLeft = BaseItem.appearanceToProject({ x: minX, y: minY });
- const bottomRight = BaseItem.appearanceToProject({ x: maxX, y: maxY });
+ const boundingBox = this._getBoundingBox(this._workflow.get('workflow_jobs'));
+ const topLeft = BaseItem.appearanceToProject(boundingBox.topLeft);
+ const bottomRight = BaseItem.appearanceToProject(boundingBox.bottomRight);
return { topLeft, bottomRight };
}
return null;
}
/**
- * Calculates the paper.js project coordinates of the center of the workflow.
- * @param {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} boundingBox The bounding box of the workflow in paper.js project coordinates.
- * @return {{x: number, y: number} | null} The center of the workflow in paper.js project coordinates or null if no bounding box is provided.
+ * Calculates the center of a bounding box.
+ * @param {{topLeft: {x: number, y: number}, bottomRight: {x: number, y: number}} | null} boundingBox The bounding box.
+ * @return {{x: number, y: number} | null} The center of the bounding box or null if no bounding box is provided.
*/
- _getWorkflowCenter(boundingBox)
+ _getBoundingBoxCenter(boundingBox)
{
return boundingBox ? { x: (boundingBox.topLeft.x + boundingBox.bottomRight.x) / 2, y: (boundingBox.topLeft.y + boundingBox.bottomRight.y) / 2 } : null;
}
@@ -578,9 +598,7 @@ class WorkflowBuilderGUI
*/
_handleGetNewJobPosition()
{
- const x = this._rightClickPosition === null ? paper.view.center.x : this._rightClickPosition.x;
- const y = this._rightClickPosition === null ? paper.view.center.y : this._rightClickPosition.y;
- const position = { x, y};
+ const position = this._rightClickPosition == null ? paper.view.center : this._rightClickPosition;
return BaseItem.projectToAppearance(position);
}
diff --git a/rodan-client/code/styles/default.css b/rodan-client/code/styles/default.css
index e2c4504be..5e44366bd 100644
--- a/rodan-client/code/styles/default.css
+++ b/rodan-client/code/styles/default.css
@@ -1,12 +1,49 @@
/**
* Styles for Rodan client.
+ *
+ * ------------------------------------
+ * PLEASE READ BEFORE MAKING CHANGES!!!
+ * ------------------------------------
+ *
+ * -----------
+ * Terminology
+ * -----------
+ *
+ * Navigation region:
+ * The region that displays the Rodan logo, status bar, navigation tree,
+ * and a button menu at the bottom.
+ *
+ * Main region:
+ * The region that displays project information,
+ * resource information, allows for resource creation, project-name modification etc.
+ *
+ * Whenever a user selects anything in the navigation tree within the nagivation region,
+ * The main region's content will be dynamically updated.
+ *
*/
/**************************************************************************************
* General parameters
*************************************************************************************/
+ /* Set values for variables used throughout the stylesheet */
:root {
+ /* Navigation tree area */
+ --navigation-node-color: #939393;
+
+ /* Status area */
+ --background-color-status: #000000;
+ --text-color-status-user: #cccccc;
+ --text-color-status-user: #cccccc;
+ --text-color-status-server: #cccccc;
+
+ --primary-app-color: #7ab2b7;
+ --secondary-app-color: #589ed5;
+ --text-color-navigation: white;
+ --app-font: Montserrat, sans-serif;
+ --btn-remove-color: #E76B6B;
+ --btn-save-color: #EB9E3E;
+
/* Navigation area */
--background-color-navigation: #000000;
--text-color-navigation: #cccccc;
@@ -21,7 +58,7 @@
--background-color-main: #ffffff;
/* WorkflowBuilder area */
- --background-color-workflowbuilder-workspace: #dddddd;
+ --background-color-workflowbuilder-workspace: #f2f2f2;
--background-color-workflowbuilder-menu: #000000;
--text-color-workflowbuilder-menu: #ffffff;
@@ -35,77 +72,791 @@
--height-gui: 100; /* % of vertical space in GUI viewport */
--height-gui_menu: 4; /* % of vertical space in GUI viewport for menu */
--size-font: 11px; /* pixels */
+ --font-weight: 100;
}
+/* ------------------------------------ */
+/* General styles
+/* ------------------------------------ */
-/* General classes */
+/*
+ * General styles (especially .content-wrapper styles) are used EVERYWHERE.
+ * If you modify these styles, it will affect a lot of the UI throughout the whole website.
+ * PLEASE MAKE SURE YOU KNOW WHAT YOU'RE DOING!
+ */
+
+* {
+ box-sizing: border-box;
+}
.text-small
{
font-size: x-small;
}
+body {
+ width: 100vw;
+ height: 100vh;
+ font-family: var(--app-font);
+ font-size: var(--size-font);
+ font-weight: var(--font-weight);
+ margin: 0px;
+ overflow: hidden;
+}
+input, select {
+ border: 1px solid #cecece;
+ border-radius: 3px;
+ font-family: Montserrat, sans-serif;
+ padding: 2px;
+ box-sizing: border-box;
+ flex-grow: 1;
+ outline: none;
+}
+textarea {
+ border: 1px solid #cecece;
+ height: 50px;
+ width: 100%;
+ resize: vertical;
+ box-sizing: border-box;
+ border-radius: 3px;
+ outline: none;
+}
+
+/* Table styles */
+table {
+ user-select: none;
+ text-align: left;
+ width: 98%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ height: fit-content;
+ font-size: 15px;
+}
+thead {
+ background-color: #ecf0f5;
+ position: sticky;
+ top: 0px;
+}
+th, td {
+ cursor: pointer;
+ padding: 10px;
+}
+td {
+ border-top: 1px solid rgb(215 215 215);
+}
+tr {
+ cursor: default;
+}
+th {
+ font-weight: 400;
+ text-align: left;
+ text-wrap: nowrap;
+}
+hr {
+ border: 1px solid #e5e5e5;
+ width: 100%;
+}
+tbody > tr:hover {
+ background-color: var(--secondary-app-color);
+ color: white;
+ cursor: pointer;
+}
+/* flex content alignment */
+.content-wrapper {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+}
+.content-wrapper.column-content {
+ flex-direction: column;
+}
+.content-wrapper.row-content {
+ flex-direction: row;
+}
+/* flex horizontal alignment */
+.column-left {
+ align-items: flex-start;
+}
+.row-left {
+ justify-content: flex-start;
+}
+.column-center {
+ align-items: center;
+}
+.row-center {
+ justify-content: center;
+}
+.column-right {
+ align-items: flex-end;
+}
+.row-right {
+ justify-content: flex-end;
+}
+/* flex vertical alignment */
+.column-top {
+ justify-content: flex-start;
+}
+.row-top {
+ align-items: flex-start;
+}
+.column-middle {
+ justify-content: center;
+}
+.row-middle {
+ align-items: center;
+}
+.column-bottom {
+ justify-content: flex-end;
+}
+.row-bottom {
+ align-items: flex-end;
+}
+/* flex gap */
+.flex-gap-5 {
+ gap: 5px;
+}
+.flex-gap-10 {
+ gap: 10px;
+}
+.flex-gap-20 {
+ gap: 20px;
+}
+.flex-gap-30 {
+ gap: 30px;
+}
+/* padding */
+.padding-5 {
+ padding: 5px;
+}
+.padding-10 {
+ padding: 10px;
+}
+.padding-20 {
+ padding: 20px;
+}
+.padding-30 {
+ padding: 30px;
+}
+/* positioning */
+.pos-absolute {
+ position: absolute;
+}
+.pos-relative {
+ position: relative;
+}
+.pos-fixed {
+ position: fixed;
+}
+.pos-static {
+ position: static;
+}
+/* text */
+.text-nowrap {
+ text-wrap: nowrap;
+}
+.overflow-scroll {
+ overflow: scroll;
+}
+.overflow-auto {
+ overflow: auto;
+}
+.overflow-hidden {
+ overflow: hidden;
+}
+/* buttons */
+.btn {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ outline: none;
+ border: none;
+ cursor: pointer;
+ padding: 0.3vh;
+ border-radius: 3px;
+ box-sizing: border-box;
+ color: white;
+ background-color: var(--secondary-app-color);
+ border: 1px solid var(--secondary-app-color);
+}
+.btn:hover {
+ background-color: white;
+ color: var(--secondary-app-color);
+}
+.btn.btn-delete, .btn.btn-remove, .btn.btn-logout {
+ color: white;
+ background-color: var(--btn-remove-color);
+ border: 1px solid var(--btn-remove-color);
+}
+.btn.btn-delete:hover, .btn.btn-remove:hover, .btn.btn-logout:hover {
+ color: var(--btn-remove-color);
+ background-color: white;
+}
+.btn.save-btn {
+ color: white;
+ background-color: var(--btn-save-color);
+ border: 1px solid var(--btn-save-color);
+}
+.btn.save-btn:hover {
+ background-color: white;
+ color: var(--btn-save-color);
+}
+:disabled
+{
+ color: white !important;
+ background: #dddddd !important;
+ border: 1px solid #dddddd !important;
+ cursor: not-allowed !important;
+}
+:disabled:hover
+{
+ background: #dddddd !important;
+ border: 1px solid #dddddd !important;
+ color: white !important;
+}
+/* dropdowns */
+.dropdown {
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+}
+.dropdown-toggle {
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ cursor: pointer;
+}
+.dropdown-menu {
+ display: none;
+ position: absolute;
+ top: 100%;
+ left: -15%;
+ width: fit-content;
+ min-width: 150px;
+ height: fit-content;
+ background-color: white;
+ color: black;
+ box-sizing: border-box;
+ box-shadow: 0px 5px 5px 1px #00000057;
+ border-radius: 0px 0px 3px 3px;
+}
+.dropdown-menu.context-menu {
+ box-shadow: 0px 0px 5px 1px #00000057;
+ border-radius: 3px;
+}
+.dropdown-btn {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ justify-content: flex-start;
+ box-sizing: border-box;
+ padding: 10px;
+ font-size: 13px;
+ text-wrap: nowrap;
+ cursor: pointer;
+}
+.dropdown-btn:hover {
+ color: white;
+ background-color: var(--primary-app-color);
+}
-/* Navigation region */
-div#region-navigation
-{
- background: var(--background-color-navigation);
+/* ------------------------------------ */
+/* General styles end
+/* ------------------------------------ */
+
+
+
+
+#app {
+ width: 100%;
height: 100%;
- color: var(--text-color-navigation);
+}
+#app-content-wrapper {
+ justify-content: center;
+ align-items: center;
+}
+
+/* ///////////////////////////////////////////////////////////////////////////////////////
+// Navigation region
+/////////////////////////////////////////////////////////////////////////////////////// */
+
+#region-navigation {
+ background: #0000000f;
+ width: 16.66666667%;
+ color: var(--navigation-node-color);
overflow-y: auto;
overflow-x: hidden;
- cursor: default;
+ z-index: 999;
+ justify-content: center;
+}
+#region-navigation .node-text {
+ cursor: pointer;
+}
+#navigation-panel-content-wrapper {
+ justify-content: center;
+ width: 92%;
+}
+#app-navbar {
+ height: 99%;
+ justify-content: space-between;
}
-div#region-navigation ul
-{
- list-style-type: disc;
- margin: 0;
- padding-left: 10px;
+/* Logo and requests status styles */
+#rodan-logo {
+ font-size: 35px;
+ display: flex;
+ align-items: flex-start;
+ color: var(--primary-app-color);
+ height: 45px;
+}
+#requests-status {
+ color: var(--primary-app-color);
+ height: 10%;
+ align-items: flex-start;
}
-div#region-navigation div.node_text
-{
+/* Project navigation tree styles */
+.navigation-tree-node {
cursor: pointer;
}
-
-.workflow-name, .workflow-status {
- color: #9d9d9d;
- line-height: 20px;
- padding: 15px;
- margin: 0;
- display: block;
+.navigation-tree-node:hover {
+ background-color: var(--primary-app-color);
+ color: white;
+}
+#my-projects-btn {
+ font-size: 15px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+#my-projects-btn:hover {
+ background-color: var(--primary-app-color);
+ color: white;
+}
+#project-navigation-tree {
+ list-style-type: disc;
+}
+.navigation-tree-child-view-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ width: 90%;
+ padding-left: 5px;
+ border-left: 2px solid #69a3a870;
+}
+.navigation-tree-child-view-container.no-indent {
+ width: 100%;
+ border: none;
+ padding: 0;
+}
+.btn-group.main-navbar-btn-group {
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ align-items: stretch;
+ gap: 3px;
+}
+.node-text {
+ font-size: 15px;
+ width: 100%;
+ padding: 3px;
+}
+.node-text:hover {
+ background-color: var(--primary-app-color);
+ color: white;
+}
+.node-text.highlighted {
+ background-color: var(--primary-app-color);
+ color: white;
+}
+.node-text.project {
+ margin-top: 7px;
+ margin-bottom: 4px;
+}
+.node-text.project-child {
+ margin-top: 3px;
+ margin-bottom: 3px;
}
-.workflow-name {
- float: left;
- height: 50px;
- font-size: 18px;
- margin-left: -15px;
+/* main navbar buttons */
+#navigation-panel-btns {
+ height: auto;
+}
+.btn.main-navbar-btn {
+ background-color: white;
+ outline: none;
+ border: 1px solid #dedede;
+ color: var(--primary-app-color);
+ border-radius: 3px;
+ flex-grow: 1;
+ min-height: 25px;
}
+.btn.main-navbar-btn:hover {
+ background-color: var(--primary-app-color);
+ color: white;
+}
+.btn.main-navbar-btn#button-navigation_logout {
+ color: #E76B6B;
+}
+.btn.main-navbar-btn#button-navigation_logout:hover {
+ background-color: #E76B6B;
+ color: white;
+}
+
+
+/* ///////////////////////////////////////////////////////////////////////////////////////
+// Main region
+/////////////////////////////////////////////////////////////////////////////////////////*/
-/* Main region */
-div#region-main
+/* Main region general styles */
+#region-main
{
- /*background-image: url("resources/rodan.jpg"); */
- background-repeat: no-repeat;
+ Background-repeat: no-repeat;
background-position: center center;
- height: 100%;
+ width: 83.33333333%;
overflow-y: auto;
overflow-x: hidden;
- cursor: default;
+ flex-grow: 1;
+ justify-content: center;
+}
+#region-main-content-wrapper {
+ gap: 15px;
+}
+.region-main-section {
+ width: 100%;
+}
+/* Main region header */
+.region-main-section.region-main-header {
+ width: 100%;
+ height: 40px;
+ justify-content: space-between;
+ border-bottom: 2px solid #e5e5e5;
+}
+#region-main-header {
+ width: 98%;
+ justify-content: space-between;
+}
+.region-main-content-title {
+ font-size: 15px;
+ font-weight: 100;
+}
+.region-main-default-btn {
+ border: none;
+ background-color: var(--secondary-app-color);
+ border: 1px solid var(--secondary-app-color);
+ color: white;
+ border-radius: 3px;
+ padding: 5px;
+ font-family: Montserrat, sans-serif;
+ cursor: pointer;
+}
+.region-main-default-btn:hover {
+ background-color: white;
+ color: var(--secondary-app-color);
+}
+/* Table controls */
+.region-main-section.table-control {
+ height: fit-content;
+ justify-content: center;
+ align-items: center;
}
-/* Canvas */
-div#canvas-wrap
-{
+/* Table controls: table filtering */
+#table-filters-header-container {
+ height: fit-content;
+}
+#filter-inputs-dropdown-btn {
+ width: 25px;
+ cursor: pointer;
+}
+#filter-inputs-dropdown-btn.open {
+ transform: rotate(180deg);
+}
+.region-main-section.table-control.filters {
+ background-color: #fafafa;
+ padding: 8px;
+ gap: 3px;
+ box-sizing: border-box;
+ border: 1px solid #d7d7d7;
+ border-radius: 5px;
+}
+#clear-filters-btn-wrapper {
+ width: auto;
+ height: 100%;
+}
+#button-clearall {
+ height: 100%;
+ max-height: 25px;
+}
+#filter-inputs-wrapper {
+ gap: 10px;
height: 100%;
overflow: hidden;
- padding: 0px;
+ box-sizing: border-box;
+}
+#filter-inputs-wrapper.hidden {
+ display: none;
+}
+#filter-inputs-title {
+ width: 100%;
+ font-size: 12px;
+}
+#filter-inputs {
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+ flex-wrap: wrap;
+ height: fit-content;
+ align-items: center;
+ justify-content: flex-start;
+}
+.filter-input-wrapper {
+ width: fit-content;
+ align-items: flex-start;
+ background-color: #488bcb12;
+ border-radius: 3px;
+ /* border: 1px solid #e5e5e5; */
+ gap: 3px;
+ font-size: 12px;
+ font-weight: 500;
+ box-sizing: border-box;
+ padding: 7px;
+ color: var(--secondary-app-color);
+ flex: 1;
+}
+.filter-values-wrapper {
+ gap: 5px;
+}
+
+/* pagination controls styles */
+.region-main-section.table-control.pagination {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ width: 98%;
+ gap: 5px;
+}
+#table-pagination-controls-wrapper {
+ display: flex;
+ flex-direction: row;
+ width: fit-content;
+ border-radius: 3px;
+ overflow: hidden;
+}
+.pagination-btn {
+ color: white;
+ background-color: var(--secondary-app-color);
+ padding: 3px;
+ box-sizing: border-box;
+}
+
+/* ----------------------- */
+/* Individual project view */
+/* ----------------------- */
+.region-main-content {
+ overflow: auto;
+ height: 96%;
+}
+.individual-project-view {
+ display: flex;
+}
+.table-responsive {
+ border: 1px solid #dfdfdf;
+ border-radius: 5px;
+ background-color: #f0f0f047;
+ height: fit-content;
+ width: 100%;
+ overflow-x: auto;
+ max-height: 1000px;
+}
+.project-collections {
+ gap: 25px;
+ padding-top: 20px;
+ box-sizing: border-box;
+ width: 85%;
+ border-right: 2px solid #dfdfdf;
+}
+.project-navigation-bar {
+ height: 25px;
+ display: flex;
+ justify-content: space-around;
+ border-bottom: 2px solid #f0f0f0;
+ width: 90%;
+ box-sizing: border-box;
+}
+.project-nav-bar-btn {
+ background-color: transparent;
+ font-size: 15px;
+ color: grey;
+ border-radius: 0px;
+ border: none;
+ padding: 2px;
+}
+.project-nav-bar-btn:hover {
+ color: var(--primary-app-color);
+ background-color: transparent;
+}
+.project-nav-bar-btn.active {
+ border-bottom: 3px solid var(--primary-app-color);
+}
+#region-collection-container {
+ height: 94%;
+ display: flex;
+ border-radius: 3px;
+}
+.single-project-view-collection-wrapper {
+ gap: 10px;
+}
+.resource-upload-container {
+ height: fit-content;
+ gap: 10px;
+}
+.main-region-action-btn {
+ padding: 5px;
+ border-radius: 3px;
+ background-color: var(--secondary-app-color);
+ border: 1px solid var(--secondary-app-color);
+ color: white;
+ font-size: 13px;
+ cursor: pointer;
+ font-weight: 400;
+}
+.main-region-action-btn:hover {
+ background-color: white;
+ color: var(--secondary-app-color);
+}
+
+/* Workflows collection page */
+#new-workflow-btns-container {
+ height: fit-content;
+ gap: 5px;
+ width: 98%;
+}
+
+
+/* Project and collection details panels */
+.detail-panels-container {
+ width: 25%;
+ box-sizing: border-box;
+}
+.details-panel {
+ box-sizing: border-box;
+ border-bottom: 2px solid #dfdfdf;
+ font-size: 13px;
+ display: flex;
+ justify-content: space-between;
+ /* height: 50%; */
+}
+#region-project-details-panel, #region-collection-item-details-panel {
+ height: 50%;
}
+.details-panel-title-section {
+ background-color: #f2f2f2;
+ height: 40px;
+}
+.details-panel-details-section {
+ /* height: 80%; */
+ gap: 10px;
+ overflow: auto;
+ flex-grow: 1;
+}
+.details-panel-action-btns-section {
+ height: 5vh;
+ gap: 5px;
+ border-top: 2px solid #f2f2f2;
+ overflow-x: auto;
+ overflow-y: hidden;
+ padding: 5px;
+}
+.details-item-container {
+ height: fit-content;
+ align-items: flex-start;
+ gap: 7px;
+}
+.content-wrapper.row-content.details-item-container {
+ align-items: center;
+ height: fit-content;
+}
+.details-item-value {
+ overflow-wrap: anywhere;
+ background-color: whitesmoke;
+ padding: 3px;
+ border-radius: 3px;
+ box-sizing: border-box;
+}
+#select-resourcetype {
+ width: 100%;
+}
+/* Individual workflow runs page */
+#individual-workflow-run-container {
+ border-radius: 5px;
+ overflow: hidden;
+}
+#workflow-run-details-and-action-btns-container {
+ border: 1px solid #efefef;
+ height: 30%;
+}
+#workflow-run-resources-and-run-jobs-container {
+ border: 1px solid #efefef;
+ height: 64%;
+}
+#workflow-run-collections-wrapper {
+ height: fit-content;
+ padding-top: 10px;
+}
+#region-main_workflowrun_individual_resources {
+ padding-top: 20px;
+}
+#region-main_workflowrun_individual_resources, #region-main_workflowrun_individual_runjobs {
+ height: fit-content;
+ max-height: 82%;
+}
+
-div#canvas-tooltip
+/*//////////////////////////////////////////////////////////////////////////////////////
+// Canvas
+/////////////////////////////////////////////////////////////////////////////////////// */
+#workflow-builder-container {
+ border-left: 2px solid #69a3a8;
+ box-sizing: border-box;
+}
+#workflow-builder-navbar {
+ height: 50px;
+ color: white;
+ background-color: #69a3a8;
+ position: static;
+}
+#worlkflow-builder-navbar-content-wrapper {
+ gap: 5vw;
+ padding: 0px 2vw;
+}
+#navbar-header {
+ display: flex;
+ align-items: center;
+ width: fit-content;
+}
+#navbar-workflow-name {
+ font-size: 20px;
+ text-wrap: nowrap;
+}
+#data-workflow_status {
+ text-wrap: nowrap;
+}
+#workflow-builder-navbar-btns-wrapper {
+ gap: 3vw;
+ font-size: 13px;
+}
+#canvas-wrap
+{
+ /* flex-grow: 0.9; */
+ overflow: hidden;
+ padding: 0px;
+ height: 100%;
+ /* height: -webkit-fill-available; */
+}
+#canvas-tooltip
{
position: fixed;
background-color: #ffff88;
@@ -115,111 +866,181 @@ div#canvas-tooltip
border-style: solid;
border-width: 2px;
width: auto;
- visibility: visible;
+ visibility: hidden;
display: inline-block;
}
-
canvas#canvas-workspace
{
background-color: var(--background-color-workflowbuilder-workspace);
padding: 0px;
}
-
canvas[resize] {
width: 100%;
height: 100%;
}
-
/* Input fields */
-textarea[type=text]
-{
- height: 200px;
- width: 100%;
- resize: vertical;
-}
-
.vertical-center {
height: calc(var(--height-top) * 1%); /*fallback */
height: calc(var(--height-top) * 1vh);
display: flex;
align-items: center;
}
-
.horizontal-center
{
width: 100%;
text-align: center;
}
-
-body
-{
- overflow: hidden;
- font-family: Arial, Helvetica, sans-serif;
- font-size: var(--size-font);
-}
-
-div.fixed_individual {
- /*position: fixed;*/
- width: 100%;
-}
-
div.top {
height: calc(var(--height-top) * 1%); /*fallback */
height: calc(var(--height-top) * 1vh);
}
-
div.gui {
height: calc(var(--height-gui) * 1%); /*fallback*/
height: calc(var(--height-gui) * 1vh);
display: flex;
flex-direction: column;
}
-
div#main_workflowbuilder
{
background-color: white;
height: 100%;
overflow: auto;
}
-
.instruction
{
font-style: italic;
}
-:disabled
-{
- background: #dddddd;
+/* ------------------------------------ */
+/* ----------- Modal Styles ----------- */
+/* ------------------------------------ */
+
+@keyframes fade-in {
+ from {opacity: 0;}
+ to {opacity: 1;}
}
-/* Modals */
+/* general modal styles */
+#modal-generic {
+ position: absolute;
+ width: initial;
+ height: initial;
+ max-width: 1200px;
+ min-width: 500px;
+ background-color: #ffffff90;
+ box-shadow: 0px 0px 5000px 5000px #0000005c;
+ z-index: 9999;
+ border-radius: 5px;
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ overflow: hidden;
+ display: none;
+ animation: fade-in 0.2s ease-in-out forwards;
+}
+.modal-dialog {
+ width: fit-content;
+ height: fit-content;
+ border-radius: 3px;
+ position: relative;
+ overflow: hidden;
+ background-color: white;
+ backdrop-filter: blur(20px);
+ min-width: 500px;
+ max-width: 100%;
+ /* min-height: 300px; */
+}
+.modal-header {
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px;
+ box-sizing: border-box;
+ background-color: #488bcb;
+ color: white;
+ font-size: 15px;
+ height: 40px;
+}
+.modal-close {
+ cursor: pointer;
+}
.modal-body
{
max-height: 600px;
overflow-y: auto;
+ padding: 20px;
+ box-sizing: border-box;
+ font-size: 12px;
}
-
-.modal-content
-{
- opacity: 1 !important;
+.modal-body-section {
+ align-items: flex-start;
}
-
-.modal-backdrop
-{
- opacity: 0.3 !important;
+.modal-subtitle-container {
+ height: 30px;
+}
+.modal-subtitle {
+ font-size: 13px;
+ font-weight: bold;
}
-
.modal-footer
{
- text-align: left !important;
+ padding: 10px;
+ max-height: 40px;
+ height: fit-content;
}
-
-.modal-footer-error
+.modal-footer-error, .modal-input-error
{
color: #aa0000;
}
+.modal-body-section-left {
+ align-items: flex-start;
+}
+
+/* project-users modal styles */
+#admins-and-workers-tables {
+ align-items: flex-start;
+ gap: 25px;
+
+ .table-responsive {
+ width: 100%;
+ }
+}
+
+/* user preferences modal */
+#checkbox-send_email {
+ flex-grow: 0; /* overwrite general input element styles (which have flex-grow value of 1) */
+}
+
+/* resource assignment modal */
+#resource-assignment-actions-container {
+ height: fit-content;
+ padding: 5px;
+ border: 1px solid #cecece;
+ border-radius: 3px;
+ background-color: #f9f9f9;
+ max-width: 150px;
+}
+
+/* job settings modal */
+#workflowjob-settings:first-child {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+}
+
+#workflowjob-settings {
+
+}
+
+.this-is-my-class {
+ background-color: green;
+}
+
+
+
+/* ------------ */
+/* Table styles */
+/* ------------ */
-/* Table overrides */
/**
* Make text in table unselectable. This helps make multiple selection look better.
*/
@@ -241,17 +1062,9 @@ table
.table tr.clickable-row.active td
{
- background-color: #93DB70;
-}
-
-div.table-control
-{
- width: 100%;
- padding-left: 10px;
- padding-right: 10px;
+ background-color: var(--secondary-app-color);
}
-
-div.table-control span
+.table-control span
{
display:inline-block;
font-size: var(--size-font);
@@ -290,4 +1103,35 @@ table.scroll
overflow-x: hidden;
}
-.tags-input{display:inline-block;padding:0 2px;background:#FFF;border:1px solid #CCC;width:16em;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.tags-input .tag{display:inline-block;background:#EEE;color:#444;padding:0 4px;margin:2px;border:1px solid #CCC;border-radius:2px;font:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;transition:all .1s ease}.tags-input .tag.selected{background-color:#777;border-color:#777;color:#EEE}.tags-input .tag.dupe{-webkit-transform:scale3d(1.2,1.2,1.2);transform:scale3d(1.2,1.2,1.2);background-color:#FCC;border-color:#700}.tags-input input{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:inline-block!important;padding:3px;margin:0!important;background:0 0!important;border:none!important;box-shadow:none!important;font:inherit!important;font-size:100%!important;outline:0!important}.tags-input .selected~input{opacity:.3}
+/* Styles for smaller devices */
+@media screen and (max-width: 768px) {
+ /* .rodan-region {
+ width: 100%;
+ }
+ #region-navigation {
+ height: 7%;
+ width: 100%;
+ overflow: hidden;
+ }
+ #app-navbar {
+ height: 100%;
+ width: 100%;
+ flex-direction: column;
+ }
+ .navbar-section.main-navbar-section {
+ width: 98%;
+ }
+ #rodan-logo {
+ height: 100%;
+ justify-content: center;
+ }
+ .navbar-sections-wrapper {
+ display: none;
+ }
+ #region-main {
+ height: 93%;
+ width: 100%;
+ } */
+}
+
+.tags-input{display:inline-block;padding:0 2px;background:#FFF;border:1px solid #CCC;width:16em;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.tags-input .tag{display:inline-block;background:#EEE;color:#444;padding:0 4px;margin:2px;border:1px solid #CCC;border-radius:2px;font:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;transition:all .1s ease}.tags-input .tag.selected{background-color:#777;border-color:#777;color:#EEE}.tags-input .tag.dupe{-webkit-transform:scale3d(1.2,1.2,1.2);transform:scale3d(1.2,1.2,1.2);background-color:#FCC;border-color:#700}.tags-input input{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:inline-block!important;padding:3px;margin:0!important;background:0 0!important;border:none!important;box-shadow:none!important;font:inherit!important;font-size:100%!important;outline:0!important}.tags-input .selected~input{opacity:.3}
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html b/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html
index ea4b38f1f..a2e23f0e8 100644
--- a/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html
+++ b/rodan-client/code/templates/Views/Master/Main/InputPort/Collection/template-main_inputport_collection_item.html
@@ -1,2 +1,2 @@
<%= label %>
-Delete
\ No newline at end of file
+ disabled <%} %>>Delete
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html
index 82358e747..d94c3dda2 100644
--- a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection.html
@@ -4,6 +4,7 @@ Input Port Types
Name
+ Current
Min
Max
diff --git a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html
index ece49558a..67ef0f0e4 100644
--- a/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html
+++ b/rodan-client/code/templates/Views/Master/Main/InputPortType/Collection/template-main_inputporttype_collection_item.html
@@ -1,4 +1,7 @@
<%= name %>
+<%= current %>
<%= minimum %>
<%= maximum %>
-Add
\ No newline at end of file
+
+ = maximum && maximum !== 0) {%> disabled <%} %>>Add
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html
new file mode 100644
index 000000000..44cd46723
--- /dev/null
+++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_activation-required.html
@@ -0,0 +1,7 @@
+
+
An activation email has been send to the email you registered with. Please check your inbox to verify your account before you sign in.
+
+
+ Resend Activation Email
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html
new file mode 100644
index 000000000..7a72acce0
--- /dev/null
+++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_forgot-password.html
@@ -0,0 +1,11 @@
+
+
Please enter your email. If there is an account associated with the email address, you will receive a link to reset your password.
+
Email:
+
+
+
+
+
+ Submit
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html
index ebea17db8..a23fe9a21 100644
--- a/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html
+++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_login.html
@@ -2,7 +2,7 @@
diff --git a/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html b/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html
new file mode 100644
index 000000000..26b17df21
--- /dev/null
+++ b/rodan-client/code/templates/Views/Master/Main/Login/template-main_register.html
@@ -0,0 +1,24 @@
+
+
Username:
+
+
+
+
Email:
+
+
+
+
Password:
+
+
+
+
Confirm password:
+
+
+
+
+
+
+
+ Register
+
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html b/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html
index ea4b38f1f..a2e23f0e8 100644
--- a/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html
+++ b/rodan-client/code/templates/Views/Master/Main/OutputPort/Collection/template-main_outputport_collection_item.html
@@ -1,2 +1,2 @@
<%= label %>
-
Delete
\ No newline at end of file
+
disabled <%} %>>Delete
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html
index a28a295da..2877440a3 100644
--- a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection.html
@@ -4,6 +4,7 @@
Output Port Types
Name
+ Current
Min
Max
diff --git a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html
index 7ea4ebb5f..063588554 100644
--- a/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html
+++ b/rodan-client/code/templates/Views/Master/Main/OutputPortType/Collection/template-main_outputporttype_collection_item.html
@@ -1,4 +1,7 @@
<%= name %>
+<%= current %>
<%= minimum %>
<%= maximum %>
-Add
\ No newline at end of file
+
+ = maximum && maximum !== 0) {%> disabled <%} %>>Add
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html b/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html
index 026e79816..12a32e405 100644
--- a/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/Project/Collection/template-main_project_collection.html
@@ -1,20 +1,26 @@
-Projects
-Create new Project
-
-
-
-
-
- Name
- Creator
- Created
- Updated
- Resources
- Resource Lists
- Workflows
-
-
-
-
-
+
+
+
My Projects
+
Create new Project
+
+
+
+
+
+
+
+
+ Name
+ Creator
+ Created
+ Updated
+ Resources
+ Resource Lists
+ Workflows
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html
index 660e0d320..cc6ef5e97 100644
--- a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_individual.html
@@ -1,20 +1,83 @@
-
-
Project
-
Name:
-
-
Description:
-
- Creator: <%= creator %>
- Created on: <%= _.formatFromUTC(created) %>
- Updated on: <%= _.formatFromUTC(updated) %>
- URL: <%= url %>
-
-
Users
-
Resources: <%= resource_count%>
-
-
Workflows: <%= workflow_count%>
-
Run Jobs
-
Save
-
Delete
+
+
+
+
My Projects / <%= name %>
+
+
+
+
+
+
+
+ Workflow Runs
+ Run Jobs
+ Workflows
+ Resources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name:
+
+
+
+
+ Description:
+
+
+
+
+
Creator:
+
<%= creator %>
+
+
+
+
Created on:
+
<%= _.formatFromUTC(created) %>
+
+
+
+
Updated on:
+
<%= _.formatFromUTC(updated) %>
+
+
+
+
+
+
+
+ Edit Users
+ Save
+ Delete
+
+
+
+
+
+
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html
index 13a17847a..17272c060 100644
--- a/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html
+++ b/rodan-client/code/templates/Views/Master/Main/Project/Individual/template-main_project_users.html
@@ -1,28 +1,22 @@
-
-
-
+
+
Select a user and add them as an admin or worker
+
+
+
+ Add as Admin
+ Add as Worker
+
-
-
-
Admins
+
+
-
diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html b/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html
index 241172a40..78bc4b168 100644
--- a/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/Resource/Collection/template-main_resource_collection.html
@@ -1,12 +1,12 @@
-
Resources
-
- Upload Resource(s)
-
-
- Label(s)
-
-
-
+
+
+ Upload Resources
+
+
+ Uploaded resource labels:
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html
index 7bd728ddc..ee33a8199 100644
--- a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual.html
@@ -1,25 +1,53 @@
-
-
Resource
-
Name:
-
-
Description:
-
-
Label(s):
-
- Creator: <%= creator %>
- Created: <%= _.formatFromUTC(created) %>
- Updated: <%= _.formatFromUTC(updated) %>
- URL: <%= url %>
- Type:
-
-
- Save
- View
- Download
- Delete
-
-
-
Note: opening the Resource "View" (if available) may require authentication, but no authentication is required for "Download".
+
+
+
+
+
+ Name:
+
+
+
+
+ Description:
+
+
+
+
+ Label(s):
+
+
+
+
Creator:
+
<%= creator %>
+
+
+
Created:
+
<%= _.formatFromUTC(created) %>
+
+
+
Updated:
+
<%= _.formatFromUTC(updated) %>
+
+
+
+
+
+
+
+ View
+ Download
+ Save
+ Delete
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html
index cb84cb76d..a7a94e52d 100644
--- a/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html
+++ b/rodan-client/code/templates/Views/Master/Main/Resource/Individual/template-main_resource_individual_multi.html
@@ -1,20 +1,39 @@
-
-
Resources
- <%- count %> Resources Selected
-
Type:
-
+
+
+
+
+
+
+
+
<%- count %> Resources Selected.
+
+
+ Type:
+
+
<% if (isSameLabel) { %>
-
- Label(s)
-
+
+ Labels:
+
+
<% } %>
-
-
-
Save
-
View
-
Download
-
Delete
+
+
Note: multi-selecting resources is still experimental.
-
-
Note: multi-selecting resources is still experimental.
+
+
+
+
+ View
+ Download
+ Save
+ Delete
+
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html b/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html
index 46c9dd64c..bdb2a3390 100644
--- a/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html
+++ b/rodan-client/code/templates/Views/Master/Main/ResourceAssignment/template-main_resourceassignment.html
@@ -1,22 +1,26 @@
-
-
-
Available Resources
-
+
+
+
+
Available Resources
+
+
-
-
-
Add selected
-
Add all
-
-
-
-
Remove selected
-
Remove all
+
+
+ Add selected
+ Add all
+
+ Remove selected
+ Remove all
-
-
Assigned Resources
-
Resource(s) Assigned
-
+
+
+
Assigned Resources -
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html b/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html
index cd817211a..d056cc923 100644
--- a/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/ResourceList/Collection/template-main_resourcelist_collection.html
@@ -1,4 +1,4 @@
-
Resource Lists
+
Create new Resource List
diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html b/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html
index e41b61924..be79f6e3e 100644
--- a/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/ResourceList/Individual/template-main_resourcelist_individual.html
@@ -1,4 +1,4 @@
-
+
Resource List
Name:
diff --git a/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html b/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html
index 979f1a9d6..896aef3f6 100644
--- a/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/ResourceType/template-resourcetype_collection.html
@@ -1,4 +1,4 @@
-
Resource Types
+
diff --git a/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html b/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html
index 9e5429d6c..63ff4dd2d 100644
--- a/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/RunJob/Collection/template-main_runjob_collection.html
@@ -1,5 +1,3 @@
-Run Jobs
-
diff --git a/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html b/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html
index e9f915de0..6282dc1e6 100644
--- a/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/RunJob/Individual/template-main_runjob_individual.html
@@ -1,13 +1,39 @@
-
-
Run Job
- Name: <%= job_name %>
- Created: <%= _.formatFromUTC(created) %>
- Updated: <%= _.formatFromUTC(updated) %>
- Status: <%= statusText %>
-
- Open
-
- Error summary: <%= error_summary %>
- Error details:
-
+
+
+
+
+
+
+
Name:
+
<%= job_name %>
+
+
+
Created:
+
<%= _.formatFromUTC(created) %>
+
+
+
Updated:
+
<%= _.formatFromUTC(updated) %>
+
+
+
Status:
+
<%= statusText %>
+
+
+
Error summary:
+
<%= error_summary %>
+
+
+
+
+
+
+ Open
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html b/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html
index 740011fd9..7c6652adb 100644
--- a/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html
+++ b/rodan-client/code/templates/Views/Master/Main/User/Collection/template-main_user_collection_item_remove.html
@@ -1,4 +1,4 @@
<%= username %>
<%= first_name %>
<%= last_name %>
-
Remove
\ No newline at end of file
+
Remove
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html
index 3057cfedb..2f3732ab7 100644
--- a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_individual.html
@@ -1,26 +1,42 @@
-
-
Username:
-
-
+
-
First name:
-
-
+
+
+
-
Last name:
-
-
+
-
Email:
-
-
+
-
-
Receive Rodan notifications via email
+
-
Waiting for user preferences to load.
-
-
Save
-
Change Password
+
+
+
Waiting for user preferences to load.
+
+ Save
+ Change Password
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html
index 253b8154f..47ca62978 100644
--- a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html
+++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_password.html
@@ -1,4 +1,4 @@
-
+
Current Password:
Password:
diff --git a/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html
new file mode 100644
index 000000000..240e46db9
--- /dev/null
+++ b/rodan-client/code/templates/Views/Master/Main/User/Individual/template-main_user_reset-password.html
@@ -0,0 +1,12 @@
+
+
Password:
+
+
Confirm password:
+
+
+
+
+
+ Submit
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html b/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html
index ae7299bc2..5f4a36a8e 100644
--- a/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/Workflow/Collection/template-main_workflow_collection.html
@@ -1,11 +1,11 @@
-
Workflows
-
-
Create new Workflow
-
- Import Workflow from file
+
+
Create new Workflow
+
+ Import Workflow from file
+
-
+
diff --git a/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html b/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html
index 3840977d5..8c6859c75 100644
--- a/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/Workflow/Individual/template-main_workflow_individual.html
@@ -1,19 +1,48 @@
-
-
Workflow
-
Name:
-
-
Description:
-
- Creator: <%= creator %>
- Created: <%= _.formatFromUTC(created) %>
- Updated: <%= _.formatFromUTC(updated) %>
- URL: <%= url %>
- Valid: <%= valid %>
-
-
Copy
-
Export
-
Save
-
Edit
-
Delete
+
+
+
+
+
+
+ Name:
+
+
+
+ Description:
+
+
+
+
Creator:
+
<%= creator %>
+
+
+
Created:
+
<%= _.formatFromUTC(created) %>
+
+
+
Updated:
+
<%= _.formatFromUTC(updated) %>
+
+
+
+
Valid:
+
<%= valid %>
+
+
+
+
+
+ Copy
+ Export
+ Edit
+ Save
+ Delete
+
diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html
index a569b04f5..484c6e622 100644
--- a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html
+++ b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob.html
@@ -1,7 +1,16 @@
-
Name:
-
-
-
Job: <%= job_name %>
+
+ Name:
+
+
+
+
+ Job:
+ <%= job_name %>
+
+
-
Save
-
Delete
\ No newline at end of file
+
+
+ Save
+ Delete
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html
index f542023f4..fa4af1c87 100644
--- a/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html
+++ b/rodan-client/code/templates/Views/Master/Main/WorkflowJob/template-main_workflowjob_settings.html
@@ -1,2 +1,2 @@
-
-
Save
\ No newline at end of file
+
+
Save
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html
index 8cf2d2cea..b230f3ec1 100644
--- a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html
+++ b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Collection/template-main_workflowrun_collection.html
@@ -1,10 +1,10 @@
-
Workflow Runs
+
Name
- Creator
+ Creator
Created
Updated
Status
diff --git a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html
index c8a903ed5..c1e5bc1a9 100644
--- a/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html
+++ b/rodan-client/code/templates/Views/Master/Main/WorkflowRun/Individual/template-main_workflowrun_individual.html
@@ -1,23 +1,81 @@
-
-
-
Workflow Run
-
Name:
-
-
Description:
-
- Creator: <%= creator %>
- Created on: <%= _.formatFromUTC(created) %>
- Updated on: <%= _.formatFromUTC(updated) %>
- URL: <%= url %>
- Status: <%= statusText %>
-
Save
-
Delete
+
+
-
-
-
Resources | Run Jobs
-
-
+
+
+
+
+
+
+
+
Creator:
+
<%= creator %>
+
+
+
+ Name:
+
+
+
+
+ Description:
+
+
+
+
+
Creator:
+
<%= creator %>
+
+
+
+
Created on:
+
<%= _.formatFromUTC(created) %>
+
+
+
+
Updated on:
+
<%= _.formatFromUTC(updated) %>
+
+
+
+
+
+
Status:
+
<%= statusText %>
+
+
+
+
+
+
+ Save
+ Delete
+
+
+
+
+
+
+
+
+
WORKFLOW RUN RESOURCES & RUN JOBS
+
+
+
+
+ Resources
+ Run Jobs
+
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html
index f37c18165..89d030229 100644
--- a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html
+++ b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model.html
@@ -1,4 +1,16 @@
-
-
-
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html
index 7683d341b..b3ddb9bff 100644
--- a/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html
+++ b/rodan-client/code/templates/Views/Master/Main/template-main_layoutview_model_inverse.html
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html b/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html
index 866b145d5..ecddb3b19 100644
--- a/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html
+++ b/rodan-client/code/templates/Views/Master/Misc/template-misc_about.html
@@ -1,18 +1,26 @@
-
Rodan server
-Version: <%= version %>
-URI: <%= hostname %>
-Last known server date/time: <%= date %>
-Pagination length: <%= serverConfiguration.page_length %>
-Job packages:
-
-<% for(var package in serverConfiguration.job_packages) { %>
- <%= package %> (<%= serverConfiguration.job_packages[package] %>)
-<% } %>
-
-
-
Rodan client
-
-<% for(var field in client) { %>
- <%= field %>: <%= client[field] %>
-<% } %>
-
+
+
+
Rodan server
+
Version: <%= version %>
+
URI: <%= hostname %>
+
Last known server date/time: <%= date %>
+
Pagination length: <%= serverConfiguration.page_length %>
+
Job packages:
+
+ <% for(var package in serverConfiguration.job_packages) { %>
+ <%= package %> (<%= serverConfiguration.job_packages[package] %>)
+ <% } %>
+
+
+
+
+
+
+
Rodan client
+
+ <% for(var field in client) { %>
+ <%= field %>: <%= client[field] %>
+ <% } %>
+
+
+
diff --git a/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html b/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html
index 0b824fab2..8aad76ffa 100644
--- a/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html
+++ b/rodan-client/code/templates/Views/Master/Misc/template-misc_help.html
@@ -1,2 +1,4 @@
-Please visit
<%= url %>
-Client admin:
<%= name %>
\ No newline at end of file
+
+ Please visit
<%= url %>
+ Client admin:
<%= name %>
+
\ No newline at end of file
diff --git a/rodan-client/code/templates/Views/Master/Modal/template-modal.html b/rodan-client/code/templates/Views/Master/Modal/template-modal.html
index aa114f795..0f204862e 100644
--- a/rodan-client/code/templates/Views/Master/Modal/template-modal.html
+++ b/rodan-client/code/templates/Views/Master/Modal/template-modal.html
@@ -1,12 +1,10 @@
-