diff --git a/.ackrc b/.ackrc
new file mode 100644
index 00000000..a394d3ac
--- /dev/null
+++ b/.ackrc
@@ -0,0 +1,4 @@
+--ignore-dir=dist
+--ignore-dir=www/img
+--ignore-dir=www/font
+--ignore-file=is:bootstrap.min.css
diff --git a/.babelrc b/.babelrc
new file mode 100644
index 00000000..dc885ae2
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,6 @@
+{
+ "presets": ["env"]
+, "plugins": [
+ "transform-object-rest-spread"
+ ]
+}
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000..a893383e
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,5 @@
+.git
+.gitignore
+README.md
+Dockerfile
+.gitlab-ci.yml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..8183e4f1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+dist
+terraform/.terraform
+terraform/.terraform/environment
+terraform/*.tfstate.backup
+terraform/*.tfstate
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 00000000..1f6c0d58
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,123 @@
+variables:
+ CI_DISPOSABLE_ENVIRONMENT: "true"
+ CLOUD_SDK_VERSION: "218.0.0"
+ DOCKER_DRIVER: overlay2
+
+image: blockstream/gcloud-docker@sha256:86c3b471e6aa9790007fbd7dff459737d81947277ac612d2c18d2cf3aee62d19
+stages:
+ - build
+ - deploy
+
+before_script:
+ - TMPF=$(mktemp) || exit 1
+ - echo $GCLOUD_KEY > $TMPF
+ - export GOOGLE_APPLICATION_CREDENTIALS=$TMPF
+ - gcloud auth activate-service-account --key-file=$TMPF
+ - gcloud auth list
+ - gcloud --version
+
+test_docker_build_image:
+ image: docker@sha256:f7211e1779c82e3a50d0d6f165e83f3e2be217a234b0181d5e8bee411d8fcc5f
+ stage: build
+ before_script:
+ - echo "Disabling before script"
+ except:
+ - tags
+ - master
+ script:
+ - docker build --build-arg CUSTOM_HTML='' -t esplora .
+ - docker rmi esplora
+
+build:
+ stage: build
+ only:
+ - /^bitcoin_mainnet.*/
+ - /^bitcoin_testnet.*/
+ - /^liquid_mainnet.*/
+ - master@greenaddress/esplora
+ script:
+ - gcloud container images list-tags gcr.io/green-address-explorer/explorer-deploy | grep -q $CI_COMMIT_SHA || (
+ docker build
+ --squash
+ --build-arg CUSTOM_HTML=''
+ --cache-from gcr.io/green-address-explorer/explorer-deploy:latest
+ -t gcr.io/green-address-explorer/explorer-deploy:$CI_COMMIT_SHA
+ -t gcr.io/green-address-explorer/explorer-deploy:latest .
+ && docker push gcr.io/green-address-explorer/explorer-deploy:$CI_COMMIT_SHA)
+
+deploy:
+ stage: deploy
+ image:
+ name: blockstream/gcloud-terraform@sha256:40e23b0e89a66ae24e1e8ee9770b9bab3b71ebae50615c8ff5023ff3d5392344
+ entrypoint: [""]
+ only:
+ - master@greenaddress/esplora
+ script:
+ - (cd terraform && terraform init -input=false)
+ - (cd terraform && terraform workspace select main)
+ - (cd terraform && terraform apply
+ -var "prometheus_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP"
+ -var "machine_type=$GRAF_PROM_MACHINE_TYPE"
+ -var "hosts=$HOSTS"
+ -var "hosts_onion=$HOSTS_ONION"
+ -var "cluster_size=$NODE_CLUSTER_SIZE"
+ -var "instance_type=$NODE_INSTANCE_TYPE"
+ -var "regions=$REGIONS"
+ -var "zones=$ZONES"
+ -var "ssl_certs=$SSL_CERTS"
+ -var "opsgenie_api_key=$OPSGENIE_API_KEY"
+ -input=false -auto-approve)
+
+deploy_bitcoin_mainnet:
+ stage: deploy
+ image:
+ name: blockstream/gcloud-terraform@sha256:40e23b0e89a66ae24e1e8ee9770b9bab3b71ebae50615c8ff5023ff3d5392344
+ entrypoint: [""]
+ only:
+ - /^bitcoin_mainnet.*/
+ script:
+ - (cd terraform && terraform init -input=false)
+ - (cd terraform && terraform workspace select bitcoin-mainnet)
+ - (cd terraform && terraform apply
+ -var "docker_tag_explorer=gcr.io/green-address-explorer/explorer-deploy:$CI_COMMIT_SHA"
+ -var "cluster_size=$NODE_CLUSTER_SIZE"
+ -var "instance_type=$NODE_INSTANCE_TYPE"
+ -var "regions=$REGIONS"
+ -var "zones=$ZONES"
+ -input=false -auto-approve)
+
+deploy_bitcoin_testnet:
+ stage: deploy
+ image:
+ name: blockstream/gcloud-terraform@sha256:40e23b0e89a66ae24e1e8ee9770b9bab3b71ebae50615c8ff5023ff3d5392344
+ entrypoint: [""]
+ only:
+ - /^bitcoin_testnet.*/
+ script:
+ - (cd terraform && terraform init -input=false)
+ - (cd terraform && terraform workspace select bitcoin-testnet)
+ - (cd terraform && terraform apply
+ -var "docker_tag_explorer=gcr.io/green-address-explorer/explorer-deploy:$CI_COMMIT_SHA"
+ -var "cluster_size=$NODE_CLUSTER_SIZE"
+ -var "instance_type=$NODE_INSTANCE_TYPE"
+ -var "regions=$REGIONS"
+ -var "zones=$ZONES"
+ -input=false -auto-approve)
+
+deploy_liquid_mainnet:
+ stage: deploy
+ image:
+ name: blockstream/gcloud-terraform@sha256:40e23b0e89a66ae24e1e8ee9770b9bab3b71ebae50615c8ff5023ff3d5392344
+ entrypoint: [""]
+ only:
+ - /^liquid_mainnet.*/
+ script:
+ - (cd terraform && terraform init -input=false)
+ - (cd terraform && terraform workspace select liquid-mainnet)
+ - (cd terraform && terraform apply
+ -var "docker_tag_explorer=gcr.io/green-address-explorer/explorer-deploy:$CI_COMMIT_SHA"
+ -var "cluster_size=$NODE_CLUSTER_SIZE"
+ -var "instance_type=$NODE_INSTANCE_TYPE"
+ -var "regions=$REGIONS"
+ -var "zones=$ZONES"
+ -input=false -auto-approve)
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..2f7ca29d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,41 @@
+FROM blockstream/esplora-base@sha256:b9c388dd7e99bb808fce981fc788a1915976a4236881b95001847b373514e1d5 AS build
+
+FROM debian:stretch@sha256:802706fa62e75c96fff96ada0e8ca11f570895ae2e9ba4a9d409981750ca544c
+
+COPY --from=build /srv/explorer /srv/explorer
+COPY --from=build /root/.nvm /root/.nvm
+
+RUN sed -i 's/deb.debian.org/httpredir.debian.org/g' /etc/apt/sources.list \
+ && apt-get -yqq update \
+ && apt-get -yqq upgrade \
+ && apt-get -yqq install nginx supervisor tor git curl
+
+RUN mkdir /tmp/explorer \
+ && mkdir -p /srv/explorer/static
+
+COPY ./ /tmp/explorer
+
+ARG CUSTOM_HTML
+
+WORKDIR /tmp/explorer
+
+SHELL ["/bin/bash", "-c"]
+
+# required to run some scripts as root (needed for docker)
+RUN source /root/.nvm/nvm.sh \
+ && npm config set unsafe-perm true \
+ && npm run dist:bitcoin-testnet \
+ && npm run dist:bitcoin-mainnet \
+ && npm run dist:liquid-mainnet \
+ && mv dist/* /srv/explorer/static
+
+# configuration
+RUN cp /tmp/explorer/contrib/*.conf.in /tmp/explorer/contrib/*torrc /tmp/explorer/run.sh /tmp/explorer/cli.sh.in /srv/explorer/
+
+# cleanup
+RUN apt-get --auto-remove remove -yqq --purge manpages git curl \
+ && apt-get clean \
+ && apt-get autoclean \
+ && rm -rf /usr/share/doc* /usr/share/man /usr/share/postgresql/*/man /var/lib/apt/lists/* /var/cache/* /tmp/* /root/.cache /*.deb /root/.nvm /root/.cargo
+
+WORKDIR /srv/explorer
diff --git a/Dockerfile.deps b/Dockerfile.deps
new file mode 100644
index 00000000..1ff5fb27
--- /dev/null
+++ b/Dockerfile.deps
@@ -0,0 +1,49 @@
+FROM debian:stretch@sha256:802706fa62e75c96fff96ada0e8ca11f570895ae2e9ba4a9d409981750ca544c
+
+SHELL ["/bin/bash", "-c"]
+
+RUN mkdir -p /srv/explorer \
+ && sed -i 's/deb.debian.org/httpredir.debian.org/g' /etc/apt/sources.list \
+ && apt-get -yqq update \
+ && apt-get -yqq upgrade \
+ && apt-get -yqq install clang cmake nginx supervisor curl git tor
+
+RUN git clone --quiet --depth 1 --single-branch --branch v0.33.11 https://github.com/creationix/nvm.git /root/.nvm \
+ && rm -rf /root/.nvm/.git \
+ && source /root/.nvm/nvm.sh \
+ && nvm install v8.11.4
+
+ENV SHA256SUM_BITCOINCORE=9d6b472dc2aceedb1a974b93a3003a81b7e0265963bd2aa0acdcb17598215a4f
+RUN curl -sL -o bitcoin.tar.gz https://bitcoincore.org/bin/bitcoin-core-0.17.0/bitcoin-0.17.0-x86_64-linux-gnu.tar.gz \
+ && echo "${SHA256SUM_BITCOINCORE} bitcoin.tar.gz" | sha256sum --check \
+ && tar xzf bitcoin.tar.gz -C /srv/explorer \
+ && ln -s /srv/explorer/bitcoin-0.17.0 /srv/explorer/bitcoin \
+ && rm bitcoin.tar.gz
+
+ENV SHA256SUM_LIQUID=ea2836aa267b32b29e890acdd5e724b4be225c34891fd26426ce741c12c1e166
+RUN curl -sL -o liquid.tar.gz https://github.com/Blockstream/liquid/releases/download/liquid.3.14.1.21/liquid-3.14.1.21-x86_64-linux-gnu.tar.gz \
+ && echo "${SHA256SUM_LIQUID} liquid.tar.gz" | sha256sum --check \
+ && tar xzf liquid.tar.gz -C /srv/explorer \
+ && ln -s /srv/explorer/liquid-3.14.1.21 /srv/explorer/liquid \
+ && rm liquid.tar.gz
+
+RUN curl https://sh.rustup.rs -sSf | sh -s -- -y \
+ && source /root/.cargo/env \
+ && mkdir -p /srv/explorer/electrs{,_liquid} \
+ && git clone --no-checkout https://github.com/greenaddress/electrs.git \
+ && cd electrs \
+ && git checkout 32239bd7f56e0e5076f7cf7f546dc748026f4569 \
+ && cargo build --release \
+ && cargo install --root /srv/explorer/electrs_bitcoin \
+ && git checkout --force e82c904f2662371319eab16d4ddbcf5e35cbf93a \
+ && cargo build --release \
+ && cargo install --root /srv/explorer/electrs_liquid \
+ && cd .. \
+ && rm -fr /root/.cargo electrs \
+ && strip /srv/explorer/electrs_*/bin/electrs
+
+# cleanup
+RUN apt-get --auto-remove remove -yqq --purge clang cmake manpages curl git \
+ && apt-get clean \
+ && apt-get autoclean \
+ && rm -rf /usr/share/doc* /usr/share/man /usr/share/postgresql/*/man /var/lib/apt/lists/* /var/cache/* /tmp/* /root/.cache /*.deb /root/.cargo
diff --git a/Dockerfile.docker b/Dockerfile.docker
new file mode 100644
index 00000000..bc91efbf
--- /dev/null
+++ b/Dockerfile.docker
@@ -0,0 +1,22 @@
+FROM docker@sha256:f7211e1779c82e3a50d0d6f165e83f3e2be217a234b0181d5e8bee411d8fcc5f
+
+ENV CLOUD_SDK_VERSION="224.0.0"
+ENV PATH=/opt/google-cloud-sdk/bin:$PATH
+
+WORKDIR /opt
+
+RUN wget https://github.com/DeviaVir/terraform-provider-customconfig/releases/download/v0.0.1/terraform-provider-customconfig_0.0.1_linux_amd64.tgz \
+ && tar xzf terraform-provider-customconfig_0.0.1_linux_amd64.tgz \
+ && mkdir -p $HOME/.terraform.d/plugins/ \
+ && mv terraform-provider-customconfig_v0.0.1 $HOME/.terraform.d/plugins/
+
+RUN apk --no-cache add curl python py-crcmod bash libc6-compat openssh-client git gnupg \
+ && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && ln -s /lib /lib64
+
+RUN /opt/google-cloud-sdk/bin/gcloud config set core/disable_usage_reporting true \
+ && /opt/google-cloud-sdk/bin/gcloud config set component_manager/disable_update_check true \
+ && /opt/google-cloud-sdk/bin/gcloud config set metrics/environment github_docker_image \
+ && /opt/google-cloud-sdk/bin/gcloud auth configure-docker
diff --git a/Dockerfile.terraform b/Dockerfile.terraform
new file mode 100644
index 00000000..96ce1c72
--- /dev/null
+++ b/Dockerfile.terraform
@@ -0,0 +1,22 @@
+FROM hashicorp/terraform@sha256:3d5eb7a88d94f5216658b804acd70597e0315b8839a099a3d33baa45494bca65
+
+ENV CLOUD_SDK_VERSION="224.0.0"
+ENV PATH=/opt/google-cloud-sdk/bin:$PATH
+
+WORKDIR /opt
+
+RUN wget https://github.com/DeviaVir/terraform-provider-customconfig/releases/download/v0.0.1/terraform-provider-customconfig_0.0.1_linux_amd64.tgz \
+ && tar xzf terraform-provider-customconfig_0.0.1_linux_amd64.tgz \
+ && mkdir -p $HOME/.terraform.d/plugins/ \
+ && mv terraform-provider-customconfig_v0.0.1 $HOME/.terraform.d/plugins/
+
+RUN apk --no-cache add curl python py-crcmod bash libc6-compat openssh-client git gnupg \
+ && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
+ && ln -s /lib /lib64
+
+RUN /opt/google-cloud-sdk/bin/gcloud config set core/disable_usage_reporting true \
+ && /opt/google-cloud-sdk/bin/gcloud config set component_manager/disable_update_check true \
+ && /opt/google-cloud-sdk/bin/gcloud config set metrics/environment github_docker_image \
+ && /opt/google-cloud-sdk/bin/gcloud auth configure-docker
diff --git a/HACKS.md b/HACKS.md
new file mode 100644
index 00000000..3787b4fd
--- /dev/null
+++ b/HACKS.md
@@ -0,0 +1,5 @@
+- @cycle/history had to be patched (via patch-package) to properly handle
+
+- search form submissions were not properly caught by cyclejs's dom driver, had to be
+ worked around with a hairy hack.
+
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..0b978862
--- /dev/null
+++ b/README.md
@@ -0,0 +1,57 @@
+# How to build the Docker image
+
+```
+docker build -t esplora .
+```
+
+# How to run the explorer for Bitcoin mainnet
+
+```
+docker run --port 8080:80 \
+ --volume $PWD/data_bitcoin_mainnet:/data \
+ --rm -i -t esplora \
+ bash -c "/srv/explorer/run.sh bitcoin-mainnet explorer"
+```
+
+# How to run the explorer for Liquid mainnet
+
+```
+docker run --port 8082:80 \
+ --volume $PWD/data_liquid_mainnet:/data \
+ --rm -i -t esplora \
+ bash -c "/srv/explorer/run.sh liquid-mainnet explorer"
+```
+
+# How to run the explorer for Bitcoin testnet3
+
+```
+docker run --port 8084:80 \
+ --volume $PWD/data_bitcoin_testnet:/data \
+ --rm -i -t esplora \
+ bash -c "/srv/explorer/run.sh bitcoin-testnet explorer"
+```
+
+
+# Build new esplora-base
+
+```
+docker build -t blockstream/esplora-base:latest -f Dockerfile.deps .
+docker push blockstream/esplora-base:latest
+docker inspect --format='{{index .RepoDigests 0}}' blockstream/esplora-base
+```
+
+# Build new gcloud-docker
+
+```
+docker build --squash -t blockstream/gcloud-docker:latest -f Dockerfile.docker .
+docker push blockstream/gcloud-docker:latest
+docker inspect --format='{{index .RepoDigests 0}}' blockstream/gcloud-docker
+```
+
+# Build new gcloud-terraform
+
+```
+docker build --squash -t blockstream/gcloud-terraform:latest -f Dockerfile.terraform .
+docker push blockstream/gcloud-terraform:latest
+docker inspect --format='{{index .RepoDigests 0}}' blockstream/gcloud-terraform
+```
diff --git a/build.sh b/build.sh
new file mode 100755
index 00000000..bae4cacf
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+set -xeo pipefail
+shopt -s extglob
+
+: ${DEST:=dist}
+: ${NODE_ENV:=production}
+
+export NODE_ENV
+
+mkdir -p $DEST
+rm -rf $DEST/*
+
+[[ -d node_modules ]] || npm install
+(cd client && [[ -d node_modules ]] || npm install)
+
+# Static assets
+cp -rL www/* $DEST/
+
+# Index HTML
+pug index.pug -o $DEST
+
+# RTLify CSS
+cat www/style.css | node -p "require('cssjanus').transform(fs.readFileSync('/dev/stdin').toString(), false, true)" > $DEST/style-rtl.css
+
+# Browserify bundle
+(cd client && browserify -p bundle-collapser/plugin app.js \
+ | ( [[ "$NODE_ENV" != "development" ]] && uglifyjs -cm || cat ) ) \
+ > $DEST/app.js
+
+# Pre-render notfound.html
+babel-node render-view.js '{"view":"error","error":"Page Not Found"}' > $DEST/notfound.html
diff --git a/cli.sh.in b/cli.sh.in
new file mode 100755
index 00000000..6284876d
--- /dev/null
+++ b/cli.sh.in
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -eo pipefail
+
+/srv/explorer/{DAEMON}/bin/{DAEMON}-cli -conf=/data/.{DAEMON}.conf "$@"
diff --git a/client/.babelrc b/client/.babelrc
new file mode 100644
index 00000000..facbbb13
--- /dev/null
+++ b/client/.babelrc
@@ -0,0 +1,7 @@
+{
+ "presets": [ "env" ]
+, "plugins": [
+ "transform-object-rest-spread"
+ , ["transform-react-jsx", {"pragma": "Snabbdom.createElement"}]
+ ]
+}
diff --git a/client/app.js b/client/app.js
new file mode 100644
index 00000000..ce1f259b
--- /dev/null
+++ b/client/app.js
@@ -0,0 +1,248 @@
+import 'babel-polyfill'
+import 'bootstrap/js/dist/collapse'
+import EventEmitter from 'events'
+import { Observable as O } from './rxjs'
+import run from '@cycle/rxjs-run'
+import storageDriver from '@cycle/storage'
+import { makeHTTPDriver } from '@cycle/http'
+import { makeDOMDriver } from '@cycle/dom'
+import { makeHistoryDriver, captureClicks } from '@cycle/history'
+import makeRouteDriver from './driver/route'
+import makeSearchDriver from './driver/search'
+
+import { dbg, combine, extractErrors, dropErrors, last, notNully, tryUnconfidentialAddress} from './util'
+import l10n, { defaultLang } from './l10n'
+import * as views from './views'
+
+const apiBase = (process.env.API_URL || '/api').replace(/\/+$/, '')
+ , setBase = ({ ...r, path }) => ({ ...r, url: apiBase + path })
+ , initTitle = document.title
+
+// Temporary bug workaround. Listening with on('form.search', 'submit') was unable
+// to catch some form submissions.
+const searchEm = new EventEmitter
+document.body.addEventListener('submit', e =>
+ e.target.classList.contains('search') && (e.preventDefault(), searchEm.emit('search', e)))
+
+function main({ DOM, HTTP, route, storage, search: searchResult$ }) {
+ const
+
+ reply = (cat, raw) => dropErrors(HTTP.select(cat)).map(r => raw ? r : (r.body || r.text))
+ , on = (sel, ev, opt={}) => DOM.select(sel).events(ev, opt)
+ , click = sel => on(sel, 'click').map(e => e.ownerTarget.dataset)
+
+ /// User actions
+ , route$ = route()
+ , goHome$ = route('/')
+ , goBlock$ = route('/block/:hash').map(loc => loc.params.hash)
+ , goHeight$ = route('/block-height/:height').map(loc => loc.params.height)
+ , goAddr$ = route('/address/:addr').map(loc => loc.params.addr).map(tryUnconfidentialAddress)
+ , goTx$ = route('/tx/:txid').map(loc => loc.params.txid)
+ , goSearch$ = route('/:q([a-zA-Z0-9]+)').map(loc => loc.params.q)
+ , togTx$ = click('[data-toggle-tx]').map(d => d.toggleTx).merge(route$.mapTo(null))
+ , togBlock$ = click('[data-toggle-block]').map(d => d.toggleBlock)
+ , togTheme$ = click('.toggle-theme')
+ , copy$ = click('[data-clipboard-copy]').map(d => d.clipboardCopy)
+ , query$ = O.merge(O.fromEvent(searchEm, 'search').map(e => e.target.querySelector('[name=q]').value), goSearch$)
+
+ , moreBlocks$ = click('[data-loadmore-block-height]').map(d => ({ start_height: d.loadmoreBlockHeight }))
+ , moreBTxs$ = click('[data-loadmore-txs-block]').map(d => ({ block: d.loadmoreTxsBlock, start_index: d.loadmoreTxsIndex }))
+ , moreATxs$ = click('[data-loadmore-txs-addr]').map(d => ({ addr: d.loadmoreTxsAddr, start_index: d.loadmoreTxsIndex }))
+
+ , lang$ = storage.local.getItem('lang').first().map(lang => lang || defaultLang)
+ .concat(on('select[name=lang]', 'input').map(e => e.target.value))
+ .distinctUntilChanged()
+
+ /// Model
+
+ , error$ = extractErrors(HTTP.select().filter(r$ => !r$.request.bg && !r$.request.ignore_err))
+
+ , tipHeight$ = reply('tip-height').map(height => +height)
+
+ // the translation function for the currently selected language
+ , t$ = lang$.map(lang => l10n[lang] || l10n[defaultLang])
+
+ // Active theme
+ , theme$ = storage.local.getItem('theme').first().map(theme => theme || 'dark')
+ .concat(togTheme$).scan(curr => curr == 'dark' ? 'light' : 'dark')
+
+ // Keep track of the number of active in-flight HTTP requests
+ , loading$ = HTTP.select().filter(r$ => !r$.request.bg)
+ .flatMap(r$ => r$.mapTo(-1).catch(_ => O.of(-1)).startWith(+1))
+ .merge(query$.mapTo(+1)).merge(searchResult$.mapTo(-1))
+ .startWith(0).scan((N, a) => N+a)
+
+ // Recent blocks
+ , blocks$ = O.merge(
+ reply('blocks').map(blocks => S => [ ...(S || []), ...blocks ])
+ , goHome$.map(_ => S => null)
+ ).startWith(null).scan((S, mod) => mod(S))
+
+ , nextMoreBlocks$ = blocks$.map(blocks => blocks && blocks.length && last(blocks).height).map(height => height > 0 ? height-1 : null)
+
+ // Single block and associated txs
+ , block$ = reply('block').merge(goBlock$.mapTo(null))
+ , blockStatus$ = reply('block-stat').merge(goBlock$.mapTo(null))
+ , blockTxs$ = O.merge(
+ reply('block-txs').map(txs => S => [ ...(S || []), ...txs ])
+ , goBlock$.map(_ => S => null)
+ ).startWith(null).scan((S, mod) => mod(S))
+
+ , nextMoreBTxs$ = O.combineLatest(block$, blockTxs$, (block, txs) => block && txs && block.tx_count > txs.length ? txs.length : null)
+
+ // Hash by height search
+ , byHeight$ = reply('height')
+
+ // Address and associated txs
+ , addr$ = reply('address').merge(goAddr$.mapTo(null))
+ , addrTxs$ = O.merge(
+ reply('addr-txs').map(txs => S => [ ...(S || []), ...txs ])
+ , goAddr$.map(_ => S => null)
+ ).startWith(null).scan((S, mod) => mod(S))
+
+ , nextMoreATxs$ = O.combineLatest(addr$, addrTxs$, (addr, txs) => addr && txs && addr.tx_count > txs.length ? txs.length : null)
+
+ // Single TX
+ , tx$ = reply('tx').merge(goTx$.mapTo(null))
+ , txStatus$ = reply('tx-stat').merge(goTx$.mapTo(null))
+
+ // Currently collapsed tx/block ("details")
+ , openTx$ = togTx$.startWith(null).scan((prev, txid) => prev == txid ? null : txid)
+ , openBlock$ = togBlock$.startWith(null).scan((prev, blockhash) => prev == blockhash ? null : blockhash)
+
+ // Spending txs map (reset on every page nav)
+ , spends$ = O.merge(
+ reply('tx-spends', true).map(r => S => ({ ...S, [r.request.txid]: r.body }))
+ , route$.mapTo(S => ({}))
+ ).startWith({}).scan((S, mod) => mod(S))
+
+ // Currently visible view
+ , view$ = O.merge(route$.mapTo(null)
+ , blocks$.filter(notNully).mapTo('home')
+ , block$.filter(notNully).mapTo('block')
+ , tx$.filter(notNully).mapTo('tx')
+ , addr$.filter(notNully).mapTo('addr')
+ , error$.mapTo('error'))
+ .combineLatest(loading$, (view, loading) => view || (loading ? 'loading' : 'notFound'))
+
+ // Page title
+ , title$ = O.merge(route$.mapTo(null)
+ , block$.filter(notNully).withLatestFrom(t$, (block, t) => t`Block #${block.height}: ${block.id}`)
+ , tx$.filter(notNully).withLatestFrom(t$, (tx, t) => t`Transaction: ${tx.txid}`)
+ , addr$.filter(notNully).withLatestFrom(t$, (addr, t) => t`Address: ${addr.address}`))
+
+ // App state
+ , state$ = combine({ t$, error$, tipHeight$, spends$
+ , blocks$, nextMoreBlocks$
+ , block$, blockStatus$, blockTxs$, nextMoreBTxs$, openBlock$
+ , tx$, txStatus$, openTx$
+ , addr$, addrTxs$, nextMoreATxs$
+ , loading$, view$
+ })
+
+ /// Sinks
+
+ // HTTP request sink
+ , req$ = O.merge(
+ // fetch single block and its status
+ goBlock$.flatMap(hash => [{ category: 'block', method: 'GET', path: `/block/${hash}` }
+ , { category: 'block-stat', method: 'GET', path: `/block/${hash}/status` }
+ , { category: 'block-txs', method: 'GET', path: `/block/${hash}/txs` } ])
+
+ // fetch single tx and its status
+ , goTx$.flatMap(txid => [{ category: 'tx', method: 'GET', path: `/tx/${txid}` }
+ , { category: 'tx-stat', method: 'GET', path: `/tx/${txid}/status` }])
+
+ // fetch address stats
+ , goAddr$.flatMap(addr => [{ category: 'address', method: 'GET', path: `/address/${addr}` }
+ , { category: 'addr-txs', method: 'GET', path: `/address/${addr}/txs`, ignore_err: true }])
+
+ // fetch list of blocks for homepage
+ , O.merge(goHome$.mapTo({ }), moreBlocks$)
+ .map(d => ({ category: 'blocks', method: 'GET', path: `/blocks/${d.start_height || ''}` }))
+
+ // fetch list of txs for block page
+ , moreBTxs$.map(d => ({ category: 'block-txs', method: 'GET', path: `/block/${d.block}/txs/${d.start_index}` }))
+
+ // fetch list of txs for address page
+ , moreATxs$.map(d => ({ category: 'addr-txs', method: 'GET', path: `/address/${d.addr}/txs/${d.start_index}` }))
+
+ // fetch block by height
+ , goHeight$.map(n => ({ category: 'height', method: 'GET', path: `/block-height/${n}` }))
+
+ // fetch spending txs when viewing advanced details
+ , openTx$.filter(notNully)
+ .map(txid => ({ category: 'tx-spends', method: 'GET', path: `/tx/${txid}/outspends`, txid }))
+
+ // get the tip every 30s (but only when the page is active) or when we render a block/tx/addr, but not more than once every 5s
+ , O.merge(O.timer(0, 30000).filter(() => document.hasFocus()), goBlock$, goTx$, goAddr$).throttleTime(5000)
+ .mapTo( { category: 'tip-height', method: 'GET', path: '/tip/height', bg: true } )
+
+ ).map(setBase)
+
+ // DOM sink
+ , vdom$ = state$.map(S => S.view ? views[S.view](S) : null)
+
+ // localStorage sink
+ , store$ = O.merge(
+ lang$.skip(1).map(lang => ({ key: 'lang', value: lang }))
+ , theme$.skip(1).map(theme => ({ key: 'theme', value: theme }))
+ )
+
+ // Route navigation sink
+ , navto$ = O.merge(
+ searchResult$.filter(Boolean).map(path => ({ type: 'push', pathname: path }))
+ , byHeight$.map(hash => ({ type: 'replace', pathname:`/block/${hash}` }))
+ )
+
+ dbg({ goHome$, goBlock$, goTx$, togTx$, route$, lang$
+ , state$, view$, block$, blockTxs$, blocks$, tx$, spends$
+ , tipHeight$, error$, loading$
+ , query$, searchResult$, copy$, store$, navto$
+ , req$, reply$: dropErrors(HTTP.select()).map(r => [ r.request.category, r.req.method, r.req.url, r.body||r.text, r ]) })
+
+ // @XXX side-effects outside of drivers
+
+ // Display "No results found"
+ searchResult$.filter(found => !found).map(_ => document.querySelector('[name=q]'))
+ .filter(el => !!el)
+ .withLatestFrom(t$)
+ .subscribe(([el, t]) => (el.setCustomValidity(t`No results found`), el.reportValidity()))
+ on('[name=q]', 'input').subscribe(e => e.target.setCustomValidity(''))
+
+ // Update page title
+ title$.subscribe(title => document.title = title ? `${title} ยท ${initTitle}` : initTitle)
+
+ // Click-to-copy
+ if (navigator.clipboard) copy$.subscribe(text => navigator.clipboard.writeText(text))
+
+ // Switch stylesheet based on current language
+ const stylesheet = document.querySelector('link[href="style.css"]')
+ t$.map(t => t`style.css`).distinctUntilChanged().subscribe(styleSrc =>
+ stylesheet.getAttribute('href') != styleSrc && (stylesheet.href = styleSrc))
+
+ // Apply dark/light theme, language and text direction to root element
+ theme$.subscribe(theme => {
+ document.body.classList.remove('theme-dark', 'theme-light')
+ document.body.classList.add(`theme-${theme}`)
+ })
+ t$.subscribe(t => {
+ document.body.setAttribute('lang', t.lang_id)
+ document.body.setAttribute('dir', t`ltr`)
+ })
+
+ // Reset scrolling when navigating to a new page (but not when hitting 'back')
+ route$.startWith([ ]).scan((prevKeys, loc) => [ ...prevKeys.slice(0, 15), loc.key ])
+ .filter(keys => keys.length && !keys.slice(0, -1).includes(last(keys)))
+ .subscribe(_ => window.scrollTo(0, 0))
+
+ return { DOM: vdom$, HTTP: req$, route: navto$, storage: store$, search: query$ }
+}
+
+run(main, {
+ DOM: makeDOMDriver('#liquid-explorer')
+, HTTP: makeHTTPDriver()
+, route: makeRouteDriver(captureClicks(makeHistoryDriver({ basename: process.env.BASE_HREF || '/' })))
+, storage: storageDriver
+, search: makeSearchDriver(apiBase)
+})
diff --git a/client/driver/route.js b/client/driver/route.js
new file mode 100644
index 00000000..75998c16
--- /dev/null
+++ b/client/driver/route.js
@@ -0,0 +1,27 @@
+import pathRegexp from 'path-to-regexp'
+import { Observable as O } from '../rxjs'
+
+const isStr = x => typeof x === 'string'
+
+const makeObj = (keys, values) => keys.reduce((o, k, i) => ({ ...o, [k.name]: values[i] }), {})
+
+const baseHref = process.env.BASE_HREF
+ , stripBase = path => path.indexOf(baseHref) == 0 ? path.substr(baseHref.length-1) : path
+
+module.exports = history => goto$ => {
+ const history$ = O.from(history(
+ goto$.map(goto => isStr(goto) ? { type: 'push', pathname: goto } : goto)
+ ))
+
+ return path => {
+ if (!path) return history$
+
+ const keys=[], re=pathRegexp(path, keys)
+
+ return history$
+ .map(loc => ({ ...loc, pathname: stripBase(loc.pathname) }))
+ .map(loc => ({ ...loc, matches: loc.pathname.match(re) }))
+ .filter(loc => !!loc.matches)
+ .map(loc => ({ ...loc, params: makeObj(keys, loc.matches.slice(1)) }))
+ }
+}
diff --git a/client/driver/search.js b/client/driver/search.js
new file mode 100644
index 00000000..f0df6fae
--- /dev/null
+++ b/client/driver/search.js
@@ -0,0 +1,38 @@
+import { tryUnconfidentialAddress } from '../util'
+import { Observable as O } from '../rxjs'
+
+const reNumber = /^\d+$/
+ , reHash256 = /^[a-f0-9]{64}$/i
+ , reAddr = /^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[a-z]{2,5}1[ac-hj-np-z02-9]{8,87})$/ // very loose regex, might have false positive
+ , trim = s => s.trim()
+
+export default apiBase => {
+ const tryResource = path =>
+ fetch(apiBase + path)
+ .then(r => r.ok ? path : Promise.reject(r.statusText))
+
+ // Accepts a stream of query strings, returns a stream of found resource paths
+ return query$ =>
+ O.from(query$).map(trim).flatMap(async query =>
+
+ // if its a number, assume its a block height without checking
+ reNumber.test(query)
+ ? `/block-height/${query}`
+
+ // if its a 256 bit hash, look it up as a txid or block hash
+ : reHash256.test(query)
+ ? tryResource(`/tx/${query}`)
+ .catch(_ => tryResource(`/block/${query}`))
+ .catch(_ => null)
+
+ // lookup as address if it resembles one
+ : reAddr.test(query)
+ ? tryResource(`/address/${tryUnconfidentialAddress(query)}`)
+ .catch(_ => null)
+
+ // @XXX the tx/block/addr resource will be fetched again later for display,
+ // which is somewhat wasteful but not terribly so due to browser caching.
+
+ : null
+ ).share()
+}
diff --git a/client/l10n.js b/client/l10n.js
new file mode 100644
index 00000000..a3be4df1
--- /dev/null
+++ b/client/l10n.js
@@ -0,0 +1,29 @@
+import createL10ns from 'basic-l10n'
+import browserLanguage from 'in-browser-language'
+
+export default createL10ns({
+ en: require('../lang/en.json')
+, 'pt-pt': require('../lang/pt-pt.json')
+, de: require('../lang/de.json')
+, fr: require('../lang/fr.json')
+, it: require('../lang/it.json')
+, es: require('../lang/es.json')
+, nl: require('../lang/nl.json')
+, ru: require('../lang/ru.json')
+, sr: require('../lang/sr.json')
+, hr: require('../lang/hr.json')
+, bs: require('../lang/bs.json')
+, me: require('../lang/me.json')
+, sv: require('../lang/sv.json')
+, 'zh-cn': require('../lang/zh-cn.json')
+, he: require('../lang/he.json')
+, jp: require('../lang/jp.json')
+, ko: require('../lang/ko.json')
+}, { debug: console.error })
+
+Object.entries(exports.default).forEach(([ lang_id, lang_t ]) => {
+ lang_t.lang_id = lang_id
+ lang_t.langs = exports.default
+})
+
+export const defaultLang = browserLanguage.pick(Object.keys(exports.default), 'en')
diff --git a/client/npm-shrinkwrap.json b/client/npm-shrinkwrap.json
new file mode 100644
index 00000000..00b9036b
--- /dev/null
+++ b/client/npm-shrinkwrap.json
@@ -0,0 +1,962 @@
+{
+ "name": "esplora-client",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@cycle/dom": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/@cycle/dom/-/dom-22.0.0.tgz",
+ "integrity": "sha512-Vj6cZjJNz4JAREEz34f84Fvnqjjgz5R3BCg+QJ5o1n7ebrBBDuNr4a7oWxCnkZYdGccAXNA0HjP5tOALPTSoTA==",
+ "requires": {
+ "@cycle/run": "5.1.0",
+ "rxjs": "6.3.3",
+ "snabbdom": "0.7.2",
+ "snabbdom-selector": "4.1.0",
+ "xstream": "11.7.0"
+ },
+ "dependencies": {
+ "@cycle/run": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.1.0.tgz",
+ "integrity": "sha512-zBjLl91JbGJt4TVqWnYXKvqgxDDZldjQeF71s6wOiY/Nt0RffaUACg5QkwNoHGLkFalBMp3Kmt+TNNONeA2N9w==",
+ "requires": {
+ "quicktask": "1.1.0",
+ "xstream": "11.7.0"
+ }
+ },
+ "rxjs": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+ "requires": {
+ "tslib": "1.9.3"
+ }
+ }
+ }
+ },
+ "@cycle/history": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@cycle/history/-/history-7.0.0.tgz",
+ "integrity": "sha512-qaL/PcoRXDfGtH/CiH8yhyaT1tG0lXaWiaPPFVhedeu4rWIW4xOYazv4SyGLEZaeqgTVdOqu/9mHuTn6uuyDPA==",
+ "requires": {
+ "@cycle/run": "5.1.0",
+ "@types/history": "4.7.2",
+ "history": "4.7.2",
+ "xstream": "11.7.0"
+ },
+ "dependencies": {
+ "@cycle/run": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.1.0.tgz",
+ "integrity": "sha512-zBjLl91JbGJt4TVqWnYXKvqgxDDZldjQeF71s6wOiY/Nt0RffaUACg5QkwNoHGLkFalBMp3Kmt+TNNONeA2N9w==",
+ "requires": {
+ "quicktask": "1.1.0",
+ "xstream": "11.7.0"
+ }
+ }
+ }
+ },
+ "@cycle/http": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/@cycle/http/-/http-15.0.0.tgz",
+ "integrity": "sha512-rnQ1Rq54M89Vt7ONMocxTQeSmUv7AdX1BH4dVNeUxJt5OyeA9d9ZEiG7S4nstqxfcIkdau+MgxGhYHqe61UhQg==",
+ "requires": {
+ "@cycle/run": "5.1.0",
+ "@types/superagent": "3.8.4",
+ "most": "1.7.3",
+ "rxjs": "6.3.3",
+ "superagent": "3.8.3",
+ "xstream": "11.7.0"
+ },
+ "dependencies": {
+ "@cycle/run": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.1.0.tgz",
+ "integrity": "sha512-zBjLl91JbGJt4TVqWnYXKvqgxDDZldjQeF71s6wOiY/Nt0RffaUACg5QkwNoHGLkFalBMp3Kmt+TNNONeA2N9w==",
+ "requires": {
+ "quicktask": "1.1.0",
+ "xstream": "11.7.0"
+ }
+ },
+ "rxjs": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+ "requires": {
+ "tslib": "1.9.3"
+ }
+ }
+ }
+ },
+ "@cycle/run": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@cycle/run/-/run-4.4.0.tgz",
+ "integrity": "sha512-vVxnTqKKlgasE+we9X2z3og8z5KouO2RMiIgHWkVek+NomsdaeZwfvbutqzm3VToEImaz0DE2Iln9AxtCOVjpQ==",
+ "requires": {
+ "quicktask": "1.1.0",
+ "xstream": "11.7.0"
+ }
+ },
+ "@cycle/rxjs-run": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@cycle/rxjs-run/-/rxjs-run-8.1.0.tgz",
+ "integrity": "sha512-CWARa0vt754UdBPpoUESGNKBpZZify1gYCIuIsEXPAe92nVCoykzQ9Iq+/VmE+JbWpqz7NiADTCqSOkeW7zc8g==",
+ "requires": {
+ "@cycle/run": "4.4.0",
+ "rxjs": "5.5.12",
+ "symbol-observable": "1.2.0",
+ "xstream": "11.7.0"
+ }
+ },
+ "@cycle/storage": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@cycle/storage/-/storage-5.0.3.tgz",
+ "integrity": "sha512-W3TPfSRB/npttFaOwWAN5CkBrR0dlQzHE+c0w8ZPN99F/sS8AcTuz4qlxTQrgNXIpRTFRoG7fgJFanG/B3trIA=="
+ },
+ "@most/multicast": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz",
+ "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==",
+ "requires": {
+ "@most/prelude": "1.7.2"
+ }
+ },
+ "@most/prelude": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.7.2.tgz",
+ "integrity": "sha512-GM5ec7+xpkuXiCMyzhyENgH/xZ8t0nAMDBY0QOsVVD6TrZYjJKUnW1eaI18HHX8W+COWMwWR9c0zoPiBp9+tUg=="
+ },
+ "@types/cookiejar": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.0.tgz",
+ "integrity": "sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA=="
+ },
+ "@types/history": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.2.tgz",
+ "integrity": "sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q=="
+ },
+ "@types/node": {
+ "version": "10.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz",
+ "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ=="
+ },
+ "@types/superagent": {
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.4.tgz",
+ "integrity": "sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ==",
+ "requires": {
+ "@types/cookiejar": "2.1.0",
+ "@types/node": "10.12.2"
+ }
+ },
+ "JSONStream": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz",
+ "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==",
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "babel-helper-builder-react-jsx": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
+ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+ },
+ "babel-plugin-transform-react-jsx": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
+ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+ "requires": {
+ "babel-helper-builder-react-jsx": "6.26.0",
+ "babel-plugin-syntax-jsx": "6.18.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "core-js": "2.5.7",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.11",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babelify": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz",
+ "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base-x": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz",
+ "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "basic-l10n": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/basic-l10n/-/basic-l10n-2.0.0.tgz",
+ "integrity": "sha512-6JVIFNEj1cmuCZ5dTiDNAsLS4P68ynIPI7sg1q1h4etZU1ETJ2obhSY7OJyFn9KMbuNHMynh0r5r/v1I6w/YKw=="
+ },
+ "bootstrap": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz",
+ "integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "browser-pack": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz",
+ "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "combine-source-map": "0.6.1",
+ "defined": "1.0.0",
+ "through2": "1.1.1",
+ "umd": "3.0.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "through2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz",
+ "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=",
+ "requires": {
+ "readable-stream": "1.1.14",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "browser-unpack": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-unpack/-/browser-unpack-1.3.0.tgz",
+ "integrity": "sha512-hK81IeAN/PcqzSKTqKWe3jzmB41PV/23N1w1w2N/KBPv+sjp31sMlen9arVIENzrH8IzaCWA2Fx6SV0kJyhAFQ==",
+ "requires": {
+ "acorn": "5.7.3",
+ "concat-stream": "1.6.2",
+ "minimist": "1.2.0"
+ }
+ },
+ "browserify-package-json": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz",
+ "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo="
+ },
+ "bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=",
+ "requires": {
+ "base-x": "3.0.4"
+ }
+ },
+ "bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "requires": {
+ "bs58": "4.0.1",
+ "create-hash": "1.2.0",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "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=="
+ },
+ "bundle-collapser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bundle-collapser/-/bundle-collapser-1.3.0.tgz",
+ "integrity": "sha1-9LT/WLLyLudwGyD6djBuI/U6P7Y=",
+ "requires": {
+ "browser-pack": "5.0.1",
+ "browser-unpack": "1.3.0",
+ "concat-stream": "1.6.2",
+ "falafel": "2.1.0",
+ "minimist": "1.2.0",
+ "through2": "2.0.3"
+ }
+ },
+ "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==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "combine-source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz",
+ "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=",
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "inline-source-map": "0.5.0",
+ "lodash.memoize": "3.0.4",
+ "source-map": "0.4.4"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
+ },
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
+ },
+ "core-js": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+ "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+ },
+ "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="
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "md5.js": "1.3.5",
+ "ripemd160": "2.0.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "debug": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+ "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "requires": {
+ "ms": "2.1.1"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "envify": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz",
+ "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==",
+ "requires": {
+ "esprima": "4.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "falafel": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
+ "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+ "requires": {
+ "acorn": "5.7.3",
+ "foreach": "2.0.5",
+ "isarray": "0.0.1",
+ "object-keys": "1.0.12"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ }
+ }
+ },
+ "fmtbtc": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/fmtbtc/-/fmtbtc-0.0.3.tgz",
+ "integrity": "sha512-3awolswh6476ce5gIvzjw6OgT7ae2WD5NSinOC/de8gLeaDQPdYlW94Hb6nCoTXMUP6AFe3eh3IQiuT+dp4c8A==",
+ "requires": {
+ "move-decimal-point": "0.0.4"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.7",
+ "mime-types": "2.1.21"
+ }
+ },
+ "formidable": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
+ "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "history": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz",
+ "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==",
+ "requires": {
+ "invariant": "2.2.4",
+ "loose-envify": "1.4.0",
+ "resolve-pathname": "2.2.0",
+ "value-equal": "0.4.0",
+ "warning": "3.0.0"
+ }
+ },
+ "in-browser-language": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/in-browser-language/-/in-browser-language-1.0.3.tgz",
+ "integrity": "sha512-kVKHZiWj+pDMLW/YaIP/r8OyaYVZZ4BZ/kD+fQrEp+FCoH/mprIIQhsEnUVkPuNEXCP5ZeWArOWz0KzDaLgICg=="
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "inline-source-map": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz",
+ "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=",
+ "requires": {
+ "source-map": "0.4.4"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "jquery": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+ "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+ },
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
+ },
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
+ },
+ "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==",
+ "requires": {
+ "js-tokens": "4.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.37.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+ "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
+ },
+ "mime-types": {
+ "version": "2.1.21",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+ "requires": {
+ "mime-db": "1.37.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "most": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/most/-/most-1.7.3.tgz",
+ "integrity": "sha512-mk68SM/ptK8WSo3l03raXcWy02Hl7jbzxVozMuvyYxohn4yteh2THhl3+XABF5cunWE8eXHAsLbv+RCJI5y+jg==",
+ "requires": {
+ "@most/multicast": "1.3.0",
+ "@most/prelude": "1.7.2",
+ "symbol-observable": "1.2.0"
+ }
+ },
+ "move-decimal-point": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/move-decimal-point/-/move-decimal-point-0.0.4.tgz",
+ "integrity": "sha512-cZrpE/ykbwSmD0DnKAcKa49zaK5LaftD6DzpQDmjSMPRK6i4D4xvnVBCIuZXkpAqvon6DP9Oum2TcLZjclVB/Q=="
+ },
+ "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=="
+ },
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
+ },
+ "path-to-regexp": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz",
+ "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "qruri": {
+ "version": "github:shesek/qruri#f91f3d16e77f7b3ac0406ef6ef365c4148910074"
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ },
+ "quicktask": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/quicktask/-/quicktask-1.1.0.tgz",
+ "integrity": "sha512-b3w19IEXnt5auacLAbePVsqPyVQUwmuhJQrrWnVhm4pP8PAMg2U9vFHbAD9XYXXbMDjdLJs0x5NLqwTV8uFK4g=="
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "resolve-pathname": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz",
+ "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg=="
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ }
+ },
+ "rxjs": {
+ "version": "5.5.12",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+ "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+ "requires": {
+ "symbol-observable": "1.0.1"
+ },
+ "dependencies": {
+ "symbol-observable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+ }
+ }
+ },
+ "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=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "snabbdom": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-0.7.2.tgz",
+ "integrity": "sha512-rDY283fYUB/3z2tjXsRRccsbVJqmGLtP+iI1tfa1DDHo2xZ49cq1leq9JmYyvZQhESuYJRY/is6WYhP2UuiRVg=="
+ },
+ "snabbdom-pragma": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/snabbdom-pragma/-/snabbdom-pragma-2.7.0.tgz",
+ "integrity": "sha1-4kUBTEDhI9GhOkCmtKGokUYmtls=",
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
+ "snabbdom-selector": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/snabbdom-selector/-/snabbdom-selector-4.1.0.tgz",
+ "integrity": "sha512-NDWOVSUR6yPlxH2F9XRwnF59UObLnItfSXcIw6+azkyrEDqT2c8pZ85UHvjijsgdve3g19qsC0/69tB5eZqTvA==",
+ "requires": {
+ "tree-selector": "2.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+ "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+ "requires": {
+ "buffer-from": "1.1.1",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "superagent": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
+ "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
+ "requires": {
+ "component-emitter": "1.2.1",
+ "cookiejar": "2.1.2",
+ "debug": "3.2.6",
+ "extend": "3.0.2",
+ "form-data": "2.3.3",
+ "formidable": "1.2.1",
+ "methods": "1.1.2",
+ "mime": "1.6.0",
+ "qs": "6.5.2",
+ "readable-stream": "2.3.6"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "requires": {
+ "ms": "2.1.1"
+ }
+ }
+ }
+ },
+ "symbol-observable": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+ },
+ "terser": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-3.8.2.tgz",
+ "integrity": "sha512-FGSBXiBJe2TSXy6pWwXpY0YcEWEK35UKL64BBbxX3aHqM4Nj0RMqXvqBuoSGfyd80t8MKQ5JwYm5jRRGTSEFNg==",
+ "requires": {
+ "commander": "2.17.1",
+ "source-map": "0.6.1",
+ "source-map-support": "0.5.9"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "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="
+ },
+ "tree-selector": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tree-selector/-/tree-selector-2.1.0.tgz",
+ "integrity": "sha512-Giao15zxN5PvdzJv7HDubn3aSrlsWD9TG9xngYkiuChhIgPH6cQqvCGV5sJ/sWahm7nRtPx46hKax81eyz1sOg=="
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "uglifyify": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.1.tgz",
+ "integrity": "sha512-PO44rgExvwj3rkK0UzenHVnPU18drBy9x9HOUmgkuRh6K2KIsDqrB5LqxGtjybgGTOS1JeP8SBc+TN5rhiva6w==",
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "extend": "1.3.0",
+ "minimatch": "3.0.4",
+ "terser": "3.8.2",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "extend": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz",
+ "integrity": "sha1-0VFvsP9WJNLr+RI+odrFoZlABPg="
+ }
+ }
+ },
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "value-equal": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz",
+ "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw=="
+ },
+ "warning": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
+ "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+ "requires": {
+ "loose-envify": "1.4.0"
+ }
+ },
+ "xstream": {
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.7.0.tgz",
+ "integrity": "sha512-wO3TXiQd2/1UZNVsixDIcQgAN6TU4sGH7qIXvs1CRp1kgtkpU8YTfyKt/z/Z1psqcGnR0cJJxHaCnBxtktLx9w==",
+ "requires": {
+ "symbol-observable": "1.2.0"
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ }
+ }
+}
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 00000000..d55b0ce6
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "esplora-client",
+ "version": "0.1.0",
+ "author": "Nadav Ivgi",
+ "license": "MIT",
+ "scripts": {
+ "postinstall": "../node_modules/.bin/patch-package"
+ },
+ "dependencies": {
+ "@cycle/dom": "^22.0.0",
+ "@cycle/history": "^7.0.0",
+ "@cycle/http": "^15.0.0",
+ "@cycle/rxjs-run": "^8.1.0",
+ "@cycle/storage": "^5.0.3",
+ "babel-plugin-transform-react-jsx": "^6.24.1",
+ "babelify": "^8.0.0",
+ "basic-l10n": "^2.0.0",
+ "bootstrap": "^4.1.3",
+ "browserify-package-json": "^1.0.1",
+ "bs58check": "^2.1.2",
+ "bundle-collapser": "^1.3.0",
+ "debug": "^4.1.0",
+ "envify": "^4.1.0",
+ "fmtbtc": "0.0.3",
+ "in-browser-language": "^1.0.3",
+ "jquery": "^3.3.1",
+ "path-to-regexp": "^2.4.0",
+ "qruri": "github:shesek/qruri#browser-only",
+ "rxjs": "^5.5.12",
+ "snabbdom-pragma": "^2.7.0",
+ "uglifyify": "^5.0.1"
+ },
+ "browserify": {
+ "transform": [
+ "babelify",
+ "envify",
+ "uglifyify",
+ [
+ "browserify-package-json",
+ {
+ "only": "version"
+ }
+ ]
+ ]
+ }
+}
diff --git a/client/patches/@cycle/history+6.10.0.patch b/client/patches/@cycle/history+6.10.0.patch
new file mode 100644
index 00000000..ebf8aebf
--- /dev/null
+++ b/client/patches/@cycle/history+6.10.0.patch
@@ -0,0 +1,25 @@
+patch-package
+--- a/node_modules/@cycle/history/lib/cjs/captureClicks.js
++++ b/node_modules/@cycle/history/lib/cjs/captureClicks.js
+@@ -17,6 +17,9 @@ function sameOrigin(href) {
+ }
+ return href && href.indexOf(window.location.origin) === 0;
+ }
++
++var baseHref = document.querySelector('base').getAttribute('href');
++
+ function makeClickListener(push) {
+ return function clickListener(event) {
+ if (which(event) !== 1) {
+@@ -51,6 +54,11 @@ function makeClickListener(push) {
+ }
+ event.preventDefault();
+ var pathname = element.pathname, search = element.search, _a = element.hash, hash = _a === void 0 ? '' : _a;
++
++ // strip base href from the pathname. it gets added back by the history driver, which results
++ // in having it twice without this fix.
++ if (pathname.indexOf(baseHref) == 0) pathname = pathname.substr(baseHref.length-1)
++
+ push(pathname + search + hash);
+ };
+ }
diff --git a/client/patches/@cycle/history+7.0.0.patch b/client/patches/@cycle/history+7.0.0.patch
new file mode 100644
index 00000000..ebf8aebf
--- /dev/null
+++ b/client/patches/@cycle/history+7.0.0.patch
@@ -0,0 +1,25 @@
+patch-package
+--- a/node_modules/@cycle/history/lib/cjs/captureClicks.js
++++ b/node_modules/@cycle/history/lib/cjs/captureClicks.js
+@@ -17,6 +17,9 @@ function sameOrigin(href) {
+ }
+ return href && href.indexOf(window.location.origin) === 0;
+ }
++
++var baseHref = document.querySelector('base').getAttribute('href');
++
+ function makeClickListener(push) {
+ return function clickListener(event) {
+ if (which(event) !== 1) {
+@@ -51,6 +54,11 @@ function makeClickListener(push) {
+ }
+ event.preventDefault();
+ var pathname = element.pathname, search = element.search, _a = element.hash, hash = _a === void 0 ? '' : _a;
++
++ // strip base href from the pathname. it gets added back by the history driver, which results
++ // in having it twice without this fix.
++ if (pathname.indexOf(baseHref) == 0) pathname = pathname.substr(baseHref.length-1)
++
+ push(pathname + search + hash);
+ };
+ }
diff --git a/client/rxjs.js b/client/rxjs.js
new file mode 100644
index 00000000..6bf3eb62
--- /dev/null
+++ b/client/rxjs.js
@@ -0,0 +1,28 @@
+import { Observable } from 'rxjs/Observable'
+
+import 'rxjs/add/observable/empty'
+import 'rxjs/add/observable/of'
+import 'rxjs/add/observable/merge'
+import 'rxjs/add/observable/combineLatest'
+import 'rxjs/add/observable/timer'
+import 'rxjs/add/observable/fromEvent'
+
+import 'rxjs/add/operator/filter'
+import 'rxjs/add/operator/map'
+import 'rxjs/add/operator/mapTo'
+import 'rxjs/add/operator/withLatestFrom'
+import 'rxjs/add/operator/merge'
+import 'rxjs/add/operator/catch'
+import 'rxjs/add/operator/startWith'
+import 'rxjs/add/operator/mergeMap'
+import 'rxjs/add/operator/scan'
+import 'rxjs/add/operator/combineLatest'
+import 'rxjs/add/operator/share'
+import 'rxjs/add/operator/throttleTime'
+import 'rxjs/add/operator/switchMap'
+import 'rxjs/add/operator/distinctUntilChanged'
+import 'rxjs/add/operator/first'
+import 'rxjs/add/operator/skip'
+import 'rxjs/add/operator/concat'
+
+module.exports = { Observable }
diff --git a/client/util.js b/client/util.js
new file mode 100644
index 00000000..3d42be94
--- /dev/null
+++ b/client/util.js
@@ -0,0 +1,68 @@
+import bs58check from 'bs58check'
+import debug from 'debug'
+import assert from 'assert'
+import { Observable as O } from './rxjs'
+
+const BLIND_PREFIX = +process.env.BLIND_PREFIX || 0x0c
+
+// not null or undefined
+export const notNully = x => x != null
+
+// Transaction helpers
+
+const nativeAssetId = process.env.NATIVE_ASSET_ID || '6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d'
+ , nativeAssetLabel = process.env.NATIVE_ASSET_LABEL || 'BTC'
+
+export const isAnyConfidential = tx => tx.vout.some(vout => vout.value == null)
+
+export const isAnyPegout = tx => tx.vout.some(vout => !!vout.pegout_scriptpubkey_type)
+
+export const isRbf = tx => tx.vin.some(vin => vin.sequence < 0xfffffffe)
+
+export const isAllNative = tx => tx.vout.every(isNativeOut)
+
+export const outTotal = tx => tx.vout.reduce((N, vout) => N + (vout.value || 0), 0)
+
+export const isNativeOut = vout => (!vout.asset && !vout.assetcommitment) || vout.asset === nativeAssetId
+
+export const outAssetLabel = vout =>
+ isNativeOut(vout) ? nativeAssetLabel
+: vout.asset != null ? `[${vout.asset.substr(0, 8)}]`
+: '[Unknown]'
+
+// Address helpers
+
+// Try removing blinding key from confidential address and return in standard address encoding
+export const tryUnconfidentialAddress = addr => {
+ try {
+ const bytes = bs58check.decode(addr)
+ assert(bytes.length == 55 && bytes[0] == BLIND_PREFIX)
+ return bs58check.encode(Buffer.concat([bytes.slice(1, 2), bytes.slice(-20)]))
+ } catch (e) {
+ return addr
+ }
+}
+
+// Array helpers
+
+export const last = arr => arr.length ? arr[arr.length-1] : null
+
+// Stream helpers
+
+export const combine = obj => {
+ const keys = Object.keys(obj).map(k => k.replace(/\$$/, ''))
+ return O.combineLatest(...Object.values(obj).map(x$ => x$.startWith(null))
+ , (...xs) => xs.reduce((o, x, i) => (o[keys[i]] = x, o), {}))
+}
+
+export const dropErrors = r$$ => r$$.switchMap(r$ => r$.catch(_ => O.empty()))
+
+export const extractErrors = r$$ =>
+ r$$.flatMap(r$ => r$.flatMap(_ => O.empty()).catch(err => O.of(err)))
+ .map(e => e.response && (e.response.body && e.response.body.message || e.response.body || e.response.text) || e)
+
+export const dbg = (obj, label='stream', dbg=debug(label)) =>
+ Object.keys(obj).forEach(k => obj[k] && obj[k].subscribe(
+ x => dbg(`${k} ->`, x)
+ , err => dbg(`${k} \x1b[91mError:\x1b[0m`, err.stack || err)
+ , _ => dbg(`${k} completed`)))
diff --git a/client/views/addr.js b/client/views/addr.js
new file mode 100644
index 00000000..b789e652
--- /dev/null
+++ b/client/views/addr.js
@@ -0,0 +1,70 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+import search from './search'
+import { txBox } from './tx'
+import { formatAmount, addressQR } from './util'
+
+export default ({ t, addr, addrTxs, nextMoreATxs, openTx, spends, tipHeight, loading }) => addr && layout(
+
+
+
+ { search({ t, klass: 'page-search-bar' }) }
+
+
+
+
+
+ { addr.tx_count != null &&
+
{t`Transaction count`}
+
{addr.tx_count}
+
}
+
+ { /* unavailable for chains with CT and/or multi-assets */ }
+ { addr.total_received != null &&
+
{t`Total received`}
+
{formatAmount({ value: addr.total_received })}
+
}
+ { addr.confirmed_balance != null &&
+
{t`Confirmed balance`}
+
{formatAmount({ value: addr.confirmed_balance })}
+
}
+ { addr.mempool_balance > 0 &&
+
{t`Unconfirmed balance`}
+
{formatAmount({ value: addr.mempool_balance })}
+
}
+
+
+ { addr.tx_count == null
+ ?
{t`Sorry! Addresses with a large number of transactions aren't currently supported.`}
+ :
+
+
{addrTxs && addr.tx_count > 50 ? t`${addrTxs.length} of ${addr.tx_count} Transactions` : t`${addr.tx_count} Transactions`}
+ { addrTxs ? addrTxs.map(tx => txBox(tx, { openTx, tipHeight, t, spends }))
+ :
}
+
+
+ { nextMoreATxs &&
}
+
+ }
+
+
+, { t })
diff --git a/client/views/block.js b/client/views/block.js
new file mode 100644
index 00000000..3c270989
--- /dev/null
+++ b/client/views/block.js
@@ -0,0 +1,113 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+import search from './search'
+import { txBox } from './tx'
+import { formatTime } from './util'
+
+const formatHeight = height => height
+
+const makeStatus = b => b && ({ confirmed: true, block_height: b.height, block_hash: b.id })
+
+export default ({ t, block: b, blockStatus: status, blockTxs, nextMoreBTxs, openTx, spends, openBlock, tipHeight, loading }, txsStatus=makeStatus(b)) => b && layout(
+
+
+
+ { search({ t, klass: 'page-search-bar' }) }
+
+
{t`Block ${formatHeight(b.height)}`}
+
+
+
+ { b.previousblockhash &&
+
+
+
+ }
+
+
+ { (status && status.next_best) &&
+
+
+
+ }
+
+
+
+
+
+
+
+ { b.proof &&
}
+
+
+
+
+
{t`Status`}
+
{!status ? '' : !status.in_best_chain ? t`Orphaned` : tipHeight ? t`In best chain (${tipHeight-b.height+1} confirmations)` : t`In best chain`}
+
+
+
{t`Timestamp`}
+
{formatTime(b.timestamp, t)}
+
+
+
{t`Size (KB)`}
+
{b.size/1000}
+
+
+
{t`Virtual Size (KVB)`}
+
{Math.ceil(b.weight/4/1000)}
+
+
+
{t`Weight units (KWU)`}
+
{b.weight/1000}
+
+
+ { /* block proof for federated chains */ }
+ { b.proof && openBlock == b.id &&
+
{t`Block Challenge`}
+
{b.proof.challenge_asm}
+
}
+ { b.proof && openBlock == b.id &&
+
{t`Block Solution`}
+
{b.proof.solution_asm}
+
}
+
+
+
+
+
{blockTxs && b.tx_count>50 ? t`${blockTxs.length} of ${b.tx_count} Transactions` : t`${b.tx_count} Transactions`}
+ { blockTxs ? blockTxs.map(tx => txBox( { ...tx, status: txsStatus }, { openTx, tipHeight, t, spends }))
+ :
}
+
+
+ { nextMoreBTxs &&
}
+
+
+, { t })
diff --git a/client/views/error.js b/client/views/error.js
new file mode 100644
index 00000000..ee380efd
--- /dev/null
+++ b/client/views/error.js
@@ -0,0 +1,16 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+
+const formatError = err =>
+ (err.message && err.message.startsWith('Request has been terminated'))
+? 'We encountered an error. Please try again later.'
+: err.toString()
+
+export const error = ({ t, error }) => layout(
+
+
{ t(formatError(error)) }
+
+
+, { t })
+
+export const notFound = S => error({ ...S, error: 'Page Not Found' })
diff --git a/client/views/footer.js b/client/views/footer.js
new file mode 100644
index 00000000..8970cae1
--- /dev/null
+++ b/client/views/footer.js
@@ -0,0 +1,61 @@
+import Snabbdom from 'snabbdom-pragma'
+
+export default ({ t }) =>
+
diff --git a/client/views/home.js b/client/views/home.js
new file mode 100644
index 00000000..e35ca62d
--- /dev/null
+++ b/client/views/home.js
@@ -0,0 +1,55 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+import search from './search'
+import { formatTime } from './util'
+
+export default ({ t, blocks: recentBlocks, nextMoreBlocks, loading }) => recentBlocks && layout(
+
+
+
+
+
{t(process.env.HOME_TITLE || process.env.SITE_TITLE || 'Block Explorer')}
+
+ { search({ t, autofocus: true }) }
+
+
+
+
+
{t`Recent Blocks`}
+
+
+
+
+
+
+
{t`Height`}
+
{t`Timestamp`}
+
{t`Transactions`}
+
{t`Size (KB)`}
+
{t`Weight (KWU)`}
+
+ { recentBlocks.map(b =>
+
+ )}
+ { nextMoreBlocks != null &&
}
+
+
+
+, { t })
diff --git a/client/views/index.js b/client/views/index.js
new file mode 100644
index 00000000..291664cc
--- /dev/null
+++ b/client/views/index.js
@@ -0,0 +1,6 @@
+export { default as home } from './home'
+export { default as block } from './block'
+export { default as addr } from './addr'
+export { default as tx } from './tx'
+export { default as loading } from './loading'
+export { error, notFound } from './error'
diff --git a/client/views/layout.js b/client/views/layout.js
new file mode 100644
index 00000000..8be40077
--- /dev/null
+++ b/client/views/layout.js
@@ -0,0 +1,12 @@
+import Snabbdom from 'snabbdom-pragma'
+import navbar from './navbar'
+import footer from './footer'
+
+export default (body, opt) =>
+
+
+ { navbar(opt) }
+ { body }
+
+ { footer(opt) }
+
diff --git a/client/views/loading.js b/client/views/loading.js
new file mode 100644
index 00000000..5af3c801
--- /dev/null
+++ b/client/views/loading.js
@@ -0,0 +1,11 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+
+export default ({ t }) => layout(
+
+
+
{t`Loading...`}
+
+
+
+
, { t })
diff --git a/client/views/navbar-menu.js b/client/views/navbar-menu.js
new file mode 100644
index 00000000..8b333165
--- /dev/null
+++ b/client/views/navbar-menu.js
@@ -0,0 +1,17 @@
+import Snabbdom from 'snabbdom-pragma'
+
+const items = process.env.MENU_ITEMS && JSON.parse(process.env.MENU_ITEMS)
+ , active = process.env.MENU_ACTIVE
+
+export default ({ t }) =>
+
+
+ { items && Object.entries(items).map(([ name, url ]) =>
+ -
+ {t(name)}
+
+ ) }
+ -
+
+
+
diff --git a/client/views/navbar.js b/client/views/navbar.js
new file mode 100644
index 00000000..8d283e67
--- /dev/null
+++ b/client/views/navbar.js
@@ -0,0 +1,19 @@
+import Snabbdom from 'snabbdom-pragma'
+import menu from './navbar-menu'
+
+export default ({ t }) =>
+
diff --git a/client/views/search.js b/client/views/search.js
new file mode 100644
index 00000000..71a74687
--- /dev/null
+++ b/client/views/search.js
@@ -0,0 +1,19 @@
+import Snabbdom from 'snabbdom-pragma'
+
+export default ({ t, klass, autofocus }) =>
+
diff --git a/client/views/tx-vin.js b/client/views/tx-vin.js
new file mode 100644
index 00000000..3b1253ec
--- /dev/null
+++ b/client/views/tx-vin.js
@@ -0,0 +1,98 @@
+import Snabbdom from 'snabbdom-pragma'
+import { linkToParentOut, formatAmount, linkToAddr } from './util'
+
+const layout = (vin, desc, body, { t }) =>
+
+
+
+ { desc || t`Nonstandard` }
+ { vin.prevout && t(formatAmount(vin.prevout)) }
+
+
+ { body }
+
+
+const coinbase = (vin, { t }) => layout(vin, t`Coinbase`, null, { t })
+
+const pegin = (vin, { isOpen, t }) => layout(
+ vin
+, linkToParentOut(vin.outpoint, t`Output in parent chain`)
+, isOpen &&
+
+
{t`txid:vout`}
+
{linkToParentOut(vin.outpoint)}
+
+
+, { t }
+)
+
+const standard = (vin, { isOpen, t }) => layout(
+ vin
+, !vin.prevout ? null : vin.prevout.scriptpubkey_address ? linkToAddr(vin.prevout.scriptpubkey_address)
+ : vin.prevout.scriptpubkey_type ? vin.prevout.scriptpubkey_type.toUpperCase() : null
+, isOpen &&
+
+
+ { vin.issuance && [
+
+
+
{t`Issuance`}
+
{vin.issuance.is_reissuance ? t`Reissuance` : t`New asset`}
+
+
+ , vin.issuance.asset_entropy &&
+
+
{t`Issuance entropy`}
+
{vin.issuance.asset_entropy}
+
+
+ , vin.issuance.asset_blinding_nonce &&
+
+
{t`Issuance blinding nonce`}
+
{vin.issuance.asset_blinding_nonce}
+
+
+ ,
+
{!vin.issuance.assetamountcommitment ? t`Issuance amount` : t`Amount commitment`}
+
{!vin.issuance.assetamountcommitment ? formatAmount({ value: vin.issuance.assetamount, asset: '' })
+ : {vin.issuance.assetamountcommitment}}
+
+
+ ,
+
{!vin.issuance.tokenamountcommitment ? t`Reissuance keys` : t`Reissuance commitment`}
+
{!vin.issuance.tokenamountcommitment ? (!vin.issuance.tokenamount ? t`No reissuance` : vin.issuance.tokenamount)
+ : {vin.issuance.tokenamountcommitment}}
+
+
+ ] }
+
+
+
{t`scriptSig.ASM`}
+
{vin.scriptsig_asm}
+
+
+
{t`scriptSig.hex`}
+
{vin.scriptsig_hex}
+
+
+ { vin.witness &&
+
{t`Witness`}
+
{vin.witness.join(' ')}
+
}
+
+
+
{t`nSequence`}
+
0x{ vin.sequence.toString(16) }
+
+
+
+, { t }
+)
+
+export default (vin, opt) =>
+ vin.is_coinbase ? coinbase(vin, opt)
+: vin.outpoint.is_pegin ? pegin(vin, opt)
+ : standard(vin, opt)
diff --git a/client/views/tx-vout.js b/client/views/tx-vout.js
new file mode 100644
index 00000000..9bd82727
--- /dev/null
+++ b/client/views/tx-vout.js
@@ -0,0 +1,99 @@
+import Snabbdom from 'snabbdom-pragma'
+import { formatAmount, linkToAddr, linkToParentAddr } from './util'
+
+const unspendable_types = [ 'op_return', 'provably_unspendable', 'fee' ]
+
+const layout = (vout, desc, body, { t }) =>
+
+
+
+ { desc || t`Nonstandard` }
+ { t(formatAmount(vout)) }
+
+
+ { body }
+
+
+const fee = (vout, { t }) => layout(vout, t`Transaction fees`, null, { t })
+
+const standard = (vout, { isOpen, spend, t }) => layout(
+ vout
+
+, vout.pegout ? (vout.pegout.scriptpubkey_address ? {t`Peg-out to`}
{linkToParentAddr(vout.pegout.scriptpubkey_address)} : t`Peg-out`)
+ : vout.scriptpubkey_address ? linkToAddr(vout.scriptpubkey_address)
+ : vout.scriptpubkey_type ? vout.scriptpubkey_type.toUpperCase()
+ : null
+
+, isOpen &&
+ { vout.scriptpubkey_type &&
+
+
{t`Type`}
+
{vout.scriptpubkey_type.toUpperCase()}
+
+ }
+
+
+
{t`scriptPubKey.asm`}
+
{vout.scriptpubkey_asm}
+
+
+
+
{t`scriptPubKey.hex`}
+
{vout.scriptpubkey_hex}
+
+
+ { vout.scriptpubkey_type == 'op_return' &&
+
+
{t`OP_RETURN data`}
+
{ getOpReturn(vout) }
+
+ }
+
+ { (vout.asset || vout.assetcommitment) &&
+
+
{vout.assetcommitment ? t`Asset commitment` : t`Asset ID`}
+
{vout.asset || vout.assetcommitment}
+
+ }
+
+ { vout.valuecommitment &&
+
+
{t`Value commitment`}
+
{vout.valuecommitment}
+
+ }
+
+ { !unspendable_types.includes(vout.scriptpubkey_type) &&
+
+ }
+
+ { (vout.pegout && vout.pegout.scriptpubkey_address) &&
+
+
{t`Peg-out address`}
+
{linkToParentAddr(vout.pegout.scriptpubkey_address)}
+
+ }
+
+ { vout.pegout &&
+
+
{t`Peg-out ASM`}
+
{vout.pegout.scriptpubkey_asm}
+
+ }
+
+
+, { t }
+)
+
+const getOpReturn = vout => new Buffer(vout.scriptpubkey_asm.split(' ')[2] || '', 'hex').toString('utf-8')
+
+export default (vout, opt) =>
+ vout.scriptpubkey_type == 'fee' ? fee(vout, opt)
+ : standard(vout, opt)
diff --git a/client/views/tx.js b/client/views/tx.js
new file mode 100644
index 00000000..45bdba8f
--- /dev/null
+++ b/client/views/tx.js
@@ -0,0 +1,112 @@
+import Snabbdom from 'snabbdom-pragma'
+import layout from './layout'
+import search from './search'
+import vin from './tx-vin'
+import vout from './tx-vout'
+import { isAnyConfidential, isAnyPegout, isAllNative, isRbf, outTotal } from '../util'
+import { formatAmount } from './util'
+
+const findSpend = (spends, txid, vout) => spends[txid] && spends[txid][vout]
+
+export default ({ t, tx, txStatus: status, tipHeight, spends, openTx }) => tx && layout(
+
+
+
+ { search({ t, klass: 'page-search-bar' }) }
+
+
+
+
+ {txHeader(tx, status, { t, tipHeight })}
+ {txBox({ ...tx, status }, { openTx, tipHeight, t, spends })}
+
+
+, { t })
+
+export const txBox = (tx, { t, openTx, tipHeight, spends }) => {
+ const isOpen = openTx == tx.txid
+ , confs = !tx.status ? null : tx.status.confirmed ? tipHeight-tx.status.block_height+1 : 0
+
+ return
+
+
+
{tx.vin.map(i => vin(i, { isOpen, t }))}
+
+
+
+
+
+
{tx.vout.map((o, idx) => vout(o, { isOpen, spend: findSpend(spends, tx.txid, idx), t }))}
+
+
+
+
+
+ { confs == null ? '' : confs === 0 ? t`Unconfirmed` : t`${confs} Confirmations`} {isRbf(tx) ? t`(RBF)` : ''}
+ { isAnyConfidential(tx) ? t`Confidential`
+ : isAllNative(tx) ? formatAmount({ value: outTotal(tx) })
+ : ''}
+
+
+
+}
+const txHeader = (tx, status, { tipHeight, t }) =>
+
+
+
{t`Status`}
+
{!status ? '' : !status.confirmed ? t`Unconfirmed` : tipHeight ? t`${tipHeight - status.block_height + 1} Confirmations` : t`Confirmed`}
+
+ {(status && status.confirmed) &&
+
{t`Included in Block`}
+
+
}
+
+
{t`Size (bytes)`}
+
{tx.size}
+
+
+
{t`Virtual size (vbytes)`}
+
{Math.ceil(tx.weight/4)}
+
+
+
{t`Weight units (WU)`}
+
{tx.weight}
+
+ {tx.fee != null &&
+
{t`Transaction fees`}
+
{t`${formatAmount({ value: tx.fee })} (${Math.round(tx.fee/tx.weight*4, 1)} sat/vB)`}
+
}
+
+
{t`Version`}
+
{tx.version}
+
+
+
{t`Lock time`}
+
{tx.locktime}
+
+ { isRbf(tx) &&
+
{t`Replace by fee`}
+
{t`Opted in`}
+
}
+
diff --git a/client/views/util.js b/client/views/util.js
new file mode 100644
index 00000000..eeeb7318
--- /dev/null
+++ b/client/views/util.js
@@ -0,0 +1,24 @@
+import Snabbdom from 'snabbdom-pragma'
+import { sat2btc } from 'fmtbtc'
+import { outAssetLabel } from '../util'
+
+const qruri = !process.env.NO_QR && require('qruri')
+
+export const formatTime = (unix, t) => new Date(unix*1000).toLocaleString(t.lang_id, { timeZoneName: 'short' })
+
+// @XXX we currently format all amounts as having 8 decimal places (like BTC), disregarding the asset type
+export const formatAmount = vout =>
+ vout.value == null ? 'Confidential' : `${ sat2btc(vout.value, true) } ${ vout.asset !== '' ? outAssetLabel(vout) : '' }`
+
+const parentChainExplorerTx = process.env.PARENT_CHAIN_EXPLORER_TX || '/tx/{txid}'
+const parentChainExplorerAddr = process.env.PARENT_CHAIN_EXPLORER_ADDR || '/address/{addr}'
+
+export const linkToParentOut = ({ txid, vout }, label=`${txid}:${vout}`) =>
+ {label}
+
+export const linkToParentAddr = (addr, label=addr) =>
+ {label}
+
+export const linkToAddr = addr => {addr}
+
+export const addressQR = addr => qruri(`bitcoin:${addr}`, { margin: 2 })
diff --git a/contrib/bitcoin-mainnet-explorer.conf.in b/contrib/bitcoin-mainnet-explorer.conf.in
new file mode 100644
index 00000000..1d2bde8e
--- /dev/null
+++ b/contrib/bitcoin-mainnet-explorer.conf.in
@@ -0,0 +1,8 @@
+[main]
+rpcport={BTC_DAEMON_RPC_PORT}
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
diff --git a/contrib/bitcoin-mainnet-pruned-for-liquid.conf.in b/contrib/bitcoin-mainnet-pruned-for-liquid.conf.in
new file mode 100644
index 00000000..4b721a22
--- /dev/null
+++ b/contrib/bitcoin-mainnet-pruned-for-liquid.conf.in
@@ -0,0 +1,9 @@
+[main]
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
+prune=550
+blocksonly=1
diff --git a/contrib/bitcoin-testnet-explorer.conf.in b/contrib/bitcoin-testnet-explorer.conf.in
new file mode 100644
index 00000000..c186f68e
--- /dev/null
+++ b/contrib/bitcoin-testnet-explorer.conf.in
@@ -0,0 +1,9 @@
+testnet=1
+[test]
+rpcport={BTC_DAEMON_RPC_PORT}
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
diff --git a/contrib/liquid-mainnet-explorer-torrc b/contrib/liquid-mainnet-explorer-torrc
new file mode 100644
index 00000000..e69de29b
diff --git a/contrib/liquid-mainnet-explorer.conf.in b/contrib/liquid-mainnet-explorer.conf.in
new file mode 100644
index 00000000..89d35d9c
--- /dev/null
+++ b/contrib/liquid-mainnet-explorer.conf.in
@@ -0,0 +1,12 @@
+rpcport={BTC_DAEMON_RPC_PORT}
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
+txindex=1
+mainchainrpcuser=admin1
+mainchainrpcpassword={RPC_PASS}
+mainchainrpchost=127.0.0.1
+mainchainrpcport=8332
diff --git a/contrib/liquid-mainnet-private-bridge-torrc b/contrib/liquid-mainnet-private-bridge-torrc
new file mode 100644
index 00000000..6c974869
--- /dev/null
+++ b/contrib/liquid-mainnet-private-bridge-torrc
@@ -0,0 +1,4 @@
+RunAsDaemon 0
+SOCKSPort 9050
+
+LongLivedPorts 10100 #Prefer high-uptime nodes for liquid-daemon connections
diff --git a/contrib/liquid-mainnet-private-bridge.conf.in b/contrib/liquid-mainnet-private-bridge.conf.in
new file mode 100644
index 00000000..76df62c8
--- /dev/null
+++ b/contrib/liquid-mainnet-private-bridge.conf.in
@@ -0,0 +1,15 @@
+rpcport={BTC_DAEMON_RPC_PORT}
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
+listenonion=0
+onion=127.0.0.1:9050
+listen=0
+discover=0
+mainchainrpcuser=admin1
+mainchainrpcpassword={RPC_PASS}
+mainchainrpchost=127.0.0.1
+mainchainrpcport=8332
diff --git a/contrib/liquid-mainnet-public-bridge-torrc b/contrib/liquid-mainnet-public-bridge-torrc
new file mode 100644
index 00000000..82270994
--- /dev/null
+++ b/contrib/liquid-mainnet-public-bridge-torrc
@@ -0,0 +1,3 @@
+RunAsDaemon 0
+ControlPort 9051
+SOCKSPort 9050
diff --git a/contrib/liquid-mainnet-public-bridge.conf.in b/contrib/liquid-mainnet-public-bridge.conf.in
new file mode 100644
index 00000000..b4581447
--- /dev/null
+++ b/contrib/liquid-mainnet-public-bridge.conf.in
@@ -0,0 +1,16 @@
+rpcport={BTC_DAEMON_RPC_PORT}
+server=1
+peerbloomfilters=0
+enforcenodebloom=1
+rpcuser=admin1
+rpcpassword={RPC_PASS}
+disablewallet=1
+listenonion=1
+onion=127.0.0.1:9050
+torcontrol=127.0.0.1:9051
+listen=1
+discover=1
+mainchainrpcuser=admin1
+mainchainrpcpassword={RPC_PASS}
+mainchainrpchost=127.0.0.1
+mainchainrpcport=8332
diff --git a/contrib/nginx.conf.in b/contrib/nginx.conf.in
new file mode 100644
index 00000000..e91a2fc0
--- /dev/null
+++ b/contrib/nginx.conf.in
@@ -0,0 +1,72 @@
+server_tokens off;
+add_header X-Frame-Options SAMEORIGIN;
+add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; font-src 'self' data:; object-src 'none' ";
+
+upstream backend {
+ server 127.0.0.1:3000;
+ keepalive 300;
+}
+
+server {
+ listen 80;
+ keepalive_requests 100000;
+ gzip on;
+ gzip_types application/json text/plain application/xml application/javascript;
+ gzip_proxied any;
+ root /srv/explorer/static/{DAEMON}-{NETWORK};
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 15;
+ location /{NGINX_PATH}api/ {
+ access_log off;
+ proxy_pass http://backend/;
+ proxy_redirect / /{NGINX_PATH}api/;
+ expires 30s;
+ add_header Access-Control-Allow-Origin *;
+ add_header Cache-Control "public";
+ }
+ location /{NGINX_PATH}api/address/ {
+ access_log off;
+ proxy_pass http://backend/address/;
+ proxy_redirect / /{NGINX_PATH}api/address/;
+ expires 30s;
+ add_header Access-Control-Allow-Origin *;
+ add_header Cache-Control "public";
+ }
+ location /{NGINX_PATH}api/block/ {
+ access_log off;
+ proxy_pass http://backend/block/;
+ proxy_redirect / /{NGINX_PATH}api/block/;
+ expires 1m;
+ add_header Access-Control-Allow-Origin *;
+ add_header Cache-Control "public";
+ }
+ location /{NGINX_PATH}api/tx/ {
+ access_log off;
+ proxy_pass http://backend/tx/;
+ proxy_redirect / /{NGINX_PATH}api/tx/;
+ expires 1m;
+ add_header Access-Control-Allow-Origin *;
+ add_header Cache-Control "public";
+ }
+ location ~ ^/{NGINX_PATH}((tx|block|block-height|address)/|[a-zA-Z0-9]+$) {
+ access_log off;
+ try_files $uri /index.html;
+ }
+ location /{NGINX_PATH} {
+ access_log off;
+ expires 3m;
+ {NGINX_REWRITE}
+ add_header Access-Control-Allow-Origin *;
+ add_header Cache-Control "public";
+ }
+ location /{NGINX_NOSLASH_PATH} {
+ access_log off;
+ return 301 /{NGINX_PATH};
+ }
+ error_page 404 /{NGINX_PATH}notfound.html;
+ location = /notfound.html {
+ internal;
+ }
+}
diff --git a/contrib/supervisord.conf.in b/contrib/supervisord.conf.in
new file mode 100644
index 00000000..364597b0
--- /dev/null
+++ b/contrib/supervisord.conf.in
@@ -0,0 +1,28 @@
+[supervisord]
+nodaemon=true
+
+[program:{DAEMON}d]
+command=/srv/explorer/{DAEMON}/bin/{DAEMON}d -conf=/data/.{DAEMON}.conf -datadir=/data/{DAEMON}
+directory=/data
+
+[program:bitcoind_for_liquid]
+command=/srv/explorer/bitcoin/bin/bitcoind -conf=/data/.bitcoin_for_liquid.conf -datadir=/data/bitcoin_for_liquid
+directory=/data
+autostart={ISLIQUID}
+
+[program:electrs]
+command=/srv/explorer/electrs_{DAEMON}/bin/electrs --cookie admin1:{RPC_PASS} --network {ELECTRS_NETWORK} {PARENT_NETWORK} --daemon-dir /data/{DAEMON} --daemon-rpc-addr 127.0.0.1:{BTC_DAEMON_RPC_PORT} --monitoring-addr 0.0.0.0:4224 --db-dir /data/electrs_{DAEMON}_db/{NETWORK}
+autostart={EXPLORERAUTOSTART}
+directory=/data
+stopasgroup=true
+stderr_logfile=/data/logs/electrs-{DAEMON}.log
+stderr_logfile_maxbytes=1MB
+stderr_logfile_backups=5
+
+[program:nginx]
+command=/usr/sbin/nginx -g "daemon off;"
+autostart={EXPLORERAUTOSTART}
+
+[program:tor]
+command=/usr/bin/tor
+autostart={TORAUTOSTART}
diff --git a/convert_translation_strings.py b/convert_translation_strings.py
new file mode 100755
index 00000000..4bc236a4
--- /dev/null
+++ b/convert_translation_strings.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+
+import argparse
+import json
+
+def main():
+ parser = argparse.ArgumentParser()
+ group = parser.add_mutually_exclusive_group(required=True)
+ group.add_argument('--json-to-txt', action='store_true')
+ group.add_argument('--txt-to-json', action='store_true')
+ parser.add_argument('-i', '--input', type=str, required=True)
+ parser.add_argument('-s', '--sourcestrings', type=str, required=True)
+ parser.add_argument('-v', '--verbose', help='Increase output verbosity', action='store_true')
+
+ args = parser.parse_args()
+
+ if args.verbose:
+ print('# Verbosity turned on, reading file {}'.format(args.input))
+
+ with open(args.sourcestrings) as f:
+ sourcestrings = f.read().splitlines()
+
+ if args.json_to_txt:
+ # the translation files in txt format need to be the same number of lines as the uploaded strings file
+
+ with open(args.input) as f:
+ data = json.load(f)
+
+ for k in sourcestrings:
+ if not k.strip():
+ continue
+ try:
+ if not isinstance(data[k], list):
+ print(data[k])
+ else:
+ print(k)
+ except KeyError:
+ print(k)
+
+ elif args.txt_to_json:
+ with open(args.input) as f:
+ data = f.read().splitlines()
+ print('{')
+ json_entries = []
+ for i in range(len(sourcestrings)):
+ if sourcestrings[i] == data[i]:
+ # we don't need the translation if it's the same as english
+ continue
+ entry = ' "{}": "{}"'.format(sourcestrings[i], data[i])
+ json_entries.append(entry)
+ print(',\n'.join(json_entries))
+ print('}')
+
+if __name__== '__main__':
+ main()
diff --git a/flavors/bitcoin-mainnet.sh b/flavors/bitcoin-mainnet.sh
new file mode 100755
index 00000000..2165c0a4
--- /dev/null
+++ b/flavors/bitcoin-mainnet.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+export SITE_TITLE='Bitcoin Explorer'
+export DEST=${DEST:-dist/bitcoin-mainnet}
+
+export MENU_ACTIVE='Bitcoin'
+export BASE_HREF='/'
+
+source flavors/common-envs.sh
+
+npm run dist
diff --git a/flavors/bitcoin-testnet-logo.svg b/flavors/bitcoin-testnet-logo.svg
new file mode 100644
index 00000000..a4f1a425
--- /dev/null
+++ b/flavors/bitcoin-testnet-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/flavors/bitcoin-testnet.css b/flavors/bitcoin-testnet.css
new file mode 100644
index 00000000..6957dd52
--- /dev/null
+++ b/flavors/bitcoin-testnet.css
@@ -0,0 +1,34 @@
+
+.jumbotron-fluid {
+ background-image: linear-gradient(-90deg, rgba(84, 103, 124, 1) 0%, rgba(29, 72, 111, 1) 18%, rgba(24, 53, 80, 1) 36%, rgba(29, 37, 48, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.search-bar {
+ border: 1px solid rgba(168, 184, 201, 1);
+ box-shadow: 0px 0px 6px 0px rgba(168, 184, 201, 1);
+}
+
+.jumbotron-fluid.block-page {
+ background-image: linear-gradient(-90deg, rgba(84, 103, 124, 1) 0%, rgba(29, 72, 111, 1) 18%, rgba(24, 53, 80, 1) 36%, rgba(29, 37, 48, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.addr-page {
+ background-image: linear-gradient(-90deg, rgba(84, 103, 124, 1) 0%, rgba(29, 72, 111, 1) 18%, rgba(24, 53, 80, 1) 36%, rgba(29, 37, 48, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.transaction-page {
+ background-image: linear-gradient(-90deg, rgba(84, 103, 124, 1) 0%, rgba(29, 72, 111, 1) 18%, rgba(24, 53, 80, 1) 36%, rgba(29, 37, 48, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.details-btn > div {
+ color: rgba(168, 184, 201, 1);
+ border: 1px solid rgba(168, 184, 201, 1);
+}
+
+.transaction-box > .footer > div:nth-child(3) {
+ color: rgba(168, 184, 201, 1);
+}
+
+.navbar {
+ background-image: linear-gradient(-90deg, rgba(84, 103, 124, 1) 0%, rgba(29, 72, 111, 1) 18%, rgba(24, 53, 80, 1) 36%, rgba(29, 37, 48, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
\ No newline at end of file
diff --git a/flavors/bitcoin-testnet.sh b/flavors/bitcoin-testnet.sh
new file mode 100755
index 00000000..18e3d663
--- /dev/null
+++ b/flavors/bitcoin-testnet.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+export SITE_TITLE='Bitcoin Testnet Explorer'
+export DEST=${DEST:-dist/bitcoin-testnet}
+export NATIVE_ASSET_LABEL=tBTC
+
+export MENU_ACTIVE='Bitcoin Testnet'
+export BASE_HREF='/testnet/'
+export API_URL="${BASE_HREF}api"
+source flavors/common-envs.sh
+
+npm run dist
+
+cp flavors/bitcoin-testnet-logo.svg $DEST/img/icons/menu-logo.svg
+cp flavors/search_testnet.svg $DEST/img/icons/search.svg
+cp flavors/bitcoin-testnet_block.svg $DEST/img/block.svg
+cp flavors/minus_testnet.svg $DEST/img/icons/minus.svg
+cp flavors/plus_testnet.svg $DEST/img/icons/plus.svg
+cp flavors/transaction_testnet.svg $DEST/img/transaction.svg
+cat flavors/bitcoin-testnet.css >> $DEST/style.css
diff --git a/flavors/bitcoin-testnet_block.svg b/flavors/bitcoin-testnet_block.svg
new file mode 100644
index 00000000..c1351f54
--- /dev/null
+++ b/flavors/bitcoin-testnet_block.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/flavors/common-envs.sh b/flavors/common-envs.sh
new file mode 100755
index 00000000..c20efa1c
--- /dev/null
+++ b/flavors/common-envs.sh
@@ -0,0 +1,10 @@
+export SITE_DESC='Blockstream Block Explorer'
+export SITE_FOOTER='ยฉ 2018 Blockstream Corp. All rights reserved.'
+export CUSTOM_HEAD_HTML=''
+export MENU_ITEMS='{
+ "Bitcoin": "/"
+, "Liquid": "/liquid/"
+, "Bitcoin Testnet": "/testnet/"
+}'
+export ONION_V3="http://explorerzydxu5ecjrkwceayqybizmpjjznk5izmitf2modhcusuqlid.onion"
+export ONION_V2="http://explorernuoc63nb.onion"
diff --git a/flavors/header_liquid.png b/flavors/header_liquid.png
new file mode 100644
index 00000000..4ad7b391
Binary files /dev/null and b/flavors/header_liquid.png differ
diff --git a/flavors/header_testnet.png b/flavors/header_testnet.png
new file mode 100644
index 00000000..88e115ff
Binary files /dev/null and b/flavors/header_testnet.png differ
diff --git a/flavors/liquid-mainnet-logo.svg b/flavors/liquid-mainnet-logo.svg
new file mode 100644
index 00000000..4533cdb4
--- /dev/null
+++ b/flavors/liquid-mainnet-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/flavors/liquid-mainnet.css b/flavors/liquid-mainnet.css
new file mode 100644
index 00000000..3d559f1f
--- /dev/null
+++ b/flavors/liquid-mainnet.css
@@ -0,0 +1,58 @@
+
+.jumbotron-fluid {
+ background-image: linear-gradient(-90deg, rgba(13, 141, 119, 1) 0%, rgba(17, 103, 97, 1) 16%, rgba(25, 68, 74, 1) 35%, rgba(29, 42, 48, 1) 57%, rgba(14, 16, 17, 1) 100%);
+}
+
+.search-bar {
+ border: 1px solid rgba(72, 183, 169, 1);
+ box-shadow: 0px 0px 6px 0px rgba(70, 180, 165, 1);
+}
+
+.explorer-title-container_logo {
+ height: 80px;
+ width: auto;
+ margin-right: 10px;
+}
+
+.jumbotron-fluid.block-page {
+ background-image: linear-gradient(-90deg, rgba(13, 141, 119, 1) 0%, rgba(17, 103, 97, 1) 16%, rgba(25, 68, 74, 1) 35%, rgba(29, 42, 48, 1) 57%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.addr-page {
+ background-image: linear-gradient(-90deg, rgba(13, 141, 119, 1) 0%, rgba(17, 103, 97, 1) 16%, rgba(25, 68, 74, 1) 35%, rgba(29, 42, 48, 1) 57%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.transaction-page {
+ background-image: linear-gradient(-90deg, rgba(13, 141, 119, 1) 0%, rgba(17, 103, 97, 1) 16%, rgba(25, 68, 74, 1) 35%, rgba(29, 42, 48, 1) 57%, rgba(14, 16, 17, 1) 100%);
+}
+
+.details-btn > div {
+ color: rgba(40, 148, 143, 1);
+ border: 1px solid rgba(40, 148, 143, 1);
+}
+
+.transaction-box > .footer > div:nth-child(3) {
+ color: rgba(40, 148, 143, 1);
+}
+
+.navbar {
+ background-image: linear-gradient(-90deg, rgba(13, 141, 119, 1) 0%, rgba(17, 103, 97, 1) 16%, rgba(25, 68, 74, 1) 35%, rgba(29, 42, 48, 1) 57%, rgba(14, 16, 17, 1) 100%);
+}
+
+.explorer-title-container {
+ margin-top: 0;
+}
+
+.form-inline {
+ margin-top: -15px;
+}
+
+
+@media only screen and (max-width: 450px) {
+ .explorer-title-container_logo {
+ height: 70px;
+ width: auto;
+ margin-right: 10px;
+ }
+}
+
diff --git a/flavors/liquid-mainnet.sh b/flavors/liquid-mainnet.sh
new file mode 100755
index 00000000..dbe7b1cf
--- /dev/null
+++ b/flavors/liquid-mainnet.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+export SITE_TITLE='Liquid Explorer'
+export HOME_TITLE='Explorer'
+export DEST=${DEST:-dist/liquid-mainnet}
+export NATIVE_ASSET_LABEL=L-BTC
+export NATIVE_ASSET_ID="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d"
+
+
+export MENU_ACTIVE='Liquid'
+export BASE_HREF='/liquid/'
+export API_URL="${BASE_HREF}api"
+source flavors/common-envs.sh
+
+npm run dist
+
+cp flavors/liquid-mainnet-logo.svg $DEST/img/icons/menu-logo.svg
+cp flavors/search_liquid.svg $DEST/img/icons/search.svg
+cp flavors/liquid_block.svg $DEST/img/block.svg
+cp flavors/minus_liquid.svg $DEST/img/icons/minus.svg
+cp flavors/plus_liquid.svg $DEST/img/icons/plus.svg
+cp flavors/transaction_liquid.svg $DEST/img/transaction.svg
+cat flavors/liquid-mainnet.css >> $DEST/style.css
diff --git a/flavors/liquid_block.svg b/flavors/liquid_block.svg
new file mode 100644
index 00000000..232ce010
--- /dev/null
+++ b/flavors/liquid_block.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/flavors/minus_liquid.svg b/flavors/minus_liquid.svg
new file mode 100755
index 00000000..e5c5cc63
--- /dev/null
+++ b/flavors/minus_liquid.svg
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/flavors/minus_testnet.svg b/flavors/minus_testnet.svg
new file mode 100755
index 00000000..daa973c9
--- /dev/null
+++ b/flavors/minus_testnet.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/flavors/plus_liquid.svg b/flavors/plus_liquid.svg
new file mode 100755
index 00000000..aa9d797b
--- /dev/null
+++ b/flavors/plus_liquid.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/flavors/plus_testnet.svg b/flavors/plus_testnet.svg
new file mode 100755
index 00000000..089ae4ad
--- /dev/null
+++ b/flavors/plus_testnet.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/flavors/search_liquid.svg b/flavors/search_liquid.svg
new file mode 100644
index 00000000..20cbdcd7
--- /dev/null
+++ b/flavors/search_liquid.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/flavors/search_testnet.svg b/flavors/search_testnet.svg
new file mode 100644
index 00000000..fc3d5eba
--- /dev/null
+++ b/flavors/search_testnet.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/flavors/transaction_liquid.svg b/flavors/transaction_liquid.svg
new file mode 100644
index 00000000..73465533
--- /dev/null
+++ b/flavors/transaction_liquid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/flavors/transaction_testnet.svg b/flavors/transaction_testnet.svg
new file mode 100644
index 00000000..7610ab4b
--- /dev/null
+++ b/flavors/transaction_testnet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/index.pug b/index.pug
new file mode 100644
index 00000000..790d102a
--- /dev/null
+++ b/index.pug
@@ -0,0 +1,20 @@
+doctype html
+
+meta(charset='utf-8')
+title= process.env.SITE_TITLE || 'Block Explorer'
+meta(property='og:title', content=process.env.OG_TITLE || process.env.SITE_TITLE || 'Block explorer')
+meta(name='description', content=process.env.SITE_DESC || 'Esplora Block Explorer')
+
+base(href=process.env.BASE_HREF || '/')
+
+meta(name='viewport', content='width=device-width, initial-scale=1')
+link(rel='shortcut icon', type='image/png', href='img/favicon_new.png')
+link(rel='stylesheet', href='bootstrap.min.css')
+link(rel='stylesheet', href='style.css')
+
+!= process.env.CUSTOM_HEAD_HTML
+
+body(class=prerender_html?'theme-dark':'')
+ #liquid-explorer.liquid-explorer!= prerender_html || ''
+ script(src='app.js', async)
+ != process.env.CUSTOM_HTML
diff --git a/lang/bs.json b/lang/bs.json
new file mode 100644
index 00000000..c6da8bc4
--- /dev/null
+++ b/lang/bs.json
@@ -0,0 +1,53 @@
+{
+ "lang_name": "Bosanski",
+ "%s Confirmations": [
+ "",
+ "1 Potvrda",
+ "%0 Potvrda"
+ ],
+ "Unconfirmed": "Nema Potvrda",
+ "In best chain (%s confirmations)": [
+ "",
+ "U najnoljem lancu (1 conferma)",
+ "U najnoljem lancu (%0 conferme)"
+ ],
+ "Page Not Found": "Strana nije pronadjena",
+ "Loading...": "Ucitavanje...",
+ "Recent Blocks": "Novi blokovi",
+ "Transactions": "Transakcije",
+ "Load more": "Ucitaj jos",
+ "No results found": "Nema rezultata",
+ "Block %s": "blok %0",
+ "Previous": "Prethodni",
+ "Status": "Status",
+ "%s Transactions": "%0 Transakcija",
+ "Next": "Sledece",
+ "%s of %s Transactions": "%0 od %1 Transakicja",
+ "Details": "Detalji",
+ "Transaction": "Transakcija",
+ "Included in Block": "Ukljuceno u blok",
+ "Address": "Adresa",
+ "Transaction count": "Broj transakcija",
+ "Total received": "Ukupno primljeno",
+ "Confirmed balance": "Potvrdjen balans",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Izvinjenje! Adrese sa velikim brojem transakcija nisu trenutno podrzane",
+ "Orphan": "Orfan",
+ "Search for block height, hash, transaction, or address": "Pretraga po visini bloka, hash, transakciji ili adresi",
+ "Block #%s: %s": "Blok #%0: %1",
+ "Transaction: %s": "Transakcija: %0",
+ "Address: %s": "Adresa: %0",
+ "Size (bytes)": "Velicina (bytes)",
+ "Size (KB)": "Velicina (KB)",
+ "Height": "Visina",
+ "Virtual Size (KVB)": "Virtualna velicina (KVB)",
+ "Weight units (KWU)": "Virtuelna jedinica (KWU)",
+ "Virtual size (vbytes)": "Virtualna Velicina (vbytes)",
+ "Weight units (WU)": "Jedinica Tezine (WU)",
+ "Version": "Verzija",
+ "Type": "Tip",
+ "Confidential": "Poverljivo",
+ "Timestamp": "Vreme",
+ "Weight (KWU)": "Tezina (KWU)",
+ "Spent by": "Potroseni od strane",
+ "Unspent": "Nepotroseni"
+}
diff --git a/lang/de.json b/lang/de.json
new file mode 100644
index 00000000..c409700e
--- /dev/null
+++ b/lang/de.json
@@ -0,0 +1,54 @@
+{
+ "lang_name": "Deutsch",
+ "%s Confirmations": [
+ "",
+ "1 Bestรคtigung",
+ "%0 Bestรคtigungen"
+ ],
+ "Unconfirmed": "Unbestรคtigt",
+ "In best chain (%s confirmations)": [
+ "",
+ "In bester Chain (1 Bestรคtigung)",
+ "In bester Chain (%0 Bestรคtigungen)"
+ ],
+ "Page Not Found": "Seite nicht gefunden",
+ "Loading...": "Wird geladen...",
+ "Recent Blocks": "Neuste Blรถcke",
+ "Transactions": "Transaktionen",
+ "Load more": "Mehr laden",
+ "No results found": "Keine Ergebnisse gefunden",
+ "Block %s": "Block %0",
+ "Previous": "Vorheriger",
+ "Status": "Status",
+ "%s Transactions": "%0 Transaktionen",
+ "Next": "Nรคchster",
+ "%s of %s Transactions": "%0 von %1 Transaktionen",
+ "Details": "Details",
+ "Transaction": "Transaktion",
+ "Included in Block": "Beinhaltet in Block",
+ "Address": "Adresse",
+ "Transaction count": "Anzahl von Transaktionen",
+ "Total received": "Insgesamt erhalten",
+ "Confirmed balance": "Bestรคtigter Kontostand",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Entschuldigung! Adressen mit einer groรen Anzahl von Transaktionen werden aktuell nicht unterstuetzt",
+ "Orphan": "Orfano",
+ "Search for block height, hash, transaction, or address": "Suche nach Blockhรถhe, Hash, Transaktion oder Adresse",
+ "Block #%s: %s": "Block #%0: %1",
+ "Transaction: %s": "Transaktion: %0",
+ "Address: %s": "Adresse: %0",
+ "Size (bytes)": "Grรถรe (bytes)",
+ "Size (KB)": "Grรถsse (KB)",
+ "Height": "Hรถhe",
+ "Virtual Size (KVB)": "Virtuelle Grรถรe (KVB)",
+ "Weight units (KWU)": "Gewichtseinheiten (KWU)",
+ "Virtual size (vbytes)": "Virtuelle Grรถรe (vbytes)",
+ "Weight units (WU)": "Gewichtseinheiten (WU)",
+ "Version": "Version",
+ "Transaction fees": "Gebรผhr",
+ "Type": "Type",
+ "Confidential": "Confidential",
+ "Timestamp": "Zeitstempel",
+ "Weight (KWU)": "Gewicht (KWU)",
+ "Spent by": "Ausgegeben von",
+ "Unspent": "Nicht ausgegeben"
+}
diff --git a/lang/en.json b/lang/en.json
new file mode 100644
index 00000000..05faa294
--- /dev/null
+++ b/lang/en.json
@@ -0,0 +1,18 @@
+{
+ "lang_name": "English",
+ "%s Confirmations": [
+ "",
+ "1 Confirmation",
+ "%0 Confirmations"
+ ],
+ "In best chain (%s confirmations)": [
+ "",
+ "In best chain (1 confirmation)",
+ "In best chain (%0 confirmations)"
+ ],
+ "%s Transactions": [
+ "",
+ "1 Transaction",
+ "%0 Transactions"
+ ]
+}
diff --git a/lang/es.json b/lang/es.json
new file mode 100644
index 00000000..93e985c2
--- /dev/null
+++ b/lang/es.json
@@ -0,0 +1,52 @@
+{
+ "lang_name": "Espaรฑol",
+ "Page Not Found": "Pรกgina No Encontrada",
+ "Loading...": "Cargando...",
+ "Recent Blocks": "Bloques Recientes",
+ "Height": "Altura",
+ "Timestamp": "Fecha y Hora",
+ "Transactions": "Transacciones",
+ "Size (KB)": "Tamaรฑo (KB)",
+ "Weight (KWU)": "Peso (KWU)",
+ "Load more": "Mostrar siguiente",
+ "No results found": "No se encontraron resultados para su bรบsqueda",
+ "Block %s": "Bloque %0",
+ "Previous": "Previo",
+ "Status": "Estatus",
+ "Virtual Size (KVB)": "Tamaรฑo Virtual (KVB)",
+ "Weight units (KWU)": "Unidades de Peso (KWU)",
+ "%s Transactions": "Transacciones %0",
+ "Next": "Siguiente",
+ "In best chain (%s confirmations)": "En cadena mรกs larga (%0 confirmaciones)",
+ "%s of %s Transactions": "Transacciones %0 de %1",
+ "Details": "Detalles",
+ "Nonstandard": "No estรกndar",
+ "Transaction": "Transacciรณn",
+ "Size (bytes)": "Tamaรฑo (bytes)",
+ "Virtual size (vbytes)": "Tamaรฑo virtual (vbytes)",
+ "Weight units (WU)": "Unidades de peso (WU)",
+ "Transaction fees": "Tarifa for transacciรณn",
+ "Version": "Versiรณn",
+ "Included in Block": "Incluida en bloque",
+ "Address": "Direcciรณn",
+ "Transaction count": "Total de transacciones",
+ "Total received": "Total recibido",
+ "Confirmed balance": "Balance confirmado",
+ "Unconfirmed balance": "Balance sin confirmar",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Lo sentimos! Direciones con un largo nรบmero de transacciones no son soportadas en este momento.",
+ "We encountered an error. Please try again later.": "Encontramos un error. Por favor intenta nuevamente mรกs tarde.",
+ "Type": "Tipo",
+ "OP_RETURN data": "Datos OP_RETURN",
+ "Witness": "testigo",
+ "Search for block height, hash, transaction, or address": "Busca por altura de bloque, hash, transacciรณn o direcciรณn",
+ "Powered by esplora": "Desarrollado por esplora",
+ "Block #%s: %s": "Bloque #%0: %1",
+ "Transaction: %s": "Transacciรณn: %0",
+ "Address: %s": "Direcciรณn %0",
+ "Spent by": "Gastado por",
+ "Unspent": "No gastado",
+ "Peg-out": "Peg-Out",
+ "Peg-out to": "Peg-out a",
+ "Peg-out address": "Direcciรณn de Peg-out ",
+ "Output in parent chain": "Salida en cadena principal"
+}
diff --git a/lang/fr.json b/lang/fr.json
new file mode 100644
index 00000000..27bd2023
--- /dev/null
+++ b/lang/fr.json
@@ -0,0 +1,52 @@
+{
+ "lang_name": "Franรงais",
+ "%s Confirmations": [
+ "",
+ "1 confirmation",
+ "%0 confirmations"
+ ],
+ "Unconfirmed": "Non confirmรฉe",
+ "In best chain (%s confirmations)": [
+ "",
+ "Dans la chaine la plus longue (1 confirmation)",
+ "Dans la chaine la plus longue (%0 confirmations)"
+ ],
+ "Page Not Found": "Page non trouvรฉe",
+ "Loading...": "Chargement...",
+ "Recent Blocks": "Blocs rรฉcents",
+ "Transactions": "Transactions",
+ "Load more": "Afficher plus",
+ "No results found": "Aucun rรฉsultat",
+ "Block %s": "Bloc %0",
+ "Previous": "Prรฉcรฉdent",
+ "Status": "Statut",
+ "%s Transactions": "%0 Transactions",
+ "Next": "Suivant",
+ "%s of %s Transactions": "%0 sur %1 Transactions",
+ "Details": "Dรฉtails",
+ "Transaction": "Transaction",
+ "Included in Block": "Inclue dans le bloc",
+ "Address": "Adresse",
+ "Transaction count": "Nombre de transactions",
+ "Total received": "Total reรงu",
+ "Confirmed balance": "Solde confirmรฉ",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Dรฉsolรฉ ! Les adresses ayant un grand nombre de transactions ne sont pas encore supportรฉes.",
+ "Orphan": "Orphelin",
+ "Search for block height, hash, transaction, or address": "Numรฉro de bloc, hash, transaction ou adresse",
+ "Block #%s: %s": "Bloc #%0: %1",
+ "Transaction: %s": "Transaction: %0",
+ "Address: %s": "Adresse: %0",
+ "Size (bytes)": "Taille (octets)",
+ "Size (KB)": "Taille (Ko)",
+ "Height": "Hauteur",
+ "Virtual Size (KVB)": "Taille virtuelle (KVB)",
+ "Weight units (KWU)": "Unitรฉ de poids (KWU)",
+ "Virtual size (vbytes)": "Taille virtuelle (vbytes)",
+ "Weight units (WU)": "Unitรฉ de poids (WU)",
+ "Transaction fees": "Frais de transaction",
+ "Confidential": "Confidentiel",
+ "Timestamp": "Date",
+ "Weight (KWU)": "Poids (KWU)",
+ "Spent by": "Dรฉpensรฉ par",
+ "Unspent": "Non dรฉpensรฉ"
+}
diff --git a/lang/he.json b/lang/he.json
new file mode 100644
index 00000000..84534095
--- /dev/null
+++ b/lang/he.json
@@ -0,0 +1,66 @@
+{
+ "lang_name": "ืขืืจืืช",
+ "style.css": "style-rtl.css",
+ "ltr": "rtl",
+ "%s Confirmations": [
+ "",
+ "ืืืฉืืจ ืืื",
+ "%0 ืืืฉืืจืื"
+ ],
+ "Unconfirmed": "ืื ืืืืฉืจ",
+ "In best chain (%s confirmations)": [
+ "",
+ "ืืฉืจืฉืจืช ืืื ืืืื (ืืืฉืืจ ืืื)",
+ "ืืฉืจืฉืจืช ืืื ืืืื (%0 ืืืฉืืจืื)"
+ ],
+ "Page Not Found": "ืขืืื ืื ื ืืฆื",
+ "Block not found": "ืืืืง ืื ื ืืฆื",
+ "Transaction not found": "ืืจื ืืงืฆืื ืื ื ืืฆืื",
+ "Loading...": "ืืืขื...",
+ "Recent Blocks": "ืืืืงืื ืืืจืื ืื",
+ "Transactions": "ืืจื ืืงืฆืืืช",
+ "Load more": "ืืขื ืขืื",
+ "No results found": "ืื ื ืืฆืื ืชืืฆืืืช",
+ "Block %s": "ืืืืง %0",
+ "Previous": "ืงืืื",
+ "Status": "ืกืืืืก",
+ "%s Transactions": ["ืืื ืืจื ืืงืฆืืืช","ืืจื ืืงืฆืื ืืืช","%0 ืืจื ืืงืฆืืืช"],
+ "Next": "ืืื",
+ "%s of %s Transactions": "%0 ืืชืื %1 ืืจื ืืงืฆืืืช",
+ "Details": "ืคืจืืื",
+ "Transaction": "ืืจื ืืงืฆืื",
+ "Included in Block": "ืืืื ืืืืืง",
+ "Address": "ืืชืืืช",
+ "Transaction count": "ืืกืคืจ ืืจื ืืงืฆืืืช",
+ "Total received": "ืกื\"ื ืืชืงืื",
+ "Confirmed balance": "ืืชืจื ืืืืฉืจืช",
+ "Unconfirmed balance": "ืืชืจื ืื ืืืืฉืจืช",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "ืื ื ืืชื ืฆืืื! ืืชืืืืช ืขื ืืืืช ืืืืื ืฉื ืืจื ืืงืฆืืืช ืื ื ืชืืืืช ืืขืช.",
+ "We encountered an error. Please try again later.": "ืืชืจืืฉื ืฉืืืื. ื ื ืื ืกืืช ืฉืื ืืืืืจ ืืืชืจ.",
+ "Orphan": "ืืชืื",
+ "Search for block height, hash, transaction, or address": "ืืคืฉ ืืคื ืืืื ืืืืง, ืืืฉ ืืืืง, ืืจื ืืงืฆืื ืื ืืชืืืช",
+ "Block #%s: %s": "ืืืืง #%0: %1",
+ "Transaction: %s": "ืืจื ืืงืฆืื: %0",
+ "Address: %s": "ืืชืืืช: %0",
+ "Size (bytes)": "ืืืื (ืืืืืื)",
+ "Size (KB)": "ืืืื (KB)",
+ "Height": "ืืืื",
+ "Virtual Size (KVB)": "ืืืื ืืืจืืืืื (KVB)",
+ "Weight units (KWU)": "ืืืืืืช ืืฉืงื (KWU)",
+ "Virtual size (vbytes)": "ืืืื ืืืจืืืืื (vbytes)",
+ "Weight units (WU)": "ืืืืืืช ืืฉืงื (WU)",
+ "Version": "ืืืจืกื",
+ "Transaction fees": "ืขืืืช ืืจื ืืงืฆืื",
+ "Type": "ืกืื",
+ "Confidential": "ืืกืื",
+ "Timestamp": "ืืื",
+ "Weight (KWU)": "ืืฉืงื (KWU)",
+ "Spent by": "ื ืืฆื ืข\"ื",
+ "Unspent": "ืื ื ืืฆื",
+ "Nonstandard": "ืื ืกืื ืืจืื",
+ "Lock time": "ื ืขืืืช ืืื",
+ "OP_RETURN data": "ืืืืข OP_RETURN",
+ "Output in parent chain": "ืืืืข ืืฉืจืฉืจืช ืื",
+ "Coinbase": "ืคืจืก ืืจืืื",
+ "Spending tx": "ื ืืฆื ืข\"ื"
+}
diff --git a/lang/hr.json b/lang/hr.json
new file mode 100644
index 00000000..b669f9a3
--- /dev/null
+++ b/lang/hr.json
@@ -0,0 +1,53 @@
+{
+ "lang_name": "Hrvatski",
+ "%s Confirmations": [
+ "",
+ "1 Potvrda",
+ "%0 Potvrda"
+ ],
+ "Unconfirmed": "Nema Potvrda",
+ "In best chain (%s confirmations)": [
+ "",
+ "U najnoljem lancu (1 conferma)",
+ "U najnoljem lancu (%0 conferme)"
+ ],
+ "Page Not Found": "Strana nije pronadjena",
+ "Loading...": "Ucitavanje...",
+ "Recent Blocks": "Novi blokovi",
+ "Transactions": "Transakcije",
+ "Load more": "Ucitaj jos",
+ "No results found": "Nema rezultata",
+ "Block %s": "blok %0",
+ "Previous": "Prethodni",
+ "Status": "Status",
+ "%s Transactions": "%0 Transakcija",
+ "Next": "Sledece",
+ "%s of %s Transactions": "%0 od %1 Transakicja",
+ "Details": "Detalji",
+ "Transaction": "Transakcija",
+ "Included in Block": "Ukljuceno u blok",
+ "Address": "Adresa",
+ "Transaction count": "Broj transakcija",
+ "Total received": "Ukupno primljeno",
+ "Confirmed balance": "Potvrdjen balans",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Izvinjenje! Adrese sa velikim brojem transakcija nisu trenutno podrzane",
+ "Orphan": "Orfan",
+ "Search for block height, hash, transaction, or address": "Pretraga po visini bloka, hash, transakciji ili adresi",
+ "Block #%s: %s": "Blok #%0: %1",
+ "Transaction: %s": "Transakcija: %0",
+ "Address: %s": "Adresa: %0",
+ "Size (bytes)": "Velicina (bytes)",
+ "Size (KB)": "Velicina (KB)",
+ "Height": "Visina",
+ "Virtual Size (KVB)": "Virtualna velicina (KVB)",
+ "Weight units (KWU)": "Virtuelna jedinica (KWU)",
+ "Virtual size (vbytes)": "Virtualna Velicina (vbytes)",
+ "Weight units (WU)": "Jedinica Tezine (WU)",
+ "Version": "Verzija",
+ "Type": "Tip",
+ "Confidential": "Poverljivo",
+ "Timestamp": "Vreme",
+ "Weight (KWU)": "Tezina (KWU)",
+ "Spent by": "Potroseni od strane",
+ "Unspent": "Nepotroseni"
+}
diff --git a/lang/it.json b/lang/it.json
new file mode 100644
index 00000000..35ed05a2
--- /dev/null
+++ b/lang/it.json
@@ -0,0 +1,55 @@
+{
+ "lang_name": "Italiano",
+ "%s Confirmations": [
+ "",
+ "1 Conferma",
+ "%0 Conferme"
+ ],
+ "Unconfirmed": "Non confermata",
+ "In best chain (%s confirmations)": [
+ "",
+ "Nella migliore catena (1 conferma)",
+ "Nella migliore catena (%0 conferme)"
+ ],
+ "Page Not Found": "Pagina Non Trovata",
+ "Loading...": "Caricamento in corso...",
+ "Recent Blocks": "Blocchi Recenti",
+ "Transactions": "Transazioni",
+ "Load more": "Continua",
+ "No results found": "Nessun risultato trovato",
+ "Block %s": "Blocco %0",
+ "Previous": "Precedente",
+ "Status": "Stato",
+ "%s Transactions": "%0 Transazioni",
+ "Next": "Prossimo",
+ "%s of %s Transactions": "%0 di %1 Transazioni",
+ "Details": "Dettagli",
+ "Transaction": "Transazione",
+ "Included in Block": "Inclusa in Blocco",
+ "Address": "Indirizzo",
+ "Transaction count": "Numero transazioni",
+ "Total received": "Totale ricevuto",
+ "Confirmed balance": "Totale confermato",
+ "Unconfirmed balance": "Totale in sospeso",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Ci dispiace! Indirizzi con tante transazioni non sono supportate al momento",
+ "Orphan": "Orfano",
+ "Search for block height, hash, transaction, or address": "Cerca per altezza blocco, hash, transazione o indirizzo",
+ "Block #%s: %s": "Blocco #%0: %1",
+ "Transaction: %s": "Transazione: %0",
+ "Address: %s": "Indirizzo: %0",
+ "Size (bytes)": "Dimensione (bytes)",
+ "Size (KB)": "Dimensione (KB)",
+ "Height": "Altezza",
+ "Virtual Size (KVB)": "Dimensione Virtuale (KVB)",
+ "Weight units (KWU)": "Unitร di peso (KWU)",
+ "Virtual size (vbytes)": "Dimensione Virtuale (vbytes)",
+ "Weight units (WU)": "Unitร di peso (WU)",
+ "Version": "Versione",
+ "Transaction fees": "Commissione transazione",
+ "Type": "Tipologia",
+ "Confidential": "Confidenziale",
+ "Timestamp": "Data",
+ "Weight (KWU)": "Peso (KWU)",
+ "Spent by": "Spesa da",
+ "Unspent": "Non spesa"
+}
diff --git a/lang/jp.json b/lang/jp.json
new file mode 100644
index 00000000..f5e6e67a
--- /dev/null
+++ b/lang/jp.json
@@ -0,0 +1,51 @@
+{
+ "lang_name": "ๆฅๆฌ่ช",
+ "Page Not Found": "ใใผใธใ่ฆใคใใใพใใใ",
+ "Loading...": "ใญใผใใฃใณใฐไธญ",
+ "Recent Blocks": "ๆๆฐใฎใใญใใฏ",
+ "Height": "ใใญใใฏ้ซ",
+ "Timestamp": "ใฟใคใ ในใฟใณใ",
+ "Transactions": "ใใฉใณใถใฏใทใงใณ",
+ "Size (KB)": "ใตใคใบ(ใใคใ)",
+ "Weight (KWU)": "ใใญใใฏใฆใงใคใ",
+ "Load more": "ใใใซ่กจ็คบ",
+ "No results found": "็ตๆใใใใพใใ",
+ "Block %s": "ใใญใใฏ๏ผ
s",
+ "Previous": "ๅใซ",
+ "Status": "ในใใผใฟใน",
+ "Virtual Size (KVB)": "ใใผใใฃใซใตใคใบ(KVB)",
+ "Weight units (KWU)": "ใฆใงใคใใฆใใใ(KWU)",
+ "%s Transactions": "๏ผ
sใใฉใณใถใฏใทใงใณ",
+ "Next": "ๆฌกใธ",
+ "In best chain (%s confirmations)": "ๆ้ทใใงใผใณ(%0 ๆค่จผ)",
+ "%s of %s Transactions": "ใใฉใณใถใฏใทใงใณๆฐ",
+ "Details": "่ฉณ็ดฐ",
+ "Nonstandard": "ใใณใปในใฟใณใใผใ",
+ "Transaction": "ใใฉใณใถใฏใทใงใณ",
+ "Size (bytes)": "ใตใคใบ(ใใคใ)",
+ "Virtual size (vbytes)": "ใใผใใฃใซใตใคใบ(vใใคใ)",
+ "Weight units (WU)": "ใฆใงใคใใฆใใใ(KWU)",
+ "Transaction fees": "ใใฉใณใถใฏใทใงใณๆๆฐๆ",
+ "Version": "ใใผใธใงใณ",
+ "Lock time": "ใญใใฏใฟใคใ ",
+ "Included in Block": "ใใญใใฏๅ
ๅฎน",
+ "Address": "ใขใใฌใน",
+ "Transaction count": "ใใฉใณใถใฏใทใงใณๆฐ",
+ "Total received": "็ทๅ
ฅ้้ก",
+ "Confirmed balance": "ๆค่จผๆธใฟๆฎ้ซ",
+ "Unconfirmed balance": "ๆชๆค่จผๆฎ้ซ",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "ๅคงๅค็ณใ่จณใใใพใใใๅคๆฐใฎใใฉใณใถใฏใทใงใณใไฟๆใใใขใใฌในใฏ็พๅจ่กจ็คบใงใใพใใใ",
+ "We encountered an error. Please try again later.": "ใจใฉใผใ็บ็ใใพใใใๅพใปใฉใใไธๅบฆใ่ฉฆใไธใใใ",
+ "Type": "ใฟใคใ",
+ "OP_RETURN data": "OP_RETURN ใใผใฟ",
+ "Search for block height, hash, transaction, or address": "ใใญใใฏ้ซใใใใทใฅใใใฉใณใถใฏใทใงใณๅใฏใขใใฌในใๆค็ดขใใ",
+ "Block #%s: %s": "ใใญใใฏ #%0: %1",
+ "Transaction: %s": "ใใฉใณใถใฏใทใงใณ: %0",
+ "Address: %s": "ใขใใฌใน: %0",
+ "Spent by": "ไฝฟ็จ่
",
+ "Unspent": "ๆชไฝฟ็จ",
+ "Peg-out to": "Peg-outๅ
",
+ "Peg-out address": "Peg-out ใขใใฌใน",
+ "Output in parent chain": "่ฆชใใงใผใณใฎใขใฆใใใใ",
+ "Coinbase": "ใณใคใณใใผใน"
+}
diff --git a/lang/json2po.js b/lang/json2po.js
new file mode 100755
index 00000000..d3eca8dc
--- /dev/null
+++ b/lang/json2po.js
@@ -0,0 +1,16 @@
+#!/usr/bin/env
+const { readFileSync } = require('fs')
+
+const escape = str => !str ? '' : str.replace(/[\\"]/g, "\\$&")
+
+const tran = JSON.parse(readFileSync('/dev/stdin'))
+ , tranEn = require(`./en.json`)
+
+const poStr = readFileSync("./strings.txt").toString('utf8').split("\n").filter(Boolean).map(str => {
+ const val = tran[str] || tranEn[str] || str
+ return Array.isArray(val) ? `msgid "${str}"\nmsgid_plural "${str}__plural"\n`
+ + val.slice(1).map((v, i) => `msgstr[${i}] "${escape(v || '-')}"`).join("\n")
+ : `msgid "${str}"\nmsgstr "${escape(val)}"`
+}).join("\n")
+
+console.log(poStr)
diff --git a/lang/ko.json b/lang/ko.json
new file mode 100644
index 00000000..09eaa728
--- /dev/null
+++ b/lang/ko.json
@@ -0,0 +1,56 @@
+{
+ "lang_name": "ํ๊ตญ์ด",
+ "Page Not Found": "ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์",
+ "Loading...": "๋ก๋ฉ...",
+ "Recent Blocks": "์ต๊ทผ ๋ธ๋ก",
+ "Height": "๋ธ๋ก ๋์ด",
+ "Timestamp": "ํ์ ์คํฌํ",
+ "Transactions": "๊ฑฐ๋",
+ "Size (KB)": "์ฌ์ด์ฆ (KB)",
+ "Weight (KWU)": "๋ฌด๊ฒ (KWU)",
+ "Load more": "๋ ๋ณด๊ธฐ",
+ "No results found": "๊ฒ์๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค",
+ "Block %s": "๋ธ๋ก %0",
+ "Previous": "์ด์ ",
+ "Status": "์ํ",
+ "Virtual Size (KVB)": "๊ฐ์ ์ฌ์ด์ฆ (KVB)",
+ "Weight units (KWU)": "๋ฌด๊ฒ ๋จ์ (KWU)",
+ "%s Transactions": "%0 ๊ฑฐ๋๋ค",
+ "Next": "๋ค์",
+ "In best chain (%s confirmations)": "ํ ์ฒด์ธ (%0 ์ปจํ)",
+ "%s of %s Transactions": "%0 ์ %1 ๊ฑฐ๋๋ค",
+ "Details": "์์ธํ",
+ "Nonstandard": "๋นํ์ค",
+ "Transaction": "๊ฑฐ๋",
+ "Size (bytes)": "์ฌ์ด์ฆ (๋ฐ์ดํธ)",
+ "Virtual size (vbytes)": "๊ฐ์ ์ฌ์ด์ฆ (v๋ฐ์ดํธ)",
+ "Weight units (WU)": "๋ฌด๊ฒ ๋จ์ (WU)",
+ "Transaction fees": "์์๋ฃ",
+ "%s (%s sat/vB)": "%0 (%1 ์ฌํ ์/vB)",
+ "Version": "๋ฒ์ ",
+ "Lock time": "์ ๊ธ ์๊ฐ",
+ "Included in Block": "ํฌํจ๋์ด ์๋ ๋ธ๋ก",
+ "Address": "์ฃผ์",
+ "Transaction count": "๊ฑฐ๋๋",
+ "Total received": "ํฉ๊ณ",
+ "Confirmed balance": "์ปจํ๋ ํฉ๊ณ",
+ "Unconfirmed balance": "์ปจํ๋์ง ์์ ํฉ๊ณ",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "์ฃ์กํฉ๋๋ค. ๋ง์ ์์ ๊ฑฐ๋๊ฐ์๋ ์ฃผ์๋ ํ์ฌ ์ง์ํ์ง ์์ต๋๋ค.",
+ "We encountered an error. Please try again later.": "์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋์ค์ ๋ค์ ์๋ํ์ญ์์์ค.",
+ "scriptPubKey.asm": "scriptPubkey.asm",
+ "Type": "์ ํ",
+ "OP_RETURN data": "OP_RETURN ๋ฐ์ดํฐ",
+ "Witness": "์๋ช
",
+ "Search for block height, hash, transaction, or address": "๋ธ๋ก ๋์ด, ํด์, ์ฃผ์, ๋๋ ๊ฑฐ๋๋ก ๊ฒ์ํด ๋ณด์ธ์",
+ "Block #%s: %s": "๋ธ๋ก #%0: %1",
+ "Transaction: %s": "๊ฑฐ๋: %0",
+ "Address: %s": "์ฃผ์: %0",
+ "Spent by": "์ฌ์ฉํ ์ ์ ",
+ "Unspent": "์ฌ์ฉ์๋จ",
+ "Peg-out": "ํ๊ทธ ์์",
+ "Peg-out to": "ํ๊ทธ ์์ํ ๊ณณ",
+ "Peg-out ASM": "ํ๊ทธ ์์ ASM",
+ "Peg-out address": "ํ๊ทธ ์์ ์ฃผ์",
+ "Output in parent chain": "๋ถ๋ชจ ์ฒด์ธ ์์ํ",
+ "Coinbase": "์ฝ์ธ๋ฒ ์ด์ค"
+}
diff --git a/lang/me.json b/lang/me.json
new file mode 100644
index 00000000..c99c95cf
--- /dev/null
+++ b/lang/me.json
@@ -0,0 +1,53 @@
+{
+ "lang_name": "ะฆัะฝะพะณะพััะบะธ",
+ "%s Confirmations": [
+ "",
+ "1 Potvrda",
+ "%0 Potvrda"
+ ],
+ "Unconfirmed": "Nema Potvrda",
+ "In best chain (%s confirmations)": [
+ "",
+ "U najnoljem lancu (1 conferma)",
+ "U najnoljem lancu (%0 conferme)"
+ ],
+ "Page Not Found": "Strana nije pronadjena",
+ "Loading...": "Ucitavanje...",
+ "Recent Blocks": "Novi blokovi",
+ "Transactions": "Transakcije",
+ "Load more": "Ucitaj jos",
+ "No results found": "Nema rezultata",
+ "Block %s": "blok %0",
+ "Previous": "Prethodni",
+ "Status": "Status",
+ "%s Transactions": "%0 Transakcija",
+ "Next": "Sledece",
+ "%s of %s Transactions": "%0 od %1 Transakicja",
+ "Details": "Detalji",
+ "Transaction": "Transakcija",
+ "Included in Block": "Ukljuceno u blok",
+ "Address": "Adresa",
+ "Transaction count": "Broj transakcija",
+ "Total received": "Ukupno primljeno",
+ "Confirmed balance": "Potvrdjen balans",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Izvinjenje! Adrese sa velikim brojem transakcija nisu trenutno podrzane",
+ "Orphan": "Orfan",
+ "Search for block height, hash, transaction, or address": "Pretraga po visini bloka, hash, transakciji ili adresi",
+ "Block #%s: %s": "Blok #%0: %1",
+ "Transaction: %s": "Transakcija: %0",
+ "Address: %s": "Adresa: %0",
+ "Size (bytes)": "Velicina (bytes)",
+ "Size (KB)": "Velicina (KB)",
+ "Height": "Visina",
+ "Virtual Size (KVB)": "Virtualna velicina (KVB)",
+ "Weight units (KWU)": "Virtuelna jedinica (KWU)",
+ "Virtual size (vbytes)": "Virtualna Velicina (vbytes)",
+ "Weight units (WU)": "Jedinica Tezine (WU)",
+ "Version": "Verzija",
+ "Type": "Tip",
+ "Confidential": "Poverljivo",
+ "Timestamp": "Vreme",
+ "Weight (KWU)": "Tezina (KWU)",
+ "Spent by": "Potroseni od strane",
+ "Unspent": "Nepotroseni"
+}
diff --git a/lang/nl.json b/lang/nl.json
new file mode 100644
index 00000000..cee149a0
--- /dev/null
+++ b/lang/nl.json
@@ -0,0 +1,50 @@
+{
+ "lang_name": "Nederlands",
+ "%s Confirmations": [
+ "",
+ "1 Bevestiging",
+ "%0 Bevestigd"
+ ],
+ "Unconfirmed": "Niet Bevestigd",
+ "In best chain (%s confirmations)": [
+ "",
+ "In de beste keten (1 bevestigd)",
+ "In de beste keten (%0 bevestigd)"
+ ],
+ "Page Not Found": "Pagina Niet Gevonden",
+ "Loading...": "Bezig met laden...",
+ "Recent Blocks": "Recente Blokken",
+ "Transactions": "Transacties",
+ "Load more": "Meer laden",
+ "No results found": "Geen Resultaten Gevonden",
+ "Block %s": "Blokken %0",
+ "Previous": "Vorige",
+ "Status": "Status",
+ "%s Transactions": "%0 Transacties",
+ "Next": "Volgende",
+ "%s of %s Transactions": "%0 van %1 Transacties",
+ "Details": "Details",
+ "Transaction": "Transacties",
+ "Included in Block": "Bevind zich in Blok",
+ "Address": "Adres",
+ "Transaction count": "Aantal Transacties",
+ "Total received": "Totaal Ontvangen",
+ "Confirmed balance": "Totaal Bevestigd",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Sorry! Adressen met veel transacties worden momenteel niet ondersteund",
+ "Orphan": "Orphan",
+ "Search for block height, hash, transaction, or address": "Zoek naar blokhoogte, hash, transactie of adres",
+ "Block #%s: %s": "Blok #%0: %1",
+ "Transaction: %s": "Transactie: %0",
+ "Address: %s": "Adres: %0",
+ "Size (bytes)": "Grootte (bytes)",
+ "Size (KB)": "Grootte (KB)",
+ "Height": "Hoogte",
+ "Virtual Size (KVB)": "Virtuele Grootte (KVB)",
+ "Weight units (KWU)": "Eenheid van Gewicht (KWU)",
+ "Virtual size (vbytes)": "Virtuele Grootte (vbytes)",
+ "Weight units (WU)": "Eenheid van Gewicht (WU)",
+ "Version": "Versie",
+ "Transaction fees": "Kosten",
+ "Type": "Type",
+ "Confidential": "Vertrouwelijk"
+}
diff --git a/lang/po2json.js b/lang/po2json.js
new file mode 100644
index 00000000..498ffc19
--- /dev/null
+++ b/lang/po2json.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env
+require('pofile').load('/dev/stdin', (err, po) => {
+ if (err) throw err
+
+ const tran = po.items.filter(item => item.msgstr[0] != '' || item.msgstr.length > 1)
+ .reduce((T, { msgid, msgid_plural, msgstr }) =>
+ ({ ...T, [msgid]: msgid_plural ? [ null, ...msgstr ] : msgstr[0] }), {})
+
+ console.log(JSON.stringify(tran, null, 2))
+})
diff --git a/lang/pt-pt.json b/lang/pt-pt.json
new file mode 100644
index 00000000..689bc2eb
--- /dev/null
+++ b/lang/pt-pt.json
@@ -0,0 +1,54 @@
+{
+ "lang_name": "Portuguรชs",
+ "%s Confirmations": [
+ "",
+ "1 Confirmaรงรฃo",
+ "%0 Confirmaรงรตes"
+ ],
+ "Unconfirmed": "Nรฃo confirmada",
+ "In best chain (%s confirmations)": [
+ "",
+ "Na melhor cadeia (1 Confirmaรงรฃo)",
+ "Na melhor cadeia (%0 confirmaรงรตes)"
+ ],
+ "Page Not Found": "Pรกgina Nรฃo Encontrada",
+ "Loading...": "Carregando...",
+ "Recent Blocks": "Blocos Recentes",
+ "Transactions": "Transaรงรตes",
+ "Load more": "Mais",
+ "No results found": "Nenhum resultado encontrado",
+ "Block %s": "Bloco %0",
+ "Previous": "Anterior",
+ "Status": "Status",
+ "%s Transactions": "%0 Transaรงรตes",
+ "Next": "Prรณximo",
+ "%s of %s Transactions": "%0 de %1 Confirmaรงรตes",
+ "Details": "Detalhes",
+ "Transaction": "Transaรงรฃo",
+ "Included in Block": "Incluรญda no Bloco",
+ "Address": "Endereรงo",
+ "Transaction count": "Nรบmero de Transaรงรตes",
+ "Total received": "Total recebido",
+ "Confirmed balance": "Saldo confirmado",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Lamentamos! Endereรงos com um nรบmero elevado de transaรงรตes nรฃo sรฃo suportados",
+ "Orphan": "รrfรฃo",
+ "Search for block height, hash, transaction, or address": "Pesquise por altura do bloco, hash, transaรงรฃo ou endereรงo",
+ "Block #%s: %s": "Bloco #%0: %1",
+ "Transaction: %s": "Transaรงรฃo: %0",
+ "Address: %s": "Endereรงo: %0",
+ "Size (bytes)": "Tamanho (bytes)",
+ "Size (KB)": "Tamanho (KB)",
+ "Height": "Altura",
+ "Virtual Size (KVB)": "Tamanho Virtual (KVB)",
+ "Weight units (KWU)": "Unidades de peso (KWU)",
+ "Virtual size (vbytes)": "Tamanho Virtual (vbytes)",
+ "Weight units (WU)": "Unidades de peso (WU)",
+ "Version": "Versรฃo",
+ "Transaction fees": "Taxas de transaรงรฃo",
+ "Type": "Tipo",
+ "Confidential": "Confidencial",
+ "Timestamp": "Registo de data/hora",
+ "Weight (KWU)": "Peso (KWU)",
+ "Spent by": "Gasto por",
+ "Unspent": "Nรฃo gasto"
+}
diff --git a/lang/ru.json b/lang/ru.json
new file mode 100644
index 00000000..013e0c87
--- /dev/null
+++ b/lang/ru.json
@@ -0,0 +1,49 @@
+{
+ "lang_name": "ะ ัััะบะธะน",
+ "Page Not Found": "ะกััะฐะฝะธัะฐ ะะต ะะฐะนะดะตะฝะฐ",
+ "Loading...": "ะะดัั ะะฐะณััะทะบะฐ...",
+ "Recent Blocks": "ะะพัะปะตะดะฝะธะต ะะปะพะบะธ",
+ "Height": "ะััะพัะฐ",
+ "Timestamp": "ะจัะฐะผะฟ ะัะตะผะตะฝะธ",
+ "Transactions": "ะขัะฐะฝะทะฐะบัะธะธ",
+ "Size (KB)": "ะะฑัะตะผ (ะะฑะฐะนั)",
+ "Weight (KWU)": "ะะตั (kWU)",
+ "Load more": "ะกะผะพััะตัั ะฑะพะปััะต",
+ "No results found": "ะ ะตะทัะปััะฐัั ะะต ะะฐะนะดะตะฝั",
+ "Block %s": "ะัะพัะตะฝั (%0) ะะปะพะบะฐ",
+ "Previous": "ะัะตะดัะดััะธะน",
+ "Status": "ะกัะฐััั",
+ "Virtual Size (KVB)": "ะะธัััะฐะปัะฝัะน ะะฑัะตะผ (kVB)",
+ "Weight units (KWU)": "ะะดะธะฝะธัั ะะตัะฐ (kWU)",
+ "%s Transactions": "ะัะพัะตะฝั (%0) ะขัะฐะฝะทะฐะบัะธะน",
+ "Next": "ะกะปะตะดัััะธะน",
+ "In best chain (%s confirmations)": "ะ ะปัััะตะน ัะตะฟะธ (ะฟัะพัะตะฝั ะฟะพัะฒะตัะถะดะตะฝะธะน)",
+ "%s of %s Transactions": "ะัะพัะตะฝั ะพั ะฟัะพัะตะฝัะฐ ะขัะฐะฝะทะฐะบัะธะน",
+ "Details": "ะะพะดัะพะฑะฝัะต ะดะตัะฐะปะธ",
+ "Nonstandard": "ะะตััะฐะฝะดะฐััะฝัะน",
+ "Transaction": "ะขัะฐะฝะทะฐะบัะธั",
+ "Size (bytes)": "ะะฑัะตะผ (ะฑะฐะนั)",
+ "Virtual size (vbytes)": "ะะธัััะฐะปะฝัะน ะพะฑัะตะผ (ะฒะะฐะนั)",
+ "Weight units (WU)": "ะะดะธะฝะธัั ะฒะตัะฐ (WU)",
+ "Transaction fees": "ะะพะผะธััะธั ะทะฐ ััะฐะฝะทะฐะบัะธั",
+ "Version": "ะะตััะธั",
+ "Lock time": "ะัะตะผั ะฑะปะพะบะธัะพะฒะบะธ",
+ "Included in Block": "ะะบะปััะตะฝะฝัะน ะฒ ะะปะพะบะต",
+ "Address": "ะะดัะตั",
+ "Transaction count": "ะะพะปะธัะตััะฒะพ ััะฐะฝะทะฐะบัะธะน",
+ "Total received": "ะัะตะณะพ ะฟะพะปััะตะฝะพ",
+ "Confirmed balance": "ะะพะดัะฒะตัะถะดะตะฝะฝัะน ะฑะฐะปะฐะฝั",
+ "Unconfirmed balance": "ะะตะฟะพะดัะฒะตัะถะดะตะฝะฝัะน ะฑะฐะปะฐะฝั",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "ะัะธะฝะพัะธะผ ะธะทะฒะตะฝะตะฝะธั, ะฝะพ ะบ ัะพะถะฐะปะตะฝะธั ะฐะดัะตัะฐ ั ะฑะพะปััะธะผ ะบะพะปะธัะตััะฒะพะผ ััะฐะฝะทะฐะบัะธะน ะฒ ะฝะฐััะพััะตะต ะฒัะตะผั ะฝะต ะฟะพะดะดะตัะถะธะฒะฐัััั.",
+ "We encountered an error. Please try again later.": "ะั ััะพะปะบะฝัะปะธัั ั ะพัะธะฑะบะพะน. ะะพะถะฐะปัะนััะฐ, ะฟะพะฟัะพะฑัะนัะต ะฟะพะทะถะต.",
+ "Type": "ะขะธะฟ",
+ "OP_RETURN data": "ะะฐะฝะฝัะต OP_RETURN",
+ "Witness": "ะกะฒะธะดะตัะตะปัััะฒะพ",
+ "Search for block height, hash, transaction, or address": "ะะพะธัะบ ะฒััะพัั ะฑะปะพะบะฐ, ั
ััะพะฒ, ััะฐะฝะทะฐะบัะธะน ะธะปะธ ะฐะดัะตัะพะฒ",
+ "Spent by": "ะะพััะฐัะตะฝะฝัะน",
+ "Unspent": "ะะตะธะทัะฐัั
ะพะดะพะฒะฐะฝะฝัะต",
+ "Peg-out": "ะะฐะบัะตะฟะธัั",
+ "Peg-out to": "ะะฐะบัะตะฟะธัั ะบ",
+ "Peg-out address": "ะะฐะบัะตะฟะธัะตะปัะฝัะน ะฐะดัะตั",
+ "Output in parent chain": "ะัั
ะพะดะฝัะต ะดะฐะฝะฝัะต ะฒ ัะพะดะธัะตะปััะบะพะน ัะตะฟะธ"
+}
diff --git a/lang/sr.json b/lang/sr.json
new file mode 100644
index 00000000..d38733be
--- /dev/null
+++ b/lang/sr.json
@@ -0,0 +1,54 @@
+{
+ "lang_name": "ะกัะฟัะบะธ",
+ "%s Confirmations": [
+ "",
+ "1 Potvrda",
+ "%0 Potvrda"
+ ],
+ "Unconfirmed": "Nema Potvrda",
+ "In best chain (%s confirmations)": [
+ "",
+ "U najnoljem lancu (1 conferma)",
+ "U najnoljem lancu (%0 conferme)"
+ ],
+ "Page Not Found": "Strana nije pronadjena",
+ "Loading...": "Ucitavanje...",
+ "Recent Blocks": "Novi blokovi",
+ "Transactions": "Transakcije",
+ "Load more": "Ucitaj jos",
+ "No results found": "Nema rezultata",
+ "Block %s": "blok %0",
+ "Previous": "Prethodni",
+ "Status": "Status",
+ "%s Transactions": "%0 Transakcija",
+ "Next": "Sledece",
+ "%s of %s Transactions": "%0 od %1 Transakicja",
+ "Details": "Detalji",
+ "Transaction": "Transakcija",
+ "Included in Block": "Ukljuceno u blok",
+ "Address": "Adresa",
+ "Transaction count": "Broj transakcija",
+ "Total received": "Ukupno primljeno",
+ "Confirmed balance": "Potvrdjen balans",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Izvinjenje! Adrese sa velikim brojem transakcija nisu trenutno podrzane",
+ "Orphan": "Orfan",
+ "Search for block height, hash, transaction, or address": "Pretraga po visini bloka, hash, transakciji ili adresi",
+ "Block #%s: %s": "Blok #%0: %1",
+ "Transaction: %s": "Transakcija: %0",
+ "Address: %s": "Adresa: %0",
+ "Size (bytes)": "Velicina (bytes)",
+ "Size (KB)": "Velicina (KB)",
+ "Height": "Visina",
+ "Virtual Size (KVB)": "Virtualna velicina (KVB)",
+ "Weight units (KWU)": "Virtuelna jedinica (KWU)",
+ "Virtual size (vbytes)": "Virtualna Velicina (vbytes)",
+ "Weight units (WU)": "Jedinica Tezine (WU)",
+ "Version": "Verzija",
+ "Transaction fees": "Komosija za kopanje",
+ "Type": "Tip",
+ "Confidential": "Poverljivo",
+ "Timestamp": "Vreme",
+ "Weight (KWU)": "Tezina (KWU)",
+ "Spent by": "Potroseni od strane",
+ "Unspent": "Nepotroseni"
+}
diff --git a/lang/strings.txt b/lang/strings.txt
new file mode 100644
index 00000000..2407ca8e
--- /dev/null
+++ b/lang/strings.txt
@@ -0,0 +1,81 @@
+lang_name
+style.css
+Page Not Found
+Loading...
+Recent Blocks
+Height
+Timestamp
+Transactions
+Size (KB)
+Weight (KWU)
+Load more
+No results found
+Block %s
+Previous
+Status
+Virtual Size (KVB)
+Weight units (KWU)
+%s Transactions
+Next
+In best chain (%s confirmations)
+%s Confirmations
+%s of %s Transactions
+Details
+Nonstandard
+Transaction
+Size (bytes)
+Virtual size (vbytes)
+Weight units (WU)
+Transaction fees
+%s (%s sat/vB)
+Version
+Lock time
+Included in Block
+Address
+Transaction count
+Total received
+Confirmed balance
+Unconfirmed balance
+Sorry! Addresses with a large number of transactions aren't currently supported.
+We encountered an error. Please try again later.
+scriptPubKey.asm
+scriptPubKey.hex
+Type
+OP_RETURN data
+txid:vout
+scriptSig.ASM
+scriptSig.hex
+Witness
+nSequence
+Search for block height, hash, transaction, or address
+Powered by esplora
+Block #%s: %s
+Transaction: %s
+Address: %s
+Spent by
+Unspent
+Peg-out
+Peg-out to
+Peg-out ASM
+Peg-out address
+Output in parent chain
+Coinbase
+Orphan
+Confidential
+Unconfirmed
+Block not found
+Transaction not found
+Spending tx
+Value commitment
+Asset commitment
+Asset ID
+Issuance
+New asset
+Reissuance
+Issuance entropy
+Issuance blinding nonce
+Issuance amount
+Amount commitment
+Reissuance keys
+Reissuance commitment
+No reissuance
diff --git a/lang/sv.json b/lang/sv.json
new file mode 100644
index 00000000..944c3509
--- /dev/null
+++ b/lang/sv.json
@@ -0,0 +1,54 @@
+{
+ "lang_name": "Svenska",
+ "%s Confirmations": [
+ "",
+ "1 bekrรคftelse",
+ "%0 bekrรคftelser"
+ ],
+ "Unconfirmed": "Obekrรคftad",
+ "In best chain (%s confirmations)": [
+ "",
+ "I bรคsta kedjan (1 bekrรคftelse)",
+ "I bรคsta kedjan (%0 bekrรคftelse"
+ ],
+ "Page Not Found": "Sida inte hittad",
+ "Loading...": "Laddar...",
+ "Recent Blocks": "Senaste block",
+ "Transactions": "Transaktioner",
+ "Load more": "Ladda fler",
+ "No results found": "Inga resultat hittade",
+ "Block %s": "Block %0",
+ "Previous": "Fรถregรฅende",
+ "Status": "Status",
+ "%s Transactions": "%0 transaktioner",
+ "Next": "Nรคsta",
+ "%s of %s Transactions": "%0 av %1 transaktioner",
+ "Details": "Detaljer",
+ "Transaction": "Transaktion",
+ "Included in Block": "Inkluderad i block",
+ "Address": "Adress",
+ "Transaction count": "Antal transaktioner",
+ "Total received": "Totalt mottaged",
+ "Confirmed balance": "Bekrรคftad balans",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "Tyvรคrr stรถds fรถr tillfรคllet inte adresser med ett stort antal transaktioner",
+ "Orphan": "Fรถrรคldralรถs",
+ "Search for block height, hash, transaction, or address": "Sรถk efter blockhรถjd, hash, transaktion eller adress",
+ "Block #%s: %s": "Bรถpcl #%0: %1",
+ "Transaction: %s": "Transaktion: %0",
+ "Address: %s": "Adress: %0",
+ "Size (bytes)": "Storlek (bytes)",
+ "Size (KB)": "Storlek (KB)",
+ "Height": "Hรถjd",
+ "Virtual Size (KVB)": "Virtuell storlek (KVB)",
+ "Weight units (KWU)": "Viktenheter (KWU)",
+ "Virtual size (vbytes)": "Virtuell storlek (vbytes)",
+ "Weight units (WU)": "Viktenheter (WU)",
+ "Version": "Version",
+ "Transaction fees": "Miningavgift",
+ "Type": "Typ",
+ "Confidential": "Konfidentiell",
+ "Timestamp": "Tidpunkt",
+ "Weight (KWU)": "Vikt (KWU)",
+ "Spent by": "Spenderat av",
+ "Unspent": "Ospenderad"
+}
diff --git a/lang/zh-cn.json b/lang/zh-cn.json
new file mode 100644
index 00000000..dd13f721
--- /dev/null
+++ b/lang/zh-cn.json
@@ -0,0 +1,48 @@
+{
+ "lang_name": "ไธญๆ(็ฎไฝ)",
+ "%s Confirmations": [
+ "",
+ "็กฎ่ฎคๆฐ 1",
+ "็กฎ่ฎคๆฐ %0"
+ ],
+ "Unconfirmed": "ๆฒก็กฎ่ฎค",
+ "In best chain (%s confirmations)": [
+ "",
+ "ๅจๆๆญฃๅผ็้พ (็กฎ่ฎคๆฐ 1)",
+ "ๅจๆๆญฃๅผ็้พ (็กฎ่ฎคๆฐ %0)"
+ ],
+ "Page Not Found": "็ฝ้กตๆชๆพๅฐ",
+ "Loading...": "้กต้ขๅ ่ฝฝ...",
+ "Recent Blocks": "ๆ่ฟๅบๅ",
+ "Transactions": "ไบคๆ",
+ "Load more": "ๆดๅค",
+ "No results found": "ๆชๆพๅฐ็ปๆ",
+ "Block %s": "ๅ %0",
+ "Previous": "ๅไธไธชๅ",
+ "Status": "็ถๆ",
+ "%s Transactions": "ไบคๆๆฐ้ %0",
+ "Next": "ๅไธไธชๅ",
+ "%s of %s Transactions": "ไบคๆ %0 / %1",
+ "Details": "็ป่",
+ "Transaction": "ไบคๆ",
+ "Included in Block": "ๅจๅบๅ",
+ "Address": "ๅฐๅ",
+ "Transaction count": "ไบคๆๆฐ้",
+ "Total received": "ๆปๆฅๆถ",
+ "Confirmed balance": "ไฝ้ข",
+ "Sorry! Addresses with a large number of transactions aren't currently supported.": "ๅฏนไธ่ตท๏ผๆไปฌๆๆถไธ่ฝๆพ็คบไบคๆๆฐ้ๅคชๅค็ๅฐๅใ",
+ "Orphan": "ๅญคๅ",
+ "Search for block height, hash, transaction, or address": "้ซๅบฆใๅๅธใไบคๆๆๅฐๅ...",
+ "Block #%s: %s": "ๅบๅ #%0: %1",
+ "Transaction: %s": "ไบคๆ: %0",
+ "Address: %s": "ๅฐๅ: %0",
+ "Size (bytes)": "ๅคงๅฐ (bytes)",
+ "Size (KB)": "ๅคงๅฐ (KB)",
+ "Height": "ๅ้ซๅบฆ",
+ "Version": "็ๆฌ",
+ "Transaction fees": "็ฟๅทฅๆ็ปญ่ดน",
+ "Type": "็ฑปๅ",
+ "Confidential": "ไฟๅฏ",
+ "Timestamp": "ๆถ้ดๆณ",
+ "Weight (KWU)": "้้ (KWU)"
+}
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
new file mode 100644
index 00000000..9d55f06b
--- /dev/null
+++ b/npm-shrinkwrap.json
@@ -0,0 +1,5697 @@
+{
+ "name": "esplora",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/babel-types": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz",
+ "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw=="
+ },
+ "@types/babylon": {
+ "version": "6.16.3",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.3.tgz",
+ "integrity": "sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug==",
+ "requires": {
+ "@types/babel-types": "7.0.4"
+ }
+ },
+ "JSONStream": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz",
+ "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==",
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.20",
+ "negotiator": "0.6.1"
+ }
+ },
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
+ },
+ "acorn-dynamic-import": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
+ "requires": {
+ "acorn": "5.7.3"
+ }
+ },
+ "acorn-globals": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
+ "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
+ "requires": {
+ "acorn": "4.0.13"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+ }
+ }
+ },
+ "acorn-node": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz",
+ "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==",
+ "requires": {
+ "acorn": "5.7.3",
+ "acorn-dynamic-import": "3.0.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "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=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "asn1.js": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "requires": {
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ },
+ "babel-cli": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
+ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-polyfill": "6.26.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "chokidar": "1.7.0",
+ "commander": "2.13.0",
+ "convert-source-map": "1.6.0",
+ "fs-readdir-recursive": "1.1.0",
+ "glob": "7.1.3",
+ "lodash": "4.17.11",
+ "output-file-sync": "1.1.2",
+ "path-is-absolute": "1.0.1",
+ "slash": "1.0.0",
+ "source-map": "0.5.7",
+ "v8flags": "2.1.1"
+ }
+ },
+ "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=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.6.0",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.11",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.11",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-explode-assignable-expression": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.11"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.11"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU="
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4="
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+ },
+ "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="
+ },
+ "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=",
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.11"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "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.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "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=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.7",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "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.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "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.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "browserslist": "3.2.8",
+ "invariant": "2.2.4",
+ "semver": "5.5.1"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.7",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.11",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "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=",
+ "requires": {
+ "core-js": "2.5.7",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.11"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "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.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.11"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.11",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
+ },
+ "basic-auth": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
+ "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg=="
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.16"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.1"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "color-convert": "1.9.3"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.3"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "combine-source-map": "0.8.0",
+ "defined": "1.0.0",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3",
+ "umd": "3.0.3"
+ }
+ },
+ "browser-resolve": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+ "requires": {
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+ }
+ }
+ },
+ "browser-split": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/browser-split/-/browser-split-0.0.1.tgz",
+ "integrity": "sha1-ewl1dPjj6tYG+0Zk5krf3aKYGpM="
+ },
+ "browser-unpack": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-unpack/-/browser-unpack-1.3.0.tgz",
+ "integrity": "sha512-hK81IeAN/PcqzSKTqKWe3jzmB41PV/23N1w1w2N/KBPv+sjp31sMlen9arVIENzrH8IzaCWA2Fx6SV0kJyhAFQ==",
+ "requires": {
+ "acorn": "5.7.3",
+ "concat-stream": "1.6.2",
+ "minimist": "1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "browserify": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz",
+ "integrity": "sha512-fMES05wq1Oukts6ksGUU2TMVHHp06LyQt0SIwbXIHm7waSrQmNBZePsU0iM/4f94zbvb/wHma+D1YrdzWYnF/A==",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "assert": "1.4.1",
+ "browser-pack": "6.1.0",
+ "browser-resolve": "1.11.3",
+ "browserify-zlib": "0.2.0",
+ "buffer": "5.2.1",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.6.2",
+ "console-browserify": "1.1.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "defined": "1.0.0",
+ "deps-sort": "2.0.0",
+ "domain-browser": "1.2.0",
+ "duplexer2": "0.1.4",
+ "events": "2.1.0",
+ "glob": "7.1.3",
+ "has": "1.0.3",
+ "htmlescape": "1.1.1",
+ "https-browserify": "1.0.0",
+ "inherits": "2.0.3",
+ "insert-module-globals": "7.2.0",
+ "labeled-stream-splicer": "2.0.1",
+ "mkdirp": "0.5.1",
+ "module-deps": "6.1.0",
+ "os-browserify": "0.3.0",
+ "parents": "1.0.1",
+ "path-browserify": "0.0.1",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "read-only-stream": "2.0.0",
+ "readable-stream": "2.3.6",
+ "resolve": "1.8.1",
+ "shasum": "1.0.2",
+ "shell-quote": "1.6.1",
+ "stream-browserify": "2.0.1",
+ "stream-http": "2.8.3",
+ "string_decoder": "1.1.1",
+ "subarg": "1.0.0",
+ "syntax-error": "1.4.0",
+ "through2": "2.0.3",
+ "timers-browserify": "1.4.2",
+ "tty-browserify": "0.0.1",
+ "url": "0.11.0",
+ "util": "0.10.4",
+ "vm-browserify": "1.1.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "requires": {
+ "buffer-xor": "1.0.3",
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "browserify-aes": "1.2.0",
+ "browserify-des": "1.0.2",
+ "evp_bytestokey": "1.0.3"
+ }
+ },
+ "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==",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "des.js": "1.0.0",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "browserify-middleware": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/browserify-middleware/-/browserify-middleware-8.1.1.tgz",
+ "integrity": "sha512-bHGQGZfncV92HmgIxr0PzY1fAIv4rBJx5rChG7veGl4aCLWu8lbRsLPYcKMbaI6jyimyqZv+RwuOZPDxvreNNw==",
+ "dev": true,
+ "requires": {
+ "browserify": "16.2.2",
+ "ms": "2.1.1",
+ "prepare-response": "2.1.1",
+ "promise": "7.3.1",
+ "uglify-es": "3.3.9",
+ "watchify": "3.11.0"
+ },
+ "dependencies": {
+ "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
+ },
+ "uglify-es": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+ "dev": true,
+ "requires": {
+ "commander": "2.13.0",
+ "source-map": "0.6.1"
+ }
+ }
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "randombytes": "2.0.6"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "elliptic": "6.4.1",
+ "inherits": "2.0.3",
+ "parse-asn1": "5.1.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "pako": "1.0.6"
+ }
+ },
+ "browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "requires": {
+ "caniuse-lite": "1.0.30000886",
+ "electron-to-chromium": "1.3.70"
+ }
+ },
+ "buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+ "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+ "requires": {
+ "base64-js": "1.3.0",
+ "ieee754": "1.1.12"
+ }
+ },
+ "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=="
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "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="
+ },
+ "bundle-collapser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bundle-collapser/-/bundle-collapser-1.3.0.tgz",
+ "integrity": "sha1-9LT/WLLyLudwGyD6djBuI/U6P7Y=",
+ "requires": {
+ "browser-pack": "5.0.1",
+ "browser-unpack": "1.3.0",
+ "concat-stream": "1.6.2",
+ "falafel": "2.1.0",
+ "minimist": "1.2.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "browser-pack": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz",
+ "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "combine-source-map": "0.6.1",
+ "defined": "1.0.0",
+ "through2": "1.1.1",
+ "umd": "3.0.3"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz",
+ "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=",
+ "requires": {
+ "readable-stream": "1.1.14",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "combine-source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz",
+ "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=",
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "inline-source-map": "0.5.0",
+ "lodash.memoize": "3.0.4",
+ "source-map": "0.4.4"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
+ },
+ "inline-source-map": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz",
+ "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=",
+ "requires": {
+ "source-map": "0.4.4"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "cached-path-relative": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
+ "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc="
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000886",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000886.tgz",
+ "integrity": "sha512-xpYuY7rqc5+4q1n/l1BfSgIndaNqvXWKZ0Vk0ZXzVncCAkn0+huvIIPwcSL5YRJoW4MSRsgyNbjnKuh45GmknA=="
+ },
+ "capture-stack-trace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "character-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
+ "requires": {
+ "is-regex": "1.0.4"
+ }
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.2.4",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.2.1"
+ }
+ },
+ "ci-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+ "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="
+ },
+ "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==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "inline-source-map": "0.6.2",
+ "lodash.memoize": "3.0.4",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
+ }
+ }
+ },
+ "commander": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA=="
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.3.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "requires": {
+ "date-now": "0.1.4"
+ }
+ },
+ "constantinople": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
+ "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
+ "requires": {
+ "@types/babel-types": "7.0.4",
+ "@types/babylon": "6.16.3",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "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
+ },
+ "convert-source-map": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-js": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+ "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+ },
+ "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="
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "elliptic": "6.4.1"
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "requires": {
+ "capture-stack-trace": "1.0.1"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "md5.js": "1.3.4",
+ "ripemd160": "2.0.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.3",
+ "shebang-command": "1.2.0",
+ "which": "1.3.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "browserify-cipher": "1.0.1",
+ "browserify-sign": "4.0.4",
+ "create-ecdh": "4.0.3",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "diffie-hellman": "5.0.3",
+ "inherits": "2.0.3",
+ "pbkdf2": "3.0.16",
+ "public-encrypt": "4.0.2",
+ "randombytes": "2.0.6",
+ "randomfill": "1.0.4"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
+ },
+ "cssjanus": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-1.3.1.tgz",
+ "integrity": "sha512-VSdSFi8jQVyOH83pfNK9lOkJEyV/1P9hMHKsw9AULI7YZosow/FmAJB9EM8Y1SS75dRtBRMhr5ZTEgC36EKU5w=="
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "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="
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deps-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
+ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "shasum": "1.0.2",
+ "subarg": "1.0.0",
+ "through2": "2.0.3"
+ }
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detective": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
+ "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
+ "requires": {
+ "acorn-node": "1.5.2",
+ "defined": "1.0.0",
+ "minimist": "1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "miller-rabin": "4.0.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
+ },
+ "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=="
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.70.tgz",
+ "integrity": "sha512-WYMjqCnPVS5JA+XvwEnpwucJpVi2+q9cdCFpbhxgWGsCtforFBEkuP9+nCyy/wnU/0SyLcLRIeZct9ayMGcXoQ=="
+ },
+ "elliptic": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.5",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "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="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "events": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
+ "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg=="
+ },
+ "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==",
+ "requires": {
+ "md5.js": "1.3.4",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "requires": {
+ "fill-range": "2.2.4"
+ }
+ },
+ "express": {
+ "version": "4.16.3",
+ "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz",
+ "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "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.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.4",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0",
+ "type-is": "1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "falafel": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
+ "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+ "requires": {
+ "acorn": "5.7.3",
+ "foreach": "2.0.5",
+ "isarray": "0.0.1",
+ "object-keys": "1.0.12"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ }
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.1.0",
+ "repeat-element": "1.1.3",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.4.0",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.2"
+ }
+ },
+ "fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+ "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+ "optional": true,
+ "requires": {
+ "nan": "2.11.0",
+ "node-pre-gyp": "0.10.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "bundled": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.10.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.7",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.7",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "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.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "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=",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
+ "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "requires": {
+ "hash.js": "1.1.5",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0"
+ }
+ },
+ "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="
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "insert-module-globals": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
+ "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "acorn-node": "1.5.2",
+ "combine-source-map": "0.8.0",
+ "concat-stream": "1.6.2",
+ "is-buffer": "1.1.6",
+ "path-is-absolute": "1.0.1",
+ "process": "0.11.10",
+ "through2": "2.0.3",
+ "undeclared-identifiers": "1.1.2",
+ "xtend": "4.0.1"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.4.0"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+ "dev": true
+ },
+ "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=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "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=",
+ "requires": {
+ "binary-extensions": "1.12.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-ci": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+ "requires": {
+ "ci-info": "1.6.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "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=="
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-expression": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
+ "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
+ "requires": {
+ "acorn": "4.0.13",
+ "object-assign": "4.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "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="
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "requires": {
+ "has": "1.0.3"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "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=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+ },
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+ },
+ "jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
+ "requires": {
+ "is-promise": "2.1.0",
+ "promise": "7.3.1"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "labeled-stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
+ "requires": {
+ "inherits": "2.0.3",
+ "isarray": "2.0.4",
+ "stream-splicer": "2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA=="
+ }
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ },
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
+ },
+ "lodash.escape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
+ "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg="
+ },
+ "lodash.forown": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz",
+ "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68="
+ },
+ "lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY="
+ },
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
+ },
+ "lodash.remove": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.remove/-/lodash.remove-4.7.0.tgz",
+ "integrity": "sha1-8x0x58OaBpDVB07A02JxYjNO5iY="
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+ },
+ "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==",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
+ },
+ "md5.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ }
+ },
+ "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
+ },
+ "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
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0"
+ }
+ },
+ "mime": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.36.0"
+ }
+ },
+ "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=="
+ },
+ "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="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "module-deps": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz",
+ "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==",
+ "requires": {
+ "JSONStream": "1.3.4",
+ "browser-resolve": "1.11.3",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.6.2",
+ "defined": "1.0.0",
+ "detective": "5.1.0",
+ "duplexer2": "0.1.4",
+ "inherits": "2.0.3",
+ "parents": "1.0.1",
+ "readable-stream": "2.3.6",
+ "resolve": "1.8.1",
+ "stream-combiner2": "1.1.1",
+ "subarg": "1.0.0",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "morgan": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
+ "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
+ "dev": true,
+ "requires": {
+ "basic-auth": "2.0.0",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "on-finished": "2.3.0",
+ "on-headers": "1.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "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
+ },
+ "nan": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz",
+ "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==",
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "requires": {
+ "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.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "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="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "outpipe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
+ "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=",
+ "dev": true,
+ "requires": {
+ "shell-quote": "1.6.1"
+ }
+ },
+ "output-file-sync": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
+ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.1"
+ }
+ },
+ "pako": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
+ },
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "requires": {
+ "path-platform": "0.11.15"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.1",
+ "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+ "requires": {
+ "asn1.js": "4.10.1",
+ "browserify-aes": "1.2.0",
+ "create-hash": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "pbkdf2": "3.0.16"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-sel": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-sel/-/parse-sel-1.0.0.tgz",
+ "integrity": "sha1-uTANK7lGoGwiyY4gjkeyCIaQy90=",
+ "requires": {
+ "browser-split": "0.0.1"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "patch-package": {
+ "version": "5.1.1",
+ "resolved": "http://registry.npmjs.org/patch-package/-/patch-package-5.1.1.tgz",
+ "integrity": "sha512-bO+vfFGgTVTtv89kXWGEMIPnrYhhhMtbOnJKStfIhNWUxperVjlI++1ixksi0YPCMPGuFy9W3zsKHxIITV2r2A==",
+ "requires": {
+ "chalk": "1.1.3",
+ "cross-spawn": "5.1.0",
+ "fs-extra": "4.0.3",
+ "minimist": "1.2.0",
+ "rimraf": "2.6.2",
+ "slash": "1.0.0",
+ "tmp": "0.0.31",
+ "update-notifier": "2.5.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "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=="
+ },
+ "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="
+ },
+ "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="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "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=="
+ },
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
+ },
+ "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
+ },
+ "pbkdf2": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz",
+ "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==",
+ "requires": {
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ },
+ "pofile": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.0.11.tgz",
+ "integrity": "sha512-Vy9eH1dRD9wHjYt/QqXcTz+RnX/zg53xK+KljFSX30PvdDMb2z+c6uDUeblUGqqJgz3QFsdlA0IJvHziPmWtQg=="
+ },
+ "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="
+ },
+ "prepare-response": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/prepare-response/-/prepare-response-2.1.1.tgz",
+ "integrity": "sha512-WwQJDGRqIOsUqPV13TwEV+7c0u1rBGM5hs2JKSHJsRfaX1Lwqt7w1/FT5euUTP3b04tdhnWHq6JNPM7EWTbVPA==",
+ "dev": true,
+ "requires": {
+ "mime": "2.3.1",
+ "ms": "2.1.1",
+ "promise": "8.0.2"
+ },
+ "dependencies": {
+ "promise": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz",
+ "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ }
+ }
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.8.0"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "public-encrypt": {
+ "version": "4.0.2",
+ "resolved": "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
+ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.2.0",
+ "parse-asn1": "5.1.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "pug": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
+ "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=",
+ "requires": {
+ "pug-code-gen": "2.0.1",
+ "pug-filters": "3.1.0",
+ "pug-lexer": "4.0.0",
+ "pug-linker": "3.0.5",
+ "pug-load": "2.0.11",
+ "pug-parser": "5.0.0",
+ "pug-runtime": "2.0.4",
+ "pug-strip-comments": "1.0.3"
+ }
+ },
+ "pug-attrs": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz",
+ "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=",
+ "requires": {
+ "constantinople": "3.1.2",
+ "js-stringify": "1.0.2",
+ "pug-runtime": "2.0.4"
+ }
+ },
+ "pug-cli": {
+ "version": "1.0.0-alpha6",
+ "resolved": "https://registry.npmjs.org/pug-cli/-/pug-cli-1.0.0-alpha6.tgz",
+ "integrity": "sha1-HKU56krA67ac5KroSu7V1k/+ZQE=",
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.13.0",
+ "mkdirp": "0.5.1",
+ "pug": "2.0.3"
+ }
+ },
+ "pug-code-gen": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz",
+ "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=",
+ "requires": {
+ "constantinople": "3.1.2",
+ "doctypes": "1.1.0",
+ "js-stringify": "1.0.2",
+ "pug-attrs": "2.0.3",
+ "pug-error": "1.3.2",
+ "pug-runtime": "2.0.4",
+ "void-elements": "2.0.1",
+ "with": "5.1.1"
+ }
+ },
+ "pug-error": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
+ "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
+ },
+ "pug-filters": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz",
+ "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=",
+ "requires": {
+ "clean-css": "4.2.1",
+ "constantinople": "3.1.2",
+ "jstransformer": "1.0.0",
+ "pug-error": "1.3.2",
+ "pug-walk": "1.1.7",
+ "resolve": "1.8.1",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ }
+ }
+ }
+ },
+ "pug-lexer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz",
+ "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=",
+ "requires": {
+ "character-parser": "2.2.0",
+ "is-expression": "3.0.0",
+ "pug-error": "1.3.2"
+ }
+ },
+ "pug-linker": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz",
+ "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=",
+ "requires": {
+ "pug-error": "1.3.2",
+ "pug-walk": "1.1.7"
+ }
+ },
+ "pug-load": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz",
+ "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "pug-walk": "1.1.7"
+ }
+ },
+ "pug-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz",
+ "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=",
+ "requires": {
+ "pug-error": "1.3.2",
+ "token-stream": "0.0.1"
+ }
+ },
+ "pug-runtime": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz",
+ "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g="
+ },
+ "pug-strip-comments": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz",
+ "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=",
+ "requires": {
+ "pug-error": "1.3.2"
+ }
+ },
+ "pug-walk": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz",
+ "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM="
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+ },
+ "randomatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
+ "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==",
+ "requires": {
+ "is-number": "4.0.0",
+ "kind-of": "6.0.2",
+ "math-random": "1.0.1"
+ },
+ "dependencies": {
+ "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=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "requires": {
+ "randombytes": "2.0.6",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "requires": {
+ "deep-extend": "0.6.0",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "read-only-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "micromatch": "3.1.10",
+ "readable-stream": "2.3.6"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "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.3",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "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=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "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.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "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.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "regenerate": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "requires": {
+ "regenerate": "1.4.0",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "requires": {
+ "rc": "1.2.8",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "requires": {
+ "rc": "1.2.8"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc="
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ }
+ }
+ },
+ "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="
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+ "requires": {
+ "path-parse": "1.0.6"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.3"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ }
+ },
+ "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=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "semver": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+ "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw=="
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "requires": {
+ "semver": "5.5.1"
+ }
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "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.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.2"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "shasum": {
+ "version": "1.0.2",
+ "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
+ "requires": {
+ "json-stable-stringify": "0.0.1",
+ "sha.js": "2.4.11"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "requires": {
+ "array-filter": "0.0.1",
+ "array-map": "0.0.0",
+ "array-reduce": "0.0.0",
+ "jsonify": "0.0.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "simple-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
+ "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+ },
+ "snabbdom-to-html": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/snabbdom-to-html/-/snabbdom-to-html-5.1.1.tgz",
+ "integrity": "sha512-rz/Q8nh2RiY9echnpQdIQpGsvqPyjfEcFZ636tlggw59WlcsRrWfctYIVlGHZxUzcX025lw69oTCqceGdeXoGg==",
+ "requires": {
+ "lodash.escape": "4.0.1",
+ "lodash.forown": "4.4.0",
+ "lodash.kebabcase": "4.1.1",
+ "lodash.remove": "4.7.0",
+ "lodash.uniq": "4.5.0",
+ "object-assign": "4.1.1",
+ "parse-sel": "1.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.2",
+ "use": "3.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-resolve": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+ "requires": {
+ "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"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "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="
+ },
+ "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==",
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "requires": {
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "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==",
+ "requires": {
+ "builtin-status-codes": "3.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "to-arraybuffer": "1.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "stream-splicer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
+ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "requires": {
+ "minimist": "1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "requires": {
+ "acorn-node": "1.5.2"
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+ "requires": {
+ "process": "0.11.10"
+ }
+ },
+ "tmp": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
+ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+ },
+ "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="
+ },
+ "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=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "token-stream": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
+ "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.20"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "typeface-inconsolata": {
+ "version": "0.0.54",
+ "resolved": "https://registry.npmjs.org/typeface-inconsolata/-/typeface-inconsolata-0.0.54.tgz",
+ "integrity": "sha512-T7hV2VUY4cPkdEHSC7/iKw/mFA3VbQFnxqr9Kl/T7mGK5Me73z+TBCo0uN5KZPER12ud6rqxldnh5JsglgzwFA=="
+ },
+ "uglify-es": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+ "requires": {
+ "commander": "2.13.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "optional": true
+ },
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
+ },
+ "undeclared-identifiers": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz",
+ "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==",
+ "requires": {
+ "acorn-node": "1.5.2",
+ "get-assigned-identifiers": "1.2.0",
+ "simple-concat": "1.0.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.2.1",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "color-convert": "1.9.3"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA="
+ },
+ "util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "vm-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
+ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw=="
+ },
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
+ },
+ "watchify": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.0.tgz",
+ "integrity": "sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA==",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "browserify": "16.2.2",
+ "chokidar": "1.7.0",
+ "defined": "1.0.0",
+ "outpipe": "1.1.1",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+ "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+ },
+ "with": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
+ "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
+ "requires": {
+ "acorn": "3.3.0",
+ "acorn-globals": "3.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+ }
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..24271ed2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "esplora",
+ "version": "0.1.0",
+ "scripts": {
+ "start": "babel-node server.js",
+ "dist": "./build.sh",
+ "dist:bitcoin-mainnet": "./flavors/bitcoin-mainnet.sh",
+ "dist:bitcoin-testnet": "./flavors/bitcoin-testnet.sh",
+ "dist:liquid-mainnet": "./flavors/liquid-mainnet.sh"
+ },
+ "author": "Nadav Ivgi",
+ "license": "MIT",
+ "browserslist": "> 0.5%",
+ "devDependencies": {
+ "browserify-middleware": "^8.1.1",
+ "express": "^4.16.3",
+ "morgan": "^1.9.1"
+ },
+ "dependencies": {
+ "babel-cli": "^6.26.0",
+ "babel-plugin-syntax-object-rest-spread": "^6.13.0",
+ "babel-plugin-transform-object-rest-spread": "^6.26.0",
+ "babel-preset-env": "^1.7.0",
+ "browserify": "^16.2.2",
+ "bundle-collapser": "^1.3.0",
+ "cssjanus": "^1.3.1",
+ "patch-package": "^5.1.1",
+ "pofile": "^1.0.11",
+ "pug": "^2.0.3",
+ "pug-cli": "^1.0.0-alpha6",
+ "snabbdom-to-html": "^5.1.1",
+ "typeface-inconsolata": "0.0.54",
+ "uglify-es": "^3.3.9"
+ }
+}
diff --git a/render-view.js b/render-view.js
new file mode 100644
index 00000000..ef627669
--- /dev/null
+++ b/render-view.js
@@ -0,0 +1,16 @@
+process.env.NO_QR=1
+global.window = {}
+
+const pug = require('pug')
+ , l10n = require('./client/l10n').default
+ , state = JSON.parse(process.argv[2])
+ , view = require('./client/views')[state.view]
+
+state.t = l10n[state.lang || 'en']
+
+require('pug').renderFile('index.pug', {
+ prerender_html: require('snabbdom-to-html')(view(state))
+}, (err, html) => {
+ if (err) throw err
+ console.log(html)
+})
diff --git a/run.sh b/run.sh
new file mode 100755
index 00000000..58823b03
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,105 @@
+#!/bin/bash
+set -eo pipefail
+
+FLAVOR=$1
+MODE=$2
+
+if [ "$FLAVOR" != "bitcoin-mainnet" ] && [ "$FLAVOR" != "bitcoin-testnet" ] && [ "$FLAVOR" != "liquid-mainnet" ]; then
+ echo "Please provide bitcoin-testnet, bitcoin-mainnet or liquid-mainnet as a parameter"
+ echo "For example run.sh bitcoin-mainnet explorer"
+ exit 1
+fi
+
+EXPLORERAUTOSTART="false"
+TORAUTOSTART="true"
+
+if [ "$MODE" == "explorer" ]; then
+ TORAUTOSTART="false"
+ EXPLORERAUTOSTART="true"
+elif [ "$MODE" != "private-bridge" ] && [ "$MODE" != "public-bridge" ]; then
+ echo "Mode can only be private-bridge, public-bridge or explorer"
+ exit 1
+fi
+
+echo "Enabled mode ${MODE}"
+
+DAEMON=$(echo ${FLAVOR} | cut -d'-' -f1)
+NETWORK=$(echo ${FLAVOR} | cut -d'-' -f2)
+RPC_PASS=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c 32) || true
+BTC_DAEMON_RPC_PORT=2002
+
+ELECTRS_NETWORK=${NETWORK}
+
+ISLIQUID="false"
+NGINX_NOSLASH_PATH="unused"
+if [ "${DAEMON}" != "liquid" ]; then
+ if [ "${NETWORK}" == "testnet" ]; then
+ NGINX_PATH="testnet/"
+ NGINX_NOSLASH_PATH="testnet"
+ NGINX_REWRITE='rewrite ^/testnet(/.*)$ $1 break;'
+ fi
+else
+ ELECTRS_NETWORK="liquidv1"
+ PARENT_NETWORK="--parent-network mainnet"
+ NGINX_PATH="liquid/"
+ NGINX_REWRITE='rewrite ^/liquid(/.*)$ $1 break;'
+ NGINX_NOSLASH_PATH="liquid"
+ ISLIQUID="true"
+fi
+
+function preprocess(){
+ in_file=$1
+ out_file=$2
+ cat $in_file | \
+ sed -e "s|{DAEMON}|$DAEMON|g" \
+ -e "s|{BTC_DAEMON_RPC_PORT}|$BTC_DAEMON_RPC_PORT|g" \
+ -e "s|{NETWORK}|$NETWORK|g" \
+ -e "s|{PARENT_NETWORK}|$PARENT_NETWORK|g" \
+ -e "s|{ELECTRS_NETWORK}|$ELECTRS_NETWORK|g" \
+ -e "s|{RPC_PASS}|$RPC_PASS|g" \
+ -e "s|{NGINX_PATH}|$NGINX_PATH|g" \
+ -e "s|{NGINX_REWRITE}|$NGINX_REWRITE|g" \
+ -e "s|{NGINX_NOSLASH_PATH}|$NGINX_NOSLASH_PATH|g" \
+ -e "s|{EXPLORERAUTOSTART}|$EXPLORERAUTOSTART|g" \
+ -e "s|{TORAUTOSTART}|$TORAUTOSTART|g" \
+ -e "s|{ISLIQUID}|$ISLIQUID|g" \
+ >$out_file
+}
+
+preprocess /srv/explorer/supervisord.conf.in /etc/supervisor/conf.d/supervisord.conf
+preprocess /srv/explorer/${DAEMON}-${NETWORK}-${MODE}.conf.in /data/.${DAEMON}.conf
+if [ "${DAEMON}" == "liquid" ]; then
+ preprocess /srv/explorer/bitcoin-mainnet-pruned-for-liquid.conf.in /data/.bitcoin.conf
+fi
+
+if [ -f /data/public_nodes ]; then
+ cat /data/public_nodes >> /data/.${DAEMON}.conf
+fi
+
+TORRCFILE="/srv/explorer/${DAEMON}-${NETWORK}-${MODE}-torrc"
+if [ -f $TORRCFILE ]; then
+ cp $TORRCFILE /etc/tor/torrc
+ if [ -f /data/torrc ]; then
+ # pick for random peers from the list (for private-bridge)
+ shuf -n 4 /data/torrc >> /etc/tor/torrc
+ tail -4 /etc/tor/torrc | awk '{print "connect="$2":10100"}' >> /data/.${DAEMON}.conf
+ fi
+fi
+
+preprocess /srv/explorer/nginx.conf.in /etc/nginx/sites-enabled/default
+preprocess /srv/explorer/cli.sh.in /usr/bin/cli
+if [ "${DAEMON}" == "liquid" ]; then
+ DAEMON=bitcoin
+ preprocess /srv/explorer/cli.sh.in /usr/bin/cli_bitcoin
+ DAEMON=liquid
+fi
+
+chmod +x /usr/bin/cli /usr/bin/cli_bitcoin
+
+if [ ! -d /data/logs ]; then
+ # initial sync: initialize directories
+ mkdir /data/logs /data/${DAEMON} /data/bitcoin_for_liquid
+fi
+
+
+/usr/bin/supervisord
diff --git a/server.js b/server.js
new file mode 100644
index 00000000..0e0a1d39
--- /dev/null
+++ b/server.js
@@ -0,0 +1,27 @@
+import fs from 'fs'
+import pug from 'pug'
+import path from 'path'
+import express from 'express'
+import browserify from 'browserify-middleware'
+import cssjanus from 'cssjanus'
+
+const rpath = p => path.join(__dirname, p)
+
+const app = express()
+
+app.engine('pug', pug.__express)
+
+app.use(require('morgan')('dev'))
+
+app.get('/', (req, res) => res.render(rpath('index.pug')))
+app.get('/app.js', browserify(rpath('client/app.js')))
+app.get('/style-rtl.css', (req, res) =>
+ res.type('css').send(cssjanus.transform(fs.readFileSync(rpath('www/style.css')).toString(), false, true)))
+
+app.use('/', express.static(rpath('www')))
+
+app.use((req, res) => res.render(rpath('index.pug')))
+
+app.listen(process.env.PORT || 5000, function(){
+ console.log(`HTTP server running on ${this.address().address}:${this.address().port}`)
+})
diff --git a/terraform/data.tf b/terraform/data.tf
new file mode 100644
index 00000000..ee3a7903
--- /dev/null
+++ b/terraform/data.tf
@@ -0,0 +1,67 @@
+# Re-using images that are already close to caught up with each chain
+data "google_compute_image" "btc-main" {
+ family = "bitcoin-mainnet"
+ project = "green-address-explorer"
+}
+
+data "google_compute_image" "btc-test" {
+ family = "bitcoin-testnet"
+ project = "green-address-explorer"
+}
+
+data "google_compute_image" "liquid-main" {
+ family = "liquid-mainnet"
+ project = "green-address-explorer"
+}
+
+data "terraform_remote_state" "main" {
+ backend = "gcs"
+
+ config {
+ bucket = "terraform-state-explorer"
+ prefix = "terraform/state"
+ project = "green-address-explorer"
+ }
+
+ workspace = "main"
+
+ defaults {
+ prometheus_service_account = ""
+ }
+}
+
+data "terraform_remote_state" "bitcoin-mainnet" {
+ backend = "gcs"
+
+ config {
+ bucket = "terraform-state-explorer"
+ prefix = "terraform/state"
+ project = "green-address-explorer"
+ }
+
+ workspace = "bitcoin-mainnet"
+}
+
+data "terraform_remote_state" "bitcoin-testnet" {
+ backend = "gcs"
+
+ config {
+ bucket = "terraform-state-explorer"
+ prefix = "terraform/state"
+ project = "green-address-explorer"
+ }
+
+ workspace = "bitcoin-testnet"
+}
+
+data "terraform_remote_state" "liquid-mainnet" {
+ backend = "gcs"
+
+ config {
+ bucket = "terraform-state-explorer"
+ prefix = "terraform/state"
+ project = "green-address-explorer"
+ }
+
+ workspace = "liquid-mainnet"
+}
diff --git a/terraform/main.tf b/terraform/main.tf
new file mode 100644
index 00000000..39a972f0
--- /dev/null
+++ b/terraform/main.tf
@@ -0,0 +1,138 @@
+terraform {
+ required_version = "> 0.11.0"
+
+ backend "gcs" {
+ bucket = "terraform-state-explorer"
+ prefix = "terraform/state"
+ project = "green-address-explorer"
+ }
+}
+
+provider "google" {
+ project = "${var.project}"
+}
+
+module "prometheus" {
+ source = "modules/prometheus"
+
+ name = "explorer"
+ network = "default"
+ zones = ["${var.zones}"]
+ region = "${var.regions[0]}" // necessary for compute_address
+ instances = 1
+ machine_type = "${var.machine_type}"
+ retention = "31d"
+ project = "${var.project}"
+ docker_tag = "${var.docker_tag_prometheus}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ allowed_source_ip = "${var.prometheus_allowed_source_ip}"
+ prometheus_service_account = "${terraform.workspace != "main" ? data.terraform_remote_state.main.prometheus_service_account : ""}"
+ opsgenie_api_key = "${var.opsgenie_api_key}"
+
+ create_resources = "${local.create_main}"
+}
+
+module "bitcoin-testnet" {
+ source = "modules/daemon"
+
+ regions = "${var.regions}"
+ name = "bitcoin-testnet"
+ daemon = "bitcoin"
+ network = "testnet"
+ instance_type = "${var.instance_type[1]}"
+ size = "${var.cluster_size}"
+ image = "${data.google_compute_image.btc-test.self_link}"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_explorer = "${var.docker_tag_explorer}"
+ min_ready_sec = "${var.min_ready_sec}"
+ initial_delay_sec = "${var.initial_delay_sec}"
+
+ create_resources = "${local.create_bitcoin_testnet}"
+}
+
+module "bitcoin-testnet-http" {
+ source = "modules/http-tor"
+
+ regions = ["${element(var.regions, 0)}"]
+ name = "bitcoin-testnet"
+ network = "testnet"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_nginx = "${var.docker_tag_nginx}"
+ ssl_certs = "${var.ssl_certs}"
+
+ create_resources = "${local.create_bitcoin_testnet}"
+}
+
+module "bitcoin-mainnet" {
+ source = "modules/daemon"
+
+ regions = "${var.regions}"
+ name = "bitcoin-mainnet"
+ daemon = "bitcoin"
+ network = "mainnet"
+ instance_type = "${var.instance_type[0]}"
+ size = "${var.cluster_size}"
+ image = "${data.google_compute_image.btc-main.self_link}"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_explorer = "${var.docker_tag_explorer}"
+ min_ready_sec = "${var.min_ready_sec}"
+ initial_delay_sec = "${var.initial_delay_sec}"
+
+ create_resources = "${local.create_bitcoin_mainnet}"
+}
+
+module "bitcoin-mainnet-http" {
+ source = "modules/http-tor"
+
+ regions = ["${var.regions[0]}"]
+ name = "bitcoin-mainnet"
+ network = "mainnet"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_nginx = "${var.docker_tag_nginx}"
+ ssl_certs = "${var.ssl_certs}"
+
+ create_resources = "${local.create_bitcoin_mainnet}"
+}
+
+module "liquid-mainnet" {
+ source = "modules/daemon"
+
+ regions = "${var.regions}"
+ name = "liquid-mainnet"
+ daemon = "liquid"
+ network = "mainnet"
+ instance_type = "${var.instance_type[1]}"
+ size = "${var.cluster_size}"
+ image = "${data.google_compute_image.liquid-main.self_link}"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_explorer = "${var.docker_tag_explorer}"
+ min_ready_sec = "${var.min_ready_sec}"
+ initial_delay_sec = "${var.initial_delay_sec}"
+
+ create_resources = "${local.create_liquid_mainnet}"
+}
+
+module "liquid-mainnet-http" {
+ source = "modules/http-tor"
+
+ regions = ["${var.regions[0]}"]
+ name = "liquid-mainnet"
+ network = "mainnet"
+ project = "${var.project}"
+ service_account_prom = "${terraform.workspace == "main" ? module.prometheus.service_account : data.terraform_remote_state.main.prometheus_service_account}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ docker_tag_nginx = "${var.docker_tag_nginx}"
+ ssl_certs = "${var.ssl_certs}"
+
+ create_resources = "${local.create_liquid_mainnet}"
+}
diff --git a/terraform/modules/daemon/cloud-init/daemon.yml b/terraform/modules/daemon/cloud-init/daemon.yml
new file mode 100644
index 00000000..d6a49bb6
--- /dev/null
+++ b/terraform/modules/daemon/cloud-init/daemon.yml
@@ -0,0 +1,82 @@
+bootcmd:
+ - /sbin/blkid /dev/disk/by-id/google-data || /sbin/mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0,discard -L data /dev/disk/by-id/google-data
+ - mkdir -p /mnt/disks/data
+
+mounts:
+ - [ /dev/disk/by-id/google-data, /mnt/disks/data, auto, "rw,noatime,discard,nobarrier,nodev" ]
+
+users:
+ - name: exec
+ uid: 2000
+
+
+write_files:
+ - path: /etc/systemd/system/explorer.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=explorer
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 4224 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --network=host \
+ --pid=host \
+ --name=${container_name} \
+ --tmpfs /tmp/ \
+ -v /mnt/disks/data:/data:rw \
+ "${docker_tag}" bash -c '/srv/explorer/run.sh ${daemon}-${network} explorer'
+ ExecStop=/usr/bin/docker stop ${container_name}
+ ExecStopPost=/usr/bin/docker rm ${container_name}
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 4224 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+ - path: /etc/systemd/system/node-exporter.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=prometheus node-exporter
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag_node_exporter}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --name=node-exporter \
+ --network=host \
+ --read-only \
+ -v /proc:/host/proc:ro \
+ -v /sys:/host/sys:ro \
+ -v /:/rootfs:ro \
+ -v metrics:/metrics:ro \
+ "${docker_tag_node_exporter}" --path.procfs /host/proc --path.sysfs /host/sys --collector.textfile.directory /metrics --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc($|/))"
+ ExecStop=/usr/bin/docker stop node-exporter
+ ExecStopPost=/usr/bin/docker rm node-exporter
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+
+runcmd:
+ - systemctl daemon-reload
+ - systemctl start explorer.service
+ - systemctl enable explorer.service
+ - systemctl start node-exporter.service
+ - systemctl enable node-exporter.service
diff --git a/terraform/modules/daemon/data.tf b/terraform/modules/daemon/data.tf
new file mode 100644
index 00000000..abc7d215
--- /dev/null
+++ b/terraform/modules/daemon/data.tf
@@ -0,0 +1,30 @@
+data "google_compute_network" "default" {
+ name = "default"
+}
+
+data "template_file" "daemon" {
+ template = "${file("${path.module}/cloud-init/daemon.yml")}"
+
+ vars {
+ docker_tag = "${var.docker_tag_explorer}"
+ daemon = "${var.daemon}"
+ network = "${var.network}"
+ container_name = "${var.name}-explorer"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ }
+}
+
+data "template_cloudinit_config" "daemon" {
+ gzip = false
+ base64_encode = false
+
+ part {
+ content_type = "text/cloud-config"
+ content = "${data.template_file.daemon.rendered}"
+ }
+}
+
+# https://github.com/DeviaVir/terraform-provider-customconfig/blob/master/examples/backend_service_instance_groups.tf
+data "customconfig_google_backend" "customconfig" {
+ instance_groups = ["${google_compute_region_instance_group_manager.daemon.*.instance_group}"]
+}
diff --git a/terraform/modules/daemon/firewall.tf b/terraform/modules/daemon/firewall.tf
new file mode 100644
index 00000000..5f0b27c1
--- /dev/null
+++ b/terraform/modules/daemon/firewall.tf
@@ -0,0 +1,55 @@
+resource "google_compute_firewall" "http-healthcheck" {
+ name = "${var.name}-healthcheck-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["80", "443"]
+ }
+
+ source_ranges = ["130.211.0.0/22", "35.191.0.0/16", "10.0.0.0/8"]
+
+ target_service_accounts = [
+ "${google_service_account.daemon.email}",
+ ]
+}
+
+resource "google_compute_firewall" "all-traffic" {
+ name = "${var.name}-all-traffic-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["443"]
+ }
+
+ source_ranges = ["0.0.0.0/0"]
+
+ target_service_accounts = [
+ "${google_service_account.daemon.email}",
+ ]
+}
+
+resource "google_compute_firewall" "prom-traffic" {
+ name = "daemon-${var.name}-prometheus-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["4224", "9100"]
+ }
+
+ source_service_accounts = [
+ "${var.service_account_prom}",
+ ]
+
+ target_service_accounts = [
+ "${google_service_account.daemon.email}",
+ ]
+}
diff --git a/terraform/modules/daemon/iam.tf b/terraform/modules/daemon/iam.tf
new file mode 100644
index 00000000..aa69a38c
--- /dev/null
+++ b/terraform/modules/daemon/iam.tf
@@ -0,0 +1,14 @@
+resource "google_service_account" "daemon" {
+ account_id = "${var.name}"
+ display_name = "${var.daemon} ${var.network}"
+
+ count = "${var.create_resources}"
+}
+
+resource "google_project_iam_member" "daemon" {
+ project = "${var.project}"
+ role = "roles/editor"
+ member = "serviceAccount:${google_service_account.daemon.email}"
+
+ count = "${var.create_resources}"
+}
diff --git a/terraform/modules/daemon/main.tf b/terraform/modules/daemon/main.tf
new file mode 100644
index 00000000..0754071f
--- /dev/null
+++ b/terraform/modules/daemon/main.tf
@@ -0,0 +1,93 @@
+# Instance health check
+resource "google_compute_health_check" "daemon" {
+ name = "${var.name}-explorer-health-check"
+ timeout_sec = 5
+ check_interval_sec = 10
+ unhealthy_threshold = 3
+
+ count = "${var.create_resources}"
+
+ http_health_check {
+ port = 80
+ request_path = "${var.name == "bitcoin-mainnet" ? "/api/tip/hash" : var.name == "bitcoin-testnet" ? "/testnet/api/tip/hash" : "/liquid/api/tip/hash"}"
+ }
+}
+
+# Create regional instance group
+resource "google_compute_region_instance_group_manager" "daemon" {
+ name = "${var.name}-explorer-ig-${element(var.regions, count.index)}"
+ count = "${var.create_resources > 0 ? length(var.regions) : 0}"
+
+ base_instance_name = "${var.name}-explorer-${element(var.regions, count.index)}-${count.index}"
+ instance_template = "${google_compute_instance_template.daemon.self_link}"
+ region = "${element(var.regions, count.index)}"
+ target_size = "${var.size}"
+
+ update_strategy = "ROLLING_UPDATE"
+
+ rolling_update_policy {
+ type = "PROACTIVE"
+ minimal_action = "REPLACE"
+ max_surge_fixed = 3
+ max_unavailable_fixed = 0
+ min_ready_sec = "${var.min_ready_sec}"
+ }
+
+ auto_healing_policies {
+ health_check = "${google_compute_health_check.daemon.self_link}"
+ initial_delay_sec = "${var.initial_delay_sec}"
+ }
+}
+
+## Create instance template
+resource "google_compute_instance_template" "daemon" {
+ name_prefix = "${var.name}-explorer-template-"
+ description = "This template is used to create ${var.name} instances."
+ machine_type = "${var.instance_type}"
+ count = "${var.create_resources}"
+
+ labels {
+ type = "explorer"
+ name = "${var.name}"
+ network = "${var.network}"
+ }
+
+ scheduling {
+ automatic_restart = true
+ on_host_maintenance = "MIGRATE"
+ }
+
+ disk {
+ source_image = "${var.boot-image}"
+ disk_type = "pd-ssd"
+ auto_delete = true
+ boot = true
+ }
+
+ disk {
+ source_image = "${var.image}"
+ disk_type = "pd-ssd"
+ auto_delete = true
+ device_name = "data"
+ }
+
+ network_interface {
+ network = "${data.google_compute_network.default.self_link}"
+
+ access_config {}
+ }
+
+ metadata {
+ google-logging-enabled = "true"
+ "user-data" = "${data.template_cloudinit_config.daemon.rendered}"
+ }
+
+ service_account {
+ email = "${google_service_account.daemon.email}"
+ scopes = ["compute-ro", "storage-ro"]
+ }
+
+ lifecycle {
+ create_before_destroy = true
+ }
+}
diff --git a/terraform/modules/daemon/network.tf b/terraform/modules/daemon/network.tf
new file mode 100644
index 00000000..867ec12f
--- /dev/null
+++ b/terraform/modules/daemon/network.tf
@@ -0,0 +1,24 @@
+# Health check
+resource "google_compute_http_health_check" "daemon" {
+ name = "${var.name}-explorer-http-health-check"
+ request_path = "${var.name == "bitcoin-mainnet" ? "/api/tip/hash" : var.name == "bitcoin-testnet" ? "/testnet/api/tip/hash" : "/liquid/api/tip/hash"}"
+
+ timeout_sec = 5
+ check_interval_sec = 5
+
+ count = "${var.create_resources}"
+}
+
+# Backend service
+resource "google_compute_backend_service" "daemon" {
+ name = "${var.name}-explorer-backend-service"
+ protocol = "HTTP"
+ port_name = "http"
+ timeout_sec = 30
+ enable_cdn = true
+
+ backend = ["${data.customconfig_google_backend.customconfig.backends}"]
+ health_checks = ["${google_compute_http_health_check.daemon.self_link}"]
+
+ count = "${var.create_resources}"
+}
diff --git a/terraform/modules/daemon/outputs.tf b/terraform/modules/daemon/outputs.tf
new file mode 100644
index 00000000..f719b616
--- /dev/null
+++ b/terraform/modules/daemon/outputs.tf
@@ -0,0 +1,7 @@
+output "backend_service" {
+ value = "${element(concat(google_compute_backend_service.daemon.*.self_link, list("")), 0)}"
+}
+
+output "service_account" {
+ value = "${element(concat(google_service_account.daemon.*.email, list("")), 0)}"
+}
diff --git a/terraform/modules/daemon/variables.tf b/terraform/modules/daemon/variables.tf
new file mode 100644
index 00000000..186771fe
--- /dev/null
+++ b/terraform/modules/daemon/variables.tf
@@ -0,0 +1,64 @@
+variable "create_resources" {
+ type = "string"
+}
+
+variable "project" {
+ type = "string"
+ default = "green-address-explorer"
+}
+
+variable "name" {
+ type = "string"
+}
+
+variable "daemon" {
+ type = "string"
+}
+
+variable "network" {
+ type = "string"
+}
+
+variable "regions" {
+ type = "list"
+}
+
+variable "instance_type" {
+ type = "string"
+ default = ""
+}
+
+variable "image" {
+ type = "string"
+}
+
+variable "size" {
+ type = "string"
+}
+
+variable "boot-image" {
+ type = "string"
+ default = "cos-cloud/cos-stable"
+}
+
+variable "service_account_prom" {
+ type = "string"
+}
+
+variable "docker_tag_node_exporter" {
+ type = "string"
+}
+
+variable "docker_tag_explorer" {
+ type = "string"
+}
+
+variable "min_ready_sec" {
+ type = "string"
+ default = "1800"
+}
+
+variable "initial_delay_sec" {
+ type = "string"
+ default = "1800"
+}
diff --git a/terraform/modules/http-tor/cloud-init/http.yml b/terraform/modules/http-tor/cloud-init/http.yml
new file mode 100644
index 00000000..b7f8e18d
--- /dev/null
+++ b/terraform/modules/http-tor/cloud-init/http.yml
@@ -0,0 +1,120 @@
+users:
+ - name: exec
+ uid: 2000
+
+write_files:
+ - path: /home/exec/nginx.conf
+ permissions: 0644
+ owner: root
+ content: |
+ user root;
+ worker_processes 1;
+
+ error_log /var/log/nginx/error.log;
+
+ events {
+ worker_connections 1024;
+ }
+
+ http {
+ # this nginx server is used just to redirect http to https
+ include mime.types;
+ default_type application/octet-stream;
+
+ log_format combined_host '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$host" "$http_x_real_ip';
+ access_log /var/log/nginx/access.log combined_host;
+
+ sendfile on;
+ keepalive_timeout 65;
+
+ server {
+ listen 80;
+ server_name explorer.greenaddress.it explorer.blockstream.com blockstream.info;
+
+ location /lbtest {
+ return 200;
+ }
+ location / {
+ return 301 https://$host$request_uri;
+ }
+ }
+
+ server {
+ listen 80 default_server;
+ server_name _;
+
+ location /lbtest {
+ return 200;
+ }
+ location / {
+ return 301 https://blockstream.info$request_uri;
+ }
+ }
+ }
+ - path: /etc/systemd/system/nginx.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=Nginx LB instance
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag_nginx}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --network=host \
+ --pid=host \
+ --name=nginx \
+ --tmpfs /tmp/ \
+ -v /home/exec/nginx.conf:/etc/nginx/nginx.conf:ro \
+ "${docker_tag_nginx}"
+ ExecStop=/usr/bin/docker stop nginx
+ ExecStopPost=/usr/bin/docker rm nginx
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+ - path: /etc/systemd/system/node-exporter.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=prometheus node-exporter
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag_node_exporter}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --name=node-exporter \
+ --network=host \
+ --read-only \
+ -v /proc:/host/proc:ro \
+ -v /sys:/host/sys:ro \
+ -v /:/rootfs:ro \
+ -v metrics:/metrics:ro \
+ "${docker_tag_node_exporter}" --path.procfs /host/proc --path.sysfs /host/sys --collector.textfile.directory /metrics --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc($|/))"
+ ExecStop=/usr/bin/docker stop node-exporter
+ ExecStopPost=/usr/bin/docker rm node-exporter
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+
+runcmd:
+ - systemctl daemon-reload
+ - systemctl start nginx.service
+ - systemctl enable nginx.service
+ - systemctl start node-exporter.service
+ - systemctl enable node-exporter.service
diff --git a/terraform/modules/http-tor/data.tf b/terraform/modules/http-tor/data.tf
new file mode 100644
index 00000000..9a5a0752
--- /dev/null
+++ b/terraform/modules/http-tor/data.tf
@@ -0,0 +1,27 @@
+data "google_compute_network" "default" {
+ name = "default"
+}
+
+data "template_file" "http" {
+ template = "${file("${path.module}/cloud-init/http.yml")}"
+
+ vars {
+ docker_tag_nginx = "${var.docker_tag_nginx}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ }
+}
+
+data "template_cloudinit_config" "http" {
+ gzip = false
+ base64_encode = false
+
+ part {
+ content_type = "text/cloud-config"
+ content = "${data.template_file.http.rendered}"
+ }
+}
+
+# https://github.com/DeviaVir/terraform-provider-customconfig/blob/master/examples/backend_service_instance_groups.tf
+data "customconfig_google_backend" "customconfig" {
+ instance_groups = ["${google_compute_region_instance_group_manager.http.*.instance_group}"]
+}
diff --git a/terraform/modules/http-tor/firewall.tf b/terraform/modules/http-tor/firewall.tf
new file mode 100644
index 00000000..24c217b3
--- /dev/null
+++ b/terraform/modules/http-tor/firewall.tf
@@ -0,0 +1,37 @@
+resource "google_compute_firewall" "all-traffic" {
+ name = "http-${var.name}-all-traffic-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["80"]
+ }
+
+ source_ranges = ["0.0.0.0/0"]
+
+ target_service_accounts = [
+ "${google_service_account.http.email}",
+ ]
+}
+
+resource "google_compute_firewall" "prom-traffic" {
+ name = "http-${var.name}-prometheus-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["9100"]
+ }
+
+ source_service_accounts = [
+ "${var.service_account_prom}",
+ ]
+
+ target_service_accounts = [
+ "${google_service_account.http.email}",
+ ]
+}
diff --git a/terraform/modules/http-tor/iam.tf b/terraform/modules/http-tor/iam.tf
new file mode 100644
index 00000000..9e19b52a
--- /dev/null
+++ b/terraform/modules/http-tor/iam.tf
@@ -0,0 +1,14 @@
+resource "google_service_account" "http" {
+ account_id = "http-${var.name}"
+ display_name = "http-${var.name}"
+
+ count = "${var.create_resources}"
+}
+
+resource "google_project_iam_member" "http" {
+ project = "${var.project}"
+ role = "roles/editor"
+ member = "serviceAccount:${google_service_account.http.email}"
+
+ count = "${var.create_resources}"
+}
diff --git a/terraform/modules/http-tor/main.tf b/terraform/modules/http-tor/main.tf
new file mode 100644
index 00000000..71c62606
--- /dev/null
+++ b/terraform/modules/http-tor/main.tf
@@ -0,0 +1,107 @@
+resource "google_compute_region_autoscaler" "http" {
+ name = "http-${var.name}-explorer-ig-${element(var.regions, count.index)}"
+ region = "${element(var.regions, count.index)}"
+ target = "${element(google_compute_region_instance_group_manager.http.*.self_link, count.index)}"
+
+ count = "${var.create_resources > 0 ? length(var.regions) : 0}"
+
+ autoscaling_policy = {
+ max_replicas = "2"
+ min_replicas = "1"
+ cooldown_period = 60
+
+ cpu_utilization {
+ target = 0.7
+ }
+ }
+}
+
+resource "google_compute_region_instance_group_manager" "http" {
+ name = "http-${var.name}-explorer-ig-${element(var.regions, count.index)}"
+ base_instance_name = "http-${var.name}-explorer-ig-${element(var.regions, count.index)}"
+ instance_template = "${google_compute_instance_template.http.self_link}"
+ region = "${element(var.regions, count.index)}"
+
+ named_port {
+ name = "http"
+ port = 80
+ }
+
+ count = "${var.create_resources > 0 ? length(var.regions) : 0}"
+
+ auto_healing_policies {
+ health_check = "${google_compute_health_check.http.self_link}"
+ initial_delay_sec = 300
+ }
+
+ update_strategy = "ROLLING_UPDATE"
+
+ rolling_update_policy {
+ type = "PROACTIVE"
+ minimal_action = "REPLACE"
+ max_surge_fixed = 3
+ max_unavailable_fixed = 0
+ min_ready_sec = 60
+ }
+}
+
+resource "google_compute_instance_template" "http" {
+ name_prefix = "http-${var.name}-explorer-ig-"
+ description = "This template is used to create ${var.name} http redirect instances."
+ tags = ["http", "http-${var.name}"]
+ machine_type = "f1-micro"
+
+ count = "${var.create_resources}"
+
+ labels {
+ type = "http-tor"
+ name = "${var.name}"
+ network = "${var.network}"
+ }
+
+ disk {
+ boot = true
+ source_image = "${var.boot-image}"
+ auto_delete = true
+ boot = true
+ disk_type = "pd-standard"
+ }
+
+ scheduling {
+ automatic_restart = true
+ on_host_maintenance = "MIGRATE"
+ }
+
+ network_interface {
+ network = "${data.google_compute_network.default.self_link}"
+
+ access_config {}
+ }
+
+ metadata {
+ "user-data" = "${data.template_cloudinit_config.http.rendered}"
+ }
+
+ service_account {
+ email = "${google_service_account.http.email}"
+ scopes = ["compute-ro", "storage-ro"]
+ }
+
+ lifecycle {
+ create_before_destroy = true
+ }
+}
+
+resource "google_compute_health_check" "http" {
+ name = "http-${var.name}-explorer-health-check"
+ timeout_sec = 3
+ check_interval_sec = 10
+ unhealthy_threshold = 3
+
+ count = "${var.create_resources}"
+
+ http_health_check {
+ port = 80
+ request_path = "/lbtest"
+ }
+}
diff --git a/terraform/modules/http-tor/network.tf b/terraform/modules/http-tor/network.tf
new file mode 100644
index 00000000..380e521b
--- /dev/null
+++ b/terraform/modules/http-tor/network.tf
@@ -0,0 +1,25 @@
+resource "google_compute_backend_service" "http" {
+ name = "${var.name}-http-to-https-backend"
+ port_name = "http"
+ protocol = "HTTP"
+ timeout_sec = 10
+ enable_cdn = true
+
+ backend = ["${data.customconfig_google_backend.customconfig.backends}"]
+ health_checks = ["${google_compute_http_health_check.http.self_link}"]
+
+ count = "${var.create_resources}"
+}
+
+resource "google_compute_http_health_check" "http" {
+ name = "http-${var.name}-health"
+
+ timeout_sec = 3
+ check_interval_sec = 10
+ unhealthy_threshold = 3
+
+ port = "80"
+ request_path = "/lbtest"
+
+ count = "${var.create_resources}"
+}
diff --git a/terraform/modules/http-tor/outputs.tf b/terraform/modules/http-tor/outputs.tf
new file mode 100644
index 00000000..0948c595
--- /dev/null
+++ b/terraform/modules/http-tor/outputs.tf
@@ -0,0 +1,7 @@
+output "backend_service" {
+ value = "${element(concat(google_compute_backend_service.http.*.self_link, list("")), 0)}"
+}
+
+output "service_account" {
+ value = "${element(concat(google_service_account.http.*.email, list("")), 0)}"
+}
diff --git a/terraform/modules/http-tor/variables.tf b/terraform/modules/http-tor/variables.tf
new file mode 100644
index 00000000..f2e1da58
--- /dev/null
+++ b/terraform/modules/http-tor/variables.tf
@@ -0,0 +1,42 @@
+variable "create_resources" {
+ type = "string"
+}
+
+variable "project" {
+ type = "string"
+ default = "green-address-explorer"
+}
+
+variable "name" {
+ type = "string"
+}
+
+variable "network" {
+ type = "string"
+}
+
+variable "regions" {
+ type = "list"
+ default = []
+}
+
+variable "ssl_certs" {
+ type = "list"
+}
+
+variable "boot-image" {
+ type = "string"
+ default = "cos-cloud/cos-stable"
+}
+
+variable "docker_tag_nginx" {
+ type = "string"
+}
+
+variable "docker_tag_node_exporter" {
+ type = "string"
+}
+
+variable "service_account_prom" {
+ type = "string"
+}
diff --git a/terraform/modules/prometheus/cloud-init/prometheus.yml b/terraform/modules/prometheus/cloud-init/prometheus.yml
new file mode 100644
index 00000000..49e0b20b
--- /dev/null
+++ b/terraform/modules/prometheus/cloud-init/prometheus.yml
@@ -0,0 +1,443 @@
+bootcmd:
+ - blkid /dev/disk/by-id/google-data || mkfs.ext4 -L data -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/google-data
+
+mounts:
+ - [ /dev/disk/by-label/data, /mnt/disks/data, auto, defaults ]
+
+users:
+ - name: exec
+ uid: 2000
+
+write_files:
+ - path: /home/exec/prometheus/alertmanager.yml
+ permissions: 0644
+ owner: root
+ content: |
+ route:
+ group_by: [cluster]
+ # If an alert isn't caught by a route, send it to the pager.
+ receiver: team-pager
+ routes:
+ # Send severity=page alerts to the pager.
+ - match:
+ severity: page
+ receiver: team-pager
+
+ receivers:
+ - name: team-pager
+ opsgenie_configs:
+ - api_key: ${opsgenie_api_key}
+ teams: SecOps # Put in your team here
+ tags: esplora
+
+ - path: /home/exec/prometheus/rules/alerts.yml
+ permissions: 0644
+ owner: root
+ content: |
+ groups:
+ - name: node
+ rules:
+ - alert: NoHostsInNetwork
+ expr: sum by (name) (up{name=~".+"}) == 0
+ for: 1m
+ labels:
+ severity: page
+ annotations:
+ summary: No hosts in network {{ $labels.name }}, production traffic impacted!
+ description: There are currently no hosts up in the network {{ $labels.name }}, verify the instance groups. https://wiki.blockstream.io/OpsPlaybooks/Esplora-Runbooks#NoHostsInNetwork
+ - alert: NoHostsInNetworkBitcoinMainnet
+ expr: absent(up{name="bitcoin-mainnet"})
+ for: 1m
+ labels:
+ severity: page
+ annotations:
+ summary: No hosts in network {{ $labels.name }}, production traffic impacted!
+ description: There are currently no hosts up in the network {{ $labels.name }}, verify the instance group. https://wiki.blockstream.io/OpsPlaybooks/Esplora-Runbooks#NoHostsInNetworkBitcoinMainnet
+ - alert: NoHostsInNetworkBitcoinTestnet
+ expr: absent(up{name="bitcoin-testnet"})
+ for: 1m
+ labels:
+ severity: page
+ annotations:
+ summary: No hosts in network {{ $labels.name }}, production traffic impacted!
+ description: There are currently no hosts up in the network {{ $labels.name }}, verify the instance group. https://wiki.blockstream.io/OpsPlaybooks/Esplora-Runbooks#NoHostsInNetworkBitcoinTestnet
+ - alert: NoHostsInNetworkLiquidMainnet
+ expr: absent(up{name="liquid-mainnet"})
+ for: 1m
+ labels:
+ severity: page
+ annotations:
+ summary: No hosts in network {{ $labels.name }}, production traffic impacted!
+ description: There are currently no hosts up in the network {{ $labels.name }}, verify the instance group. https://wiki.blockstream.io/OpsPlaybooks/Esplora-Runbooks#NoHostsInNetworkLiquidMainnet
+
+ - path: /home/exec/prometheus/prometheus.yml
+ permissions: 0644
+ owner: root
+ content: |
+ global:
+ evaluation_interval: 15s
+ scrape_interval: 15s
+ external_labels:
+ project: green-address-explorer
+
+ rule_files:
+ - /config/rules/alerts.yml
+
+ alerting:
+ alertmanagers:
+ - scheme: http
+ static_configs:
+ - targets:
+ - "127.0.0.1:9093"
+
+ scrape_configs:
+ - job_name: prometheus
+ relabel_configs:
+ - source_labels:
+ - '__meta_gce_label_network'
+ target_label: 'network'
+ - source_labels:
+ - '__meta_gce_label_name'
+ target_label: 'name'
+ - source_labels:
+ - '__meta_gce_instance_name'
+ target_label: 'instance_name'
+ gce_sd_configs:
+ - project: green-address-explorer
+ zone: asia-northeast1-a
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-b
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-c
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-a
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-b
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-c
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-a
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-b
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-c
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-f
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-d
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-b
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-c
+ filter: (labels.type = "prometheus")
+ port: 9100
+ - job_name: http-tor
+ relabel_configs:
+ - source_labels:
+ - '__meta_gce_label_network'
+ target_label: 'network'
+ - source_labels:
+ - '__meta_gce_label_name'
+ target_label: 'name'
+ - source_labels:
+ - '__meta_gce_instance_name'
+ target_label: 'instance_name'
+ gce_sd_configs:
+ - project: green-address-explorer
+ zone: asia-northeast1-a
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-b
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-c
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-a
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-b
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-c
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-a
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-b
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-c
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-f
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-d
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-b
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-c
+ filter: (labels.type = "http-tor")
+ port: 9100
+ - job_name: explorer
+ relabel_configs:
+ - source_labels:
+ - '__meta_gce_label_network'
+ target_label: 'network'
+ - source_labels:
+ - '__meta_gce_label_name'
+ target_label: 'name'
+ - source_labels:
+ - '__meta_gce_instance_name'
+ target_label: 'instance_name'
+ gce_sd_configs:
+ - project: green-address-explorer
+ zone: asia-northeast1-a
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: asia-northeast1-b
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: asia-northeast1-c
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: europe-west4-a
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: europe-west4-b
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: europe-west4-c
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-central1-a
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-central1-b
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-central1-c
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-central1-f
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-east1-d
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-east1-b
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: us-east1-c
+ filter: (labels.type = "explorer")
+ port: 4224
+ - project: green-address-explorer
+ zone: asia-northeast1-a
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-b
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: asia-northeast1-c
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-a
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-b
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: europe-west4-c
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-a
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-b
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-c
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-central1-f
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-d
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-b
+ filter: (labels.type = "explorer")
+ port: 9100
+ - project: green-address-explorer
+ zone: us-east1-c
+ filter: (labels.type = "explorer")
+ port: 9100
+
+ - path: /etc/systemd/system/prometheus.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=prometheus-server instance
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 9090 -j ACCEPT
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+ ExecStartPre=/sbin/iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 9090
+ ExecStart=/usr/bin/docker run \
+ --network=host \
+ -v /mnt/disks/data:/data:rw \
+ -v /home/exec/prometheus:/config:ro \
+ --read-only \
+ --name prometheus \
+ "${docker_tag}" --config.file=/config/prometheus.yml --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path=/data/metrics --storage.tsdb.retention=${retention}
+ ExecStop=/usr/bin/docker stop prometheus
+ ExecStopPost=/usr/bin/docker rm prometheus
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 9090 -j ACCEPT
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 80 -j ACCEPT
+ ExecStopPost=/sbin/iptables -D PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 9090
+
+ [Install]
+ WantedBy=multi-user.target
+ - path: /etc/systemd/system/alertmanager.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=alertmanager-server instance
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 9093 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --network=host \
+ -v /mnt/disks/data:/data:rw \
+ -v /home/exec/prometheus:/config:ro \
+ --read-only \
+ --name alertmanager \
+ --entrypoint=/bin/alertmanager \
+ "${docker_tag}" --config.file=/config/alertmanager.yml
+ ExecStop=/usr/bin/docker stop alertmanager
+ ExecStopPost=/usr/bin/docker rm alertmanager
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 9093 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+ - path: /etc/systemd/system/node-exporter.service
+ permissions: 0644
+ owner: root
+ content: |
+ [Unit]
+ Description=prometheus node-exporter
+ Wants=gcr-online.target docker.service
+ After=gcr-online.service docker.service
+
+ [Service]
+ Restart=always
+ RestartSec=1
+ Environment=HOME=/home/exec
+ ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
+ ExecStartPre=/usr/bin/docker pull ${docker_tag_node_exporter}
+ ExecStartPre=/sbin/iptables -A INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+ ExecStart=/usr/bin/docker run \
+ --name=node-exporter \
+ --network=host \
+ --read-only \
+ -v /proc:/host/proc:ro \
+ -v /sys:/host/sys:ro \
+ -v /:/rootfs:ro \
+ -v metrics:/metrics:ro \
+ "${docker_tag_node_exporter}" --path.procfs /host/proc --path.sysfs /host/sys --collector.textfile.directory /metrics --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc($|/))"
+ ExecStop=/usr/bin/docker stop node-exporter
+ ExecStopPost=/usr/bin/docker rm node-exporter
+ ExecStopPost=/sbin/iptables -D INPUT -m tcp -p tcp --dport 9100 -j ACCEPT
+
+ [Install]
+ WantedBy=multi-user.target
+
+runcmd:
+ - /bin/mkdir -p /mnt/disks/data/metrics
+ - /bin/chown nobody:nobody /mnt/disks/data/metrics
+ - systemctl daemon-reload
+ - systemctl start prometheus.service
+ - systemctl enable prometheus.service
+ - systemctl start alertmanager.service
+ - systemctl enable alertmanager.service
+ - systemctl start node-exporter.service
+ - systemctl enable node-exporter.service
diff --git a/terraform/modules/prometheus/data.tf b/terraform/modules/prometheus/data.tf
new file mode 100644
index 00000000..e824241e
--- /dev/null
+++ b/terraform/modules/prometheus/data.tf
@@ -0,0 +1,24 @@
+data "google_compute_network" "default" {
+ name = "default"
+}
+
+data "template_file" "prometheus" {
+ template = "${file("${path.module}/cloud-init/prometheus.yml")}"
+
+ vars {
+ docker_tag = "${var.docker_tag}"
+ docker_tag_node_exporter = "${var.docker_tag_node_exporter}"
+ retention = "${var.retention}"
+ opsgenie_api_key = "${var.opsgenie_api_key}"
+ }
+}
+
+data "template_cloudinit_config" "prometheus" {
+ gzip = false
+ base64_encode = false
+
+ part {
+ content_type = "text/cloud-config"
+ content = "${data.template_file.prometheus.rendered}"
+ }
+}
diff --git a/terraform/modules/prometheus/docker/Dockerfile b/terraform/modules/prometheus/docker/Dockerfile
new file mode 100644
index 00000000..ea61fcac
--- /dev/null
+++ b/terraform/modules/prometheus/docker/Dockerfile
@@ -0,0 +1,12 @@
+FROM golang:latest as BUILD
+
+ENV GO15VENDOREXPERIMENT=1
+
+RUN go get github.com/prometheus/alertmanager/cmd/... \
+ && cd /go/src/github.com/prometheus/alertmanager \
+ && make build
+
+FROM prom/prometheus@sha256:2d79525389d68a309db843c1888f364823afbbef32ffea4741024d2ab9994dd6
+
+COPY --from=build /go/src/github.com/prometheus/alertmanager/alertmanager /bin/alertmanager
+COPY --from=build /go/src/github.com/prometheus/alertmanager/amtool /bin/amtool
diff --git a/terraform/modules/prometheus/firewall.tf b/terraform/modules/prometheus/firewall.tf
new file mode 100644
index 00000000..bf6351cd
--- /dev/null
+++ b/terraform/modules/prometheus/firewall.tf
@@ -0,0 +1,17 @@
+resource "google_compute_firewall" "all-traffic" {
+ name = "prometheus-${var.name}-all-traffic-access"
+ network = "${data.google_compute_network.default.self_link}"
+
+ count = "${var.create_resources}"
+
+ allow {
+ protocol = "tcp"
+ ports = ["80"]
+ }
+
+ source_ranges = ["${var.allowed_source_ip}/32"]
+
+ target_service_accounts = [
+ "${google_service_account.prometheus.email}",
+ ]
+}
diff --git a/terraform/modules/prometheus/iam.tf b/terraform/modules/prometheus/iam.tf
new file mode 100644
index 00000000..b19cb426
--- /dev/null
+++ b/terraform/modules/prometheus/iam.tf
@@ -0,0 +1,14 @@
+resource "google_service_account" "prometheus" {
+ account_id = "prometheus-${var.name}"
+ display_name = "prometheus-${var.name}"
+
+ count = "${var.create_resources}"
+}
+
+resource "google_project_iam_member" "prometheus" {
+ project = "${var.project}"
+ role = "roles/editor"
+ member = "serviceAccount:${google_service_account.prometheus.email}"
+
+ count = "${var.create_resources}"
+}
diff --git a/terraform/modules/prometheus/main.tf b/terraform/modules/prometheus/main.tf
new file mode 100644
index 00000000..5e008312
--- /dev/null
+++ b/terraform/modules/prometheus/main.tf
@@ -0,0 +1,77 @@
+resource "google_compute_disk" "prometheus-data" {
+ count = "${var.create_resources > 0 ? var.instances : 0}"
+ name = "prometheus-${var.name}-data-disk-${count.index}"
+ project = "${var.project}"
+ type = "pd-standard"
+ zone = "${element(var.zones, count.index)}"
+ size = "${var.size}"
+}
+
+resource "google_compute_address" "prometheus-address" {
+ count = "${var.create_resources > 0 ? var.instances : 0}"
+ name = "prometheus-${var.name}-address-${count.index}"
+ project = "${var.project}"
+ region = "${var.region}"
+}
+
+resource "google_compute_address" "prometheus-internal-address" {
+ count = "${var.create_resources > 0 ? var.instances : 0}"
+ name = "prometheus-${var.name}-internal-address-${count.index}"
+ project = "${var.project}"
+ region = "${var.region}"
+ address_type = "INTERNAL"
+}
+
+locals {
+ service_account = "${terraform.workspace == "main" ? element(concat(google_service_account.prometheus.*.email, list("")), 0) : var.prometheus_service_account}"
+}
+
+resource "google_compute_instance" "prometheus-server" {
+ count = "${var.create_resources > 0 ? var.instances : 0}"
+ name = "prometheus-${var.name}-${count.index}"
+ machine_type = "${var.machine_type}"
+ zone = "${element(var.zones, count.index)}"
+ project = "${var.project}"
+ allow_stopping_for_update = true
+
+ labels {
+ type = "prometheus"
+ name = "${var.name}"
+ network = "${var.network}"
+ }
+
+ service_account {
+ email = "${local.service_account}"
+
+ scopes = [
+ "https://www.googleapis.com/auth/compute.readonly",
+ "https://www.googleapis.com/auth/devstorage.read_only",
+ "https://www.googleapis.com/auth/pubsub",
+ ]
+ }
+
+ boot_disk {
+ initialize_params {
+ size = "10"
+ image = "${var.image}"
+ }
+ }
+
+ attached_disk {
+ source = "${element(google_compute_disk.prometheus-data.*.name, count.index)}"
+ device_name = "data"
+ }
+
+ network_interface {
+ network = "${data.google_compute_network.default.self_link}"
+ network_ip = "${element(google_compute_address.prometheus-internal-address.*.address, count.index)}"
+
+ access_config {
+ nat_ip = "${element(google_compute_address.prometheus-address.*.address, count.index)}"
+ }
+ }
+
+ metadata {
+ "user-data" = "${data.template_cloudinit_config.prometheus.rendered}"
+ }
+}
diff --git a/terraform/modules/prometheus/outputs.tf b/terraform/modules/prometheus/outputs.tf
new file mode 100644
index 00000000..bd92c520
--- /dev/null
+++ b/terraform/modules/prometheus/outputs.tf
@@ -0,0 +1,3 @@
+output "service_account" {
+ value = "${element(concat(google_service_account.prometheus.*.email, list("")), 0)}"
+}
diff --git a/terraform/modules/prometheus/variables.tf b/terraform/modules/prometheus/variables.tf
new file mode 100644
index 00000000..85e720c6
--- /dev/null
+++ b/terraform/modules/prometheus/variables.tf
@@ -0,0 +1,70 @@
+variable "create_resources" {
+ type = "string"
+}
+
+variable "project" {
+ type = "string"
+}
+
+variable "name" {
+ type = "string"
+}
+
+variable "network" {
+ type = "string"
+ default = "default"
+}
+
+variable "region" {
+ type = "string"
+}
+
+variable "zones" {
+ type = "list"
+}
+
+variable "instances" {
+ type = "string"
+}
+
+variable "docker_tag" {
+ type = "string"
+}
+
+variable "machine_type" {
+ type = "string"
+}
+
+variable "image" {
+ type = "string"
+ default = "cos-cloud/cos-stable"
+}
+
+variable "size" {
+ type = "string"
+ default = "100"
+}
+
+variable "retention" {
+ type = "string"
+ default = "31d"
+}
+
+variable "docker_tag_node_exporter" {
+ type = "string"
+}
+
+variable "allowed_source_ip" {
+ type = "string"
+ description = "Which IP is allowed to access the instance?"
+}
+
+variable "prometheus_service_account" {
+ type = "string"
+ default = ""
+}
+
+variable "opsgenie_api_key" {
+ type = "string"
+ description = "Add new Prometheus integration to opsgenie, use resulting API key here"
+}
diff --git a/terraform/network-onion.tf b/terraform/network-onion.tf
new file mode 100644
index 00000000..57e4c5b5
--- /dev/null
+++ b/terraform/network-onion.tf
@@ -0,0 +1,128 @@
+resource "google_compute_global_address" "onion-lb" {
+ name = "explorer-address-onion-lb"
+ project = "${var.project}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_global_forwarding_rule" "rule-onion" {
+ name = "explorer-onion-forwarding-rule"
+ target = "${google_compute_target_http_proxy.onion-proxy.self_link}"
+ port_range = "80"
+ ip_protocol = "TCP"
+ ip_address = "${google_compute_global_address.onion-lb.address}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_target_http_proxy" "onion-proxy" {
+ name = "explorer-onion-proxy"
+ url_map = "${google_compute_url_map.onion-proxy.self_link}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_url_map" "onion-proxy" {
+ name = "explorer-onion-urlmap"
+ default_service = "${google_compute_backend_bucket.onion_deadhole_backend.self_link}"
+
+ count = "${local.create_main}"
+
+ host_rule {
+ hosts = ["*"]
+ path_matcher = "deadpaths"
+ }
+
+ path_matcher {
+ name = "deadpaths"
+ default_service = "${google_compute_backend_bucket.onion_deadhole_backend.self_link}"
+
+ path_rule {
+ paths = ["/*"]
+ service = "${google_compute_backend_bucket.onion_deadhole_backend.self_link}"
+ }
+ }
+
+ host_rule {
+ hosts = ["${var.hosts_onion}"]
+ path_matcher = "allpaths"
+ }
+
+ path_matcher {
+ name = "allpaths"
+ default_service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+
+ path_rule {
+ paths = ["/*"]
+ service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+ }
+
+ path_rule {
+ paths = ["/testnet", "/testnet/*"]
+ service = "${data.terraform_remote_state.bitcoin-testnet.daemon_backend_service["bitcoin-testnet"]}"
+ }
+
+ path_rule {
+ paths = ["/liquid", "/liquid/*"]
+ service = "${data.terraform_remote_state.liquid-mainnet.daemon_backend_service["liquid-mainnet"]}"
+ }
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+ host = "${var.hosts_onion[0]}"
+ path = "/"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-testnet.daemon_backend_service["bitcoin-testnet"]}"
+ host = "${var.hosts_onion[0]}"
+ path = "/testnet"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.liquid-mainnet.daemon_backend_service["liquid-mainnet"]}"
+ host = "${var.hosts_onion[0]}"
+ path = "/liquid"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+ host = "${var.hosts_onion[1]}"
+ path = "/"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-testnet.daemon_backend_service["bitcoin-testnet"]}"
+ host = "${var.hosts_onion[1]}"
+ path = "/testnet"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.liquid-mainnet.daemon_backend_service["liquid-mainnet"]}"
+ host = "${var.hosts_onion[1]}"
+ path = "/liquid"
+ }
+
+ test {
+ service = "${google_compute_backend_bucket.onion_deadhole_backend.self_link}"
+ host = "${google_compute_global_address.onion-lb.address}"
+ path = "/"
+ }
+}
+
+resource "google_compute_backend_bucket" "onion_deadhole_backend" {
+ name = "onion-deadhole-backend-bucket"
+ description = "Unmatched hosts end up in this deadhole"
+ bucket_name = "${google_storage_bucket.onion_deadhole.name}"
+ enable_cdn = false
+
+ count = "${local.create_main}"
+}
+
+resource "google_storage_bucket" "onion_deadhole" {
+ name = "onion-deadhole-bucket"
+ location = "EU"
+
+ count = "${local.create_main}"
+}
diff --git a/terraform/network.tf b/terraform/network.tf
new file mode 100644
index 00000000..61430fcd
--- /dev/null
+++ b/terraform/network.tf
@@ -0,0 +1,141 @@
+resource "google_compute_global_address" "client-lb" {
+ name = "explorer-address-client-lb"
+ project = "${var.project}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_global_forwarding_rule" "rule-https" {
+ name = "explorer-https-forwarding-rule"
+ target = "${google_compute_target_https_proxy.https-proxy.self_link}"
+ port_range = "443"
+ ip_protocol = "TCP"
+ ip_address = "${google_compute_global_address.client-lb.address}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_global_forwarding_rule" "rule-http" {
+ name = "explorer-http-forwarding-rule"
+ target = "${google_compute_target_http_proxy.http-proxy.self_link}"
+ port_range = "80"
+ ip_protocol = "TCP"
+ ip_address = "${google_compute_global_address.client-lb.address}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_target_http_proxy" "http-proxy" {
+ name = "explorer-http-proxy"
+ url_map = "${google_compute_url_map.http-proxy.self_link}"
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_url_map" "http-proxy" {
+ name = "explorer-http-urlmap"
+ default_service = "${data.terraform_remote_state.bitcoin-mainnet.http_backend_service["bitcoin-mainnet"]}"
+
+ count = "${local.create_main}"
+
+ host_rule {
+ hosts = ["${var.hosts}"]
+ path_matcher = "allpaths"
+ }
+
+ path_matcher {
+ name = "allpaths"
+ default_service = "${data.terraform_remote_state.bitcoin-mainnet.http_backend_service["bitcoin-mainnet"]}"
+
+ path_rule {
+ paths = ["/*"]
+ service = "${data.terraform_remote_state.bitcoin-mainnet.http_backend_service["bitcoin-mainnet"]}"
+ }
+
+ path_rule {
+ paths = ["/testnet", "/testnet/*"]
+ service = "${data.terraform_remote_state.bitcoin-testnet.http_backend_service["bitcoin-testnet"]}"
+ }
+
+ path_rule {
+ paths = ["/liquid", "/liquid/*"]
+ service = "${data.terraform_remote_state.liquid-mainnet.http_backend_service["liquid-mainnet"]}"
+ }
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-mainnet.http_backend_service["bitcoin-mainnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-testnet.http_backend_service["bitcoin-testnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/testnet"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.liquid-mainnet.http_backend_service["liquid-mainnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/liquid"
+ }
+}
+
+resource "google_compute_target_https_proxy" "https-proxy" {
+ name = "explorer-https-proxy"
+ url_map = "${google_compute_url_map.https-proxy.self_link}"
+ ssl_certificates = ["${var.ssl_certs}"]
+
+ count = "${local.create_main}"
+}
+
+resource "google_compute_url_map" "https-proxy" {
+ name = "explorer-https-urlmap"
+ default_service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+
+ count = "${local.create_main}"
+
+ host_rule {
+ hosts = ["${var.hosts}"]
+ path_matcher = "allpaths"
+ }
+
+ path_matcher {
+ name = "allpaths"
+ default_service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+
+ path_rule {
+ paths = ["/*"]
+ service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+ }
+
+ path_rule {
+ paths = ["/testnet", "/testnet/*"]
+ service = "${data.terraform_remote_state.bitcoin-testnet.daemon_backend_service["bitcoin-testnet"]}"
+ }
+
+ path_rule {
+ paths = ["/liquid", "/liquid/*"]
+ service = "${data.terraform_remote_state.liquid-mainnet.daemon_backend_service["liquid-mainnet"]}"
+ }
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-mainnet.daemon_backend_service["bitcoin-mainnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.bitcoin-testnet.daemon_backend_service["bitcoin-testnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/testnet"
+ }
+
+ test {
+ service = "${data.terraform_remote_state.liquid-mainnet.daemon_backend_service["liquid-mainnet"]}"
+ host = "${var.hosts[0]}"
+ path = "/liquid"
+ }
+}
diff --git a/terraform/outputs.tf b/terraform/outputs.tf
new file mode 100644
index 00000000..b99a3c70
--- /dev/null
+++ b/terraform/outputs.tf
@@ -0,0 +1,19 @@
+output "prometheus_service_account" {
+ value = "${module.prometheus.service_account}"
+}
+
+output "daemon_backend_service" {
+ value = {
+ bitcoin-mainnet = "${module.bitcoin-mainnet.backend_service}"
+ bitcoin-testnet = "${module.bitcoin-testnet.backend_service}"
+ liquid-mainnet = "${module.liquid-mainnet.backend_service}"
+ }
+}
+
+output "http_backend_service" {
+ value = {
+ bitcoin-mainnet = "${module.bitcoin-mainnet-http.backend_service}"
+ bitcoin-testnet = "${module.bitcoin-testnet-http.backend_service}"
+ liquid-mainnet = "${module.liquid-mainnet-http.backend_service}"
+ }
+}
diff --git a/terraform/variables.tf b/terraform/variables.tf
new file mode 100644
index 00000000..2b29b664
--- /dev/null
+++ b/terraform/variables.tf
@@ -0,0 +1,132 @@
+locals {
+ context_variables = {
+ "main" = {
+ create_main = 1
+ create_bitcoin_mainnet = 0
+ create_bitcoin_testnet = 0
+ create_liquid_mainnet = 0
+ }
+
+ "bitcoin-mainnet" = {
+ create_main = 0
+ create_bitcoin_mainnet = 1
+ create_bitcoin_testnet = 0
+ create_liquid_mainnet = 0
+ }
+
+ "bitcoin-testnet" = {
+ create_main = 0
+ create_bitcoin_mainnet = 0
+ create_bitcoin_testnet = 1
+ create_liquid_mainnet = 0
+ }
+
+ "liquid-mainnet" = {
+ create_main = 0
+ create_bitcoin_mainnet = 0
+ create_bitcoin_testnet = 0
+ create_liquid_mainnet = 1
+ }
+ }
+
+ create_main = "${lookup(local.context_variables[terraform.workspace], "create_main")}"
+ create_bitcoin_mainnet = "${lookup(local.context_variables[terraform.workspace], "create_bitcoin_mainnet")}"
+ create_bitcoin_testnet = "${lookup(local.context_variables[terraform.workspace], "create_bitcoin_testnet")}"
+ create_liquid_mainnet = "${lookup(local.context_variables[terraform.workspace], "create_liquid_mainnet")}"
+}
+
+variable "project" {
+ type = "string"
+ default = "green-address-explorer"
+}
+
+variable "region" {
+ type = "string"
+ default = "overwritten_by_ci"
+}
+
+variable "machine_type" {
+ type = "string"
+ default = "overwritten_by_ci"
+}
+
+variable "cluster_size" {
+ type = "string"
+ default = "overwritten_by_ci"
+}
+
+# lists overwritten by ci
+variable "regions" {
+ type = "list"
+ default = [""]
+}
+
+variable "ssl_certs" {
+ type = "list"
+ default = []
+}
+
+variable "zones" {
+ type = "list"
+ default = [""]
+}
+
+variable "instance_type" {
+ type = "list"
+ default = ["", ""]
+}
+
+variable "hosts" {
+ default = [""]
+}
+
+variable "hosts_onion" {
+ default = ["", ""]
+}
+
+variable "docker_tag_nginx" {
+ type = "string"
+
+ # docker inspect --format='{{index .RepoDigests 0}}' nginx:alpine
+
+ default = "nginx@sha256:ae5da813f8ad7fa785d7668f0b018ecc8c3a87331527a61d83b3b5e816a0f03c"
+}
+
+variable "docker_tag_node_exporter" {
+ type = "string"
+
+ # docker inspect --format='{{index .RepoDigests 0}}' prom/node-exporter:v0.16.0
+
+ default = "prom/node-exporter@sha256:55302581333c43d540db0e144cf9e7735423117a733cdec27716d87254221086"
+}
+
+variable "docker_tag_explorer" {
+ type = "string"
+ default = "overwritten_by_ci"
+}
+
+variable "docker_tag_prometheus" {
+ type = "string"
+ default = "gcr.io/green-address-explorer/prometheus@sha256:f3817443defecd22e51017769a8835dca21ea87f7d1edf6d78e007c90e813843"
+}
+
+variable "min_ready_sec" {
+ type = "string"
+ description = "How long should autoscaling wait before executing another action?"
+ default = "900"
+}
+
+variable "initial_delay_sec" {
+ type = "string"
+ description = "How long should the instance group healthcheck wait before checking instances?"
+ default = "1800"
+}
+
+variable "prometheus_allowed_source_ip" {
+ description = "The IP that is allowed to access the prometheus instance."
+ default = ""
+}
+
+variable "opsgenie_api_key" {
+ default = ""
+}
diff --git a/www/bootstrap.min.css b/www/bootstrap.min.css
new file mode 120000
index 00000000..7c467309
--- /dev/null
+++ b/www/bootstrap.min.css
@@ -0,0 +1 @@
+../client/node_modules/bootstrap/dist/css/bootstrap.min.css
\ No newline at end of file
diff --git a/www/font/DINPro-Medium.otf b/www/font/DINPro-Medium.otf
new file mode 100644
index 00000000..b4608d06
Binary files /dev/null and b/www/font/DINPro-Medium.otf differ
diff --git a/www/font/DINPro-Regular.otf b/www/font/DINPro-Regular.otf
new file mode 100644
index 00000000..84d57abb
Binary files /dev/null and b/www/font/DINPro-Regular.otf differ
diff --git a/www/font/inconsolata b/www/font/inconsolata
new file mode 120000
index 00000000..0f46e486
--- /dev/null
+++ b/www/font/inconsolata
@@ -0,0 +1 @@
+../../node_modules/typeface-inconsolata
\ No newline at end of file
diff --git a/www/img/Loading.gif b/www/img/Loading.gif
new file mode 100644
index 00000000..ee220758
Binary files /dev/null and b/www/img/Loading.gif differ
diff --git a/www/img/block.svg b/www/img/block.svg
new file mode 100644
index 00000000..23a15a62
--- /dev/null
+++ b/www/img/block.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/blockstream-full-logo-light.svg b/www/img/blockstream-full-logo-light.svg
new file mode 100644
index 00000000..b6301dc2
--- /dev/null
+++ b/www/img/blockstream-full-logo-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/blockstream-full-logo.svg b/www/img/blockstream-full-logo.svg
new file mode 100644
index 00000000..09aa357a
--- /dev/null
+++ b/www/img/blockstream-full-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/f1b_blue.png b/www/img/f1b_blue.png
new file mode 100755
index 00000000..f3179ad7
Binary files /dev/null and b/www/img/f1b_blue.png differ
diff --git a/www/img/favicon_new.png b/www/img/favicon_new.png
new file mode 100644
index 00000000..5099a06d
Binary files /dev/null and b/www/img/favicon_new.png differ
diff --git a/www/img/github_blue.png b/www/img/github_blue.png
new file mode 100755
index 00000000..d7f36015
Binary files /dev/null and b/www/img/github_blue.png differ
diff --git a/www/img/icons/arrow.svg b/www/img/icons/arrow.svg
new file mode 100644
index 00000000..2e9fed11
--- /dev/null
+++ b/www/img/icons/arrow.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/www/img/icons/arrow_down.png b/www/img/icons/arrow_down.png
new file mode 100644
index 00000000..6252634c
Binary files /dev/null and b/www/img/icons/arrow_down.png differ
diff --git a/www/img/icons/arrow_left_blu.png b/www/img/icons/arrow_left_blu.png
new file mode 100644
index 00000000..4397a3a1
Binary files /dev/null and b/www/img/icons/arrow_left_blu.png differ
diff --git a/www/img/icons/arrow_right_blu.png b/www/img/icons/arrow_right_blu.png
new file mode 100644
index 00000000..90f671dd
Binary files /dev/null and b/www/img/icons/arrow_right_blu.png differ
diff --git a/www/img/icons/blockstream-logo.png b/www/img/icons/blockstream-logo.png
new file mode 100644
index 00000000..9b486bea
Binary files /dev/null and b/www/img/icons/blockstream-logo.png differ
diff --git a/www/img/icons/cancel.png b/www/img/icons/cancel.png
new file mode 100644
index 00000000..419f59a9
Binary files /dev/null and b/www/img/icons/cancel.png differ
diff --git a/www/img/icons/code.png b/www/img/icons/code.png
new file mode 100644
index 00000000..c88f5b61
Binary files /dev/null and b/www/img/icons/code.png differ
diff --git a/www/img/icons/copy.png b/www/img/icons/copy.png
new file mode 100644
index 00000000..5a707f7b
Binary files /dev/null and b/www/img/icons/copy.png differ
diff --git a/www/img/icons/menu-logo.svg b/www/img/icons/menu-logo.svg
new file mode 100644
index 00000000..c0094b99
--- /dev/null
+++ b/www/img/icons/menu-logo.svg
@@ -0,0 +1,27 @@
+
+
\ No newline at end of file
diff --git a/www/img/icons/minus.svg b/www/img/icons/minus.svg
new file mode 100755
index 00000000..66efc1f7
--- /dev/null
+++ b/www/img/icons/minus.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/www/img/icons/moon_dark.svg b/www/img/icons/moon_dark.svg
new file mode 100644
index 00000000..09fb7069
--- /dev/null
+++ b/www/img/icons/moon_dark.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/www/img/icons/moon_light.svg b/www/img/icons/moon_light.svg
new file mode 100644
index 00000000..67c4462a
--- /dev/null
+++ b/www/img/icons/moon_light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/icons/old-minus.png b/www/img/icons/old-minus.png
new file mode 100644
index 00000000..bae5c321
Binary files /dev/null and b/www/img/icons/old-minus.png differ
diff --git a/www/img/icons/old-plus.png b/www/img/icons/old-plus.png
new file mode 100644
index 00000000..3f147923
Binary files /dev/null and b/www/img/icons/old-plus.png differ
diff --git a/www/img/icons/peg_in.png b/www/img/icons/peg_in.png
new file mode 100644
index 00000000..aefb2634
Binary files /dev/null and b/www/img/icons/peg_in.png differ
diff --git a/www/img/icons/peg_out.png b/www/img/icons/peg_out.png
new file mode 100644
index 00000000..c6c126e3
Binary files /dev/null and b/www/img/icons/peg_out.png differ
diff --git a/www/img/icons/plus.svg b/www/img/icons/plus.svg
new file mode 100755
index 00000000..bc02eb34
--- /dev/null
+++ b/www/img/icons/plus.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/www/img/icons/search.svg b/www/img/icons/search.svg
new file mode 100644
index 00000000..3f1b2cf0
--- /dev/null
+++ b/www/img/icons/search.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/www/img/linkedin_blue.png b/www/img/linkedin_blue.png
new file mode 100755
index 00000000..c9e60f24
Binary files /dev/null and b/www/img/linkedin_blue.png differ
diff --git a/www/img/onion.svg b/www/img/onion.svg
new file mode 100644
index 00000000..620729a7
--- /dev/null
+++ b/www/img/onion.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/onion_light.svg b/www/img/onion_light.svg
new file mode 100644
index 00000000..9f7b0180
--- /dev/null
+++ b/www/img/onion_light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/img/social-sharing.png b/www/img/social-sharing.png
new file mode 100644
index 00000000..b1d599b5
Binary files /dev/null and b/www/img/social-sharing.png differ
diff --git a/www/img/t1witter_blue.png b/www/img/t1witter_blue.png
new file mode 100755
index 00000000..3a898f15
Binary files /dev/null and b/www/img/t1witter_blue.png differ
diff --git a/www/img/transaction.svg b/www/img/transaction.svg
new file mode 100644
index 00000000..e0e5ff36
--- /dev/null
+++ b/www/img/transaction.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/light-theme_style.css b/www/light-theme_style.css
new file mode 100644
index 00000000..1cd3833e
--- /dev/null
+++ b/www/light-theme_style.css
@@ -0,0 +1,78 @@
+body.theme-light {
+ color: rgba(21, 24, 28, 1);
+ background-color: #FFF;
+}
+
+.theme-light .blocks-table-row {
+ color: rgba(21, 24, 28, 1) !important;
+}
+
+.theme-light .jumbotron-fluid {
+ background-color: rgba(238, 242, 245, 1) !important;
+}
+
+.theme-light .explorer-container > .footer {
+ background-color: #fff;
+}
+
+.theme-light .transaction-box {
+ background-color: #fff;
+ border: 1px solid #15191e;
+}
+
+.theme-light .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading), .theme-light .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) {
+ background-color: #fff !important;
+}
+
+.theme-light .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body, .theme-light .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body, .theme-light .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body, .theme-light .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body {
+ background-color: #fff !important;
+}
+
+.theme-light .language-selector {
+ background-color: rgba(169, 177, 182, 1);
+}
+
+.theme-light .jumbotron-fluid .prev-next-blocks-btns > div a > div {
+ background-color: #fff;
+}
+
+.theme-light .jumbotron-fluid .prev-next-blocks-btns > div a, .theme-light .jumbotron-fluid .prev-next-blocks-btns > div a:link, .theme-light .jumbotron-fluid .prev-next-blocks-btns > div a:visited, .theme-light .jumbotron-fluid .prev-next-blocks-btns > div a:hover, .theme-light .jumbotron-fluid .prev-next-blocks-btns > div a:focus {
+ color: rgba(21, 24, 28, 1) !important;
+}
+
+.theme-light .blocks-table-link-row:nth-child(odd) {
+ background: #fff;
+}
+
+.theme-light .search-bar {
+ background-color: #fff;
+}
+
+.theme-light .load-more {
+ color: #22242c;
+ background-color: #fff;
+}
+
+/* keep this for now - dark menu button */
+/* .theme-light .navbar-toggler {
+ border-color: rgba(17, 19, 22, 0.5);
+}
+.theme-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(17, 19, 22, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")
+} */
+
+.theme-light .footer_container_content_row_onion_link {
+ color: inherit !important;
+}
+
+.theme-light .nav-bar_moon_icon {
+ background-image: url("img/icons/moon_light.svg");
+}
+
+.theme-light .footer_container_content_row_onion_icon {
+ background-image: url("img/onion_light.svg");
+}
+
+.theme-light .jumbotron {
+ color: #fff;
+}
\ No newline at end of file
diff --git a/www/style.css b/www/style.css
new file mode 100644
index 00000000..ce5fef14
--- /dev/null
+++ b/www/style.css
@@ -0,0 +1,1681 @@
+@import url("font/inconsolata/index.css");
+@import url("light-theme_style.css");
+
+@font-face {
+ font-family: DINPro;
+ src: url("font/DINPro-Regular.otf") format("opentype");
+}
+
+@font-face {
+ font-family: DINPro;
+ font-weight: bold;
+ src: url("font/DINPro-Medium.otf") format("opentype");
+}
+
+.hide {
+ display: none !important;
+}
+
+body {
+ direction: ltr;
+ text-align: left;
+ font-family: DINPro;
+ color: #fff;
+}
+
+body.theme-dark {
+ background-color: #111316;
+}
+
+body[lang=he] {
+ font-family: "Open Sans Hebrew","Helvetica Neue",Helvetica,Arial,sans-serif;
+}
+
+a, a:link, a:visited, a:hover, a:focus {
+ color: #00ccff;
+ text-decoration: none;
+}
+
+.content-wrap {
+ min-height: calc(100vh - 60px - 24px);
+ margin-bottom: 24px;
+}
+
+.navbar {
+ margin-bottom: -80px;
+ /* background-color: rgba(17, 19, 22, 1); */
+ /* background-color: transparent; */
+ background-image: linear-gradient(-90deg, rgba(150, 101, 26, 1) 0%, rgba(115, 71, 28, 1) 18%, rgba(76, 52, 35, 1) 33%, rgba(33, 36, 41, 1) 58%, rgba(14, 16, 17, 1) 100%);
+ position: relative;
+ z-index: 10;
+}
+
+
+/* header title / search bar */
+.explorer-title-container {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ margin-top: 15px;
+ margin-bottom: 30px;
+}
+
+.explorer-title-container h1 {
+ margin: 0;
+}
+
+.explorer-title-container_logo {
+ height: 45px;
+ width: auto;
+ margin-right: 20px;
+}
+
+
+.block-header-title::before {
+ content: "";
+ background-image: url("img/block.svg");
+ background-size: 41px 48px;
+ width: 41px;
+ height: 48px;
+ display: inline-block;
+ margin-right: 5px;
+ margin-bottom: -8px;
+}
+
+.transaction-header-title::before {
+ content: "";
+ background-image: url("img/transaction.svg");
+ background-size: 41px 48px;
+ width: 41px;
+ height: 48px;
+ display: inline-block;
+ margin-right: 5px;
+ margin-bottom: -8px;
+}
+
+.search-bar {
+ width: 750px;
+ height: 60px;
+ border-radius: 4px;
+ background-color: #111316;
+ margin: 35px auto 0 auto;
+ border: 1px solid rgba(255, 187, 0, 1);
+ box-shadow: 0px 0px 6px 0px rgba(251, 192, 53, 1);
+}
+
+.search-bar input {
+ display: inline-block;
+ height: 60px;
+ vertical-align: top;
+}
+
+.search-bar input.search-bar-input {
+ width: 690px;
+ background-color: transparent;
+ border: none;
+ box-shadow: none;
+ color: rgba(163, 171, 176, 1);
+ font-size: 18px;
+}
+
+.search-bar .search-bar-submit {
+ height: 100% !important;
+ cursor: pointer !important;
+ background-color: transparent;
+ width: 50px;
+ outline: none;
+ border: none;
+ float: right;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+
+.search-bar .search-bar-submit-image {
+ height: auto;
+ width: auto;
+}
+
+.search-bar input.search-bar-submit:hover{
+ cursor: pointer;
+}
+
+
+.page-search-bar {
+ margin: 5px auto 30px auto;
+}
+
+
+
+/* HEADER START */
+.jumbotron-fluid {
+ background-color: transparent;
+ background-image: linear-gradient(-90deg, rgba(150, 101, 26, 1) 0%, rgba(115, 71, 28, 1) 18%, rgba(76, 52, 35, 1) 33%, rgba(33, 36, 41, 1) 58%, rgba(14, 16, 17, 1) 100%);
+ height: 450px;
+ background-repeat: no-repeat;
+ background-size: cover;
+ padding-top: calc(76px + 64px);
+ margin-bottom: 3.5rem;
+}
+
+.jumbotron-fluid .jumbotron-loading img {
+ display: block;
+ margin: auto;
+ width: 142px;
+ height: 142px;
+}
+
+.jumbotron-fluid.block-page {
+ background-image: linear-gradient(-90deg, rgba(150, 101, 26, 1) 0%, rgba(115, 71, 28, 1) 18%, rgba(76, 52, 35, 1) 33%, rgba(33, 36, 41, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.addr-page {
+ background-image: linear-gradient(-90deg, rgba(150, 101, 26, 1) 0%, rgba(115, 71, 28, 1) 18%, rgba(76, 52, 35, 1) 33%, rgba(33, 36, 41, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid.transaction-page {
+ background-image: linear-gradient(-90deg, rgba(150, 101, 26, 1) 0%, rgba(115, 71, 28, 1) 18%, rgba(76, 52, 35, 1) 33%, rgba(33, 36, 41, 1) 58%, rgba(14, 16, 17, 1) 100%);
+}
+
+.jumbotron-fluid .block-hash {
+ margin-bottom: 12px;
+}
+
+.jumbotron-fluid .code-button {
+ display: inline-block;
+ margin-left: 12px;
+ cursor: pointer;
+ position: relative;
+}
+
+.jumbotron-fluid .code-button .code-button-btn {
+ height: 26px;
+}
+
+.jumbotron-fluid .code-button .code-button-btn img {
+ width: 30px;
+ vertical-align: top;
+}
+
+.jumbotron-fluid .code-button .overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: rgba(0, 0, 0, 0.7);
+ z-index: 2;
+}
+
+.jumbotron-fluid .code-button .code-button-text {
+ position: absolute;
+ left: -435px;
+ top: 44px;
+ background-color: #107070;
+ color: #fff;
+ font-size: 14px;
+ font-weight: 400;
+ width: 870px;
+ padding: 40px 60px;
+ cursor: default;
+ border-radius: 10px;
+ z-index: 3 !important;
+}
+
+.jumbotron-fluid .code-button .code-button-text:before {
+ content: '';
+ position: absolute;
+ display: block;
+ top: -5px;
+ right: 418px;
+ transform: rotate(45deg);
+ width: 9px;
+ height: 9px;
+ background-color: #107070;
+}
+
+.jumbotron-fluid .code-button .code-button-text:after {
+ content: '';
+ position: absolute;
+ display: block;
+ top: -12px;
+ left: 0;
+ right: 0;
+ height: 12px;
+ background: transparent;
+}
+
+.jumbotron-fluid .code-button .code-button-text:not(.active) {
+ display: none;
+ z-index: -1;
+ opacity: 0;
+}
+
+.jumbotron-fluid .code-button .code-button-text.active {
+ z-index: 1;
+ opacity: 1;
+}
+
+.jumbotron-fluid .code-button .code-button-text h4 {
+ margin-bottom: 40px;
+ font-size: 20px;
+}
+
+.jumbotron-fluid .code-button .code-button-text > pre {
+ color: #fff;
+ margin-bottom: 40px;
+ font-size: 16px;
+ font-family: Inconsolata;
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button-top {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ position: absolute;
+ right: 60px;
+ height: 45px;
+ width: 45px;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ float: right;
+ width: 140px !important;
+ height: 40px;
+ border: 1px solid #fff;
+ border-radius: 5px;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button > div:nth-child(1) {
+ text-transform: uppercase;
+ text-align: center;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button > div:nth-child(2) {
+ width: 30px;
+}
+
+.jumbotron-fluid .code-button .code-button-text .close-button > div:nth-child(2) img {
+ width: 30px;
+}
+
+.jumbotron-fluid .code-button .code-button-text a, .jumbotron-fluid .code-button .code-button-text a:link, .jumbotron-fluid .code-button .code-button-text a:visited, .jumbotron-fluid .code-button .code-button-text a:hover, .jumbotron-fluid .code-button .code-button-text a:focus {
+ color: inherit;
+ text-decoration: none;
+ font-weight: 600;
+}
+
+.jumbotron-fluid .block-dropdowns {
+ display: flex;
+ flex-direction: row;
+}
+
+.jumbotron-fluid .block-dropdowns > div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ height: 40px;
+ background-color: #22242c;
+ border-radius: 2px;
+ border: 1px solid #28948f;
+}
+
+.jumbotron-fluid .block-dropdowns > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.jumbotron-fluid .block-dropdowns > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.jumbotron-fluid .block-dropdowns > div.date-dropdown {
+ width: 220px;
+}
+
+.jumbotron-fluid .block-dropdowns > div.time-dropdown {
+ width: 184px;
+ margin-left: 12px;
+}
+
+.jumbotron-fluid .block-dropdowns > div > div:nth-child(1) {
+ width: 42px;
+ padding-right: 12px;
+}
+
+.jumbotron-fluid .block-dropdowns > div > div:nth-child(1) > img {
+ width: 30px;
+}
+
+.jumbotron-fluid .block-dropdowns > div > div:nth-child(2) {
+ font-size: 14px;
+ font-weight: 600;
+}
+
+.jumbotron-fluid .block-dropdowns > div > div:nth-child(3) {
+ width: 42px;
+ padding-left: 12px;
+}
+
+.jumbotron-fluid .block-dropdowns > div > div:nth-child(3) > img {
+ width: 30px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div > div:nth-child(1) {
+ width: 142px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div a, .jumbotron-fluid .prev-next-blocks-btns > div a:link, .jumbotron-fluid .prev-next-blocks-btns > div a:visited, .jumbotron-fluid .prev-next-blocks-btns > div a:hover, .jumbotron-fluid .prev-next-blocks-btns > div a:focus {
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 400;
+ width: 140px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div a > div {
+ width: 140px !important;
+ height: 40px;
+ border-radius: 5px;
+ background-color: rgba(33, 39, 45, 1);
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div a > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div a > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(1) a > div > div:nth-child(1) {
+ width: 30px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(1) a > div > div:nth-child(1) div {
+ width: 30px;
+ height: 31px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(1) a > div > div:nth-child(2) {
+ text-align: center;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(2) a > div {
+ float: right;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(2) a > div > div:nth-child(1) {
+ text-align: center;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(2) a > div > div:nth-child(2) {
+ width: 30px;
+}
+
+.jumbotron-fluid .prev-next-blocks-btns > div:nth-child(2) a > div > div:nth-child(2) div {
+ width: 30px;
+ height: 31px;
+}
+
+/* HEADER END */
+
+body > .container, .navbar > .container, .jumbotron-fluid > .container, .content-wrap > div > .container, footer > .container {
+ max-width: 1000px;
+}
+
+.loading-page, .not-found-page {
+ margin-top: 100px;
+}
+
+.loading-page {
+ text-align: center;
+}
+
+.blocks-table .blocks-table-row {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.blocks-table .blocks-table-row > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.blocks-table .blocks-table-row.header, .blocks-table .blocks-table-row.block-data {
+ height: 52px;
+}
+
+.blocks-table .blocks-table-row.header > *, .blocks-table .blocks-table-row.block-data > * {
+ font-size: 16px;
+}
+
+.blocks-table .blocks-table-row.header > * {
+ text-transform: uppercase;
+ color: #78838e;
+ font-weight: 600;
+}
+
+.blocks-table .blocks-table-row.block-data {
+ border-top: 1px #22242c solid;
+}
+
+.blocks-table .blocks-table-row.block-data:not(.loading):hover {
+ background-color: rgba(255, 255, 255, 0.05);
+}
+
+.blocks-table .blocks-table-row.block-data > * {
+ font-size: 16px;
+}
+
+.blocks-table .blocks-table-row.loading img {
+ display: block;
+ margin: auto;
+ height: 45px;
+ width: 45px;
+ padding: 3px 0;
+}
+
+.blocks-table .blocks-table-row > div:nth-child(1) {
+ width: 150px;
+ padding-left: 12px;
+}
+
+.blocks-table .blocks-table-row > div:nth-child(2) {
+ width: 350px;
+}
+
+.blocks-table-row {
+ color: #FFF !important;
+}
+
+.highlighted-text {
+ color: #00ccff !important;
+}
+
+.newer-older-blocks-btns {
+ margin-top: 24px;
+}
+
+.newer-older-blocks-btns {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.newer-older-blocks-btns > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.newer-older-blocks-btns div > .blocks-btn {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 400;
+ width: 140px !important;
+ height: 40px;
+ border: 1px solid #00ccff;
+ border-radius: 5px;
+ background-color: #22242c;
+}
+
+.newer-older-blocks-btns div > .blocks-btn {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.newer-older-blocks-btns div > .blocks-btn > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.newer-btn > div:nth-child(1) {
+ width: 30px;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.newer-btn > div:nth-child(1) img {
+ width: 30px;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.newer-btn > *:nth-child(2) {
+ text-align: center;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.older-btn {
+ float: right;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.older-btn > *:nth-child(1) {
+ text-align: center;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.older-btn > div:nth-child(2) {
+ width: 30px;
+}
+
+.newer-older-blocks-btns div > .blocks-btn.older-btn > div:nth-child(2) img {
+ width: 30px;
+}
+
+.block-stats-table > div {
+ height: 52px;
+ border-top: 1px solid #22242c;
+ font-size: 16px;
+}
+
+.block-stats-table > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.block-stats-table > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.block-stats-table > div:last-child {
+ border-bottom: 1px solid #22242c;
+}
+
+.block-stats-table > div > div:nth-child(1) {
+ width: 200px;
+ text-transform: uppercase;
+ color: #78838e;
+ width: auto;
+}
+
+.block-stats-table > div > div:nth-child(2) {
+ text-align: right;
+ word-break: break-all;
+}
+
+.addr-stats-table > div {
+ height: 52px;
+ border-top: 1px solid #22242c;
+ font-size: 16px;
+}
+
+.addr-stats-table > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.addr-stats-table > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.addr-stats-table > div:last-child {
+ border-bottom: 1px solid #22242c;
+}
+
+.addr-stats-table > div > div:nth-child(1) {
+ width: 200px;
+ text-transform: uppercase;
+ color: #78838e;
+}
+
+.addr-stats-table > div > div:nth-child(2) {
+ text-align: right;
+ word-break: break-all;
+}
+
+.transaction-stats {
+ margin-top: 84px;
+}
+
+.transaction-stats > .transaction-stats-boxes {
+ margin: 32px -10px 30px;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper {
+ flex: 1;
+ margin: 0 10px;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-header {
+ border-radius: 5px 5px 0 0;
+ background-color: #22242c;
+ height: 52px;
+ line-height: 52px;
+ text-transform: uppercase;
+ padding: 0 46px;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body {
+ border-radius: 0 0 5px 5px;
+ background-color: #15191e;
+ padding: 0 46px;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body > div {
+ height: 57px;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body > div > span:nth-child(1) {
+ text-transform: uppercase;
+ color: #78838e;
+}
+
+.transaction-stats > .transaction-stats-boxes > .box-wrapper > .transaction-stats-box .box-body > div > span:nth-child(2) {
+ text-align: right;
+}
+
+.transactions {
+ margin-top: 84px;
+}
+
+.transactions > h3, .transactions > img {
+ display: inline-block;
+}
+
+.transactions > img {
+ width: 33px;
+ height: 33px;
+ margin-left: 12px;
+ vertical-align: top;
+}
+
+.transaction-box:not(:first-of-type) {
+ margin-top: 24px;
+}
+
+.transaction-box {
+ background-color: #15181C;
+ padding: 0 24px;
+ border-radius: 5px;
+}
+
+.transaction-box.loading-transaction {
+ padding: 12px;
+}
+
+.transaction-box.loading-transaction img {
+ display: block;
+ margin: auto;
+ height: 75px;
+ width: 75px;
+}
+
+.transaction-box > .header {
+ height: 88px;
+}
+
+.transaction-box > .header {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.transaction-box > .header > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.transaction-box > .header a {
+ font-size: 16px;
+ font-weight: 600;
+}
+
+.details-btn {
+ width: 200px;
+}
+
+.details-btn > div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ width: 200px;
+ height: 34px;
+ border: 1px solid rgba(255, 187, 0, 1);
+ border-radius: 2px;
+ color: rgba(255, 187, 0, 1);
+ float: right;
+ text-transform: uppercase;
+ font-size: 14px;
+}
+
+.details-btn > div {
+ display: table;
+ table-layout: fixed;
+ width: 80%;
+}
+
+.details-btn > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.details-btn > div:focus {
+ outline: none;
+}
+
+.details-btn > div > div:nth-child(1) {
+ text-align: center;
+}
+
+.details-btn > div > div:nth-child(2) {
+ width: 30px;
+}
+
+.transaction-box > .ins-and-outs {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.transaction-box > .ins-and-outs > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.transaction-box > .ins-and-outs > div {
+ vertical-align: top;
+}
+
+.transaction-box > .ins-and-outs > .vins > .vin-loading img, .transaction-box > .ins-and-outs .vouts > .vin-loading img {
+ display: block;
+ margin: auto;
+ height: 46px;
+ width: 46px;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) {
+ background-color: #21272D;
+ border-radius: 5px;
+ border: 1px solid #21272D;
+ min-height: 46px;
+ line-height: 20px;
+ font-size: 13px;
+ word-break: break-all;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading):not(:first-child), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading):not(:first-child) {
+ margin-top: 12px;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading).active, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading).active {
+ height: auto;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading).peg-out, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading).peg-in, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading).peg-out, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading).peg-in {
+ border-color: #00ccff;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-header, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-header, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-header, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-header {
+ padding: 12px 24px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ min-height: 46px;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-header > div, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-header > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-header > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-header > div {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: flex-end;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-header > div > *:nth-child(1), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-header > div > *:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-header > div > *:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-header > div > *:nth-child(1) {
+ flex: 1;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-header > div > *:nth-child(2), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-header > div > *:nth-child(2), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-header > div > *:nth-child(2), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-header > div > *:nth-child(2) {
+ text-align: right;
+ min-width: 100px;
+ margin-left: 3px;
+ word-break: break-all;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body {
+ word-wrap: break-word;
+ background-color: #15191e;
+ padding: 30px 24px;
+ border-radius: 0 0 5px 5px;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div > *, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div > *, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div > *, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div:not(:last-child), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div:not(:last-child), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div:not(:last-child), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div:not(:last-child) {
+ margin-bottom: 12px;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div > div, .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div > div, .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div > div {
+ vertical-align: text-top;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div > div:nth-child(1), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div > div:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div > div:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div > div:nth-child(1) {
+ text-transform: uppercase;
+ color: #78838e;
+ font-weight: 600;
+}
+
+.transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div > div:nth-child(2), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div > div:nth-child(2), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div > div:nth-child(2), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div > div:nth-child(2) {
+ line-height: initial;
+}
+
+.transaction-box > .ins-and-outs > div:nth-child(2) {
+ padding: 0 12px;
+}
+
+.transaction-box > .ins-and-outs > div:nth-child(2) > div {
+ height: 46px;
+}
+
+.transaction-box > .ins-and-outs > div:nth-child(2) > div > .helper {
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+
+.transaction-box > .ins-and-outs > div:nth-child(2) > div img {
+ vertical-align: middle;
+ width: auto;
+}
+
+.transaction-box > .footer {
+ height: 64px;
+}
+
+.transaction-box > .footer {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.transaction-box > .footer > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.transaction-box > .footer > div:nth-child(1) > span:nth-child(1) {
+ color: #78838e;
+ text-transform: uppercase;
+ margin-right: 36px;
+}
+
+.transaction-box > .footer > div:nth-child(2) {
+ width: 74px;
+}
+
+.transaction-box > .footer > div:nth-child(3) {
+ text-align: right;
+ text-transform: uppercase;
+ color: rgba(255, 187, 0, 1);
+}
+
+.transaction-box > .footer > div:nth-child(3) > span:nth-child(2) {
+ margin-left: 24px;
+ text-transform: none;
+}
+
+
+/* START FOOTER */
+.explorer-container > .footer {
+ width: 100%;
+ height: 216px;
+ line-height: 1.5;
+ background-color: #0C0D10;
+ margin-top: 100px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ border-top: 1px solid #22242C;
+}
+
+.explorer-container > .footer > .container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+}
+
+.footer_container_blockstream-logo {
+ width: 220px;
+ height: 93px;
+ background-image: url(img/blockstream-full-logo.svg);
+ background-size: 100%;
+}
+.theme-light .footer_container_blockstream-logo {
+ background-image: url(img/blockstream-full-logo-light.svg);
+}
+
+.language-selector {
+ color: #FFF;
+ background-color: #111316;
+ border: 1px solid #22242c;
+ border-radius: 4px;
+ padding: 3px 0 3px 5px;
+}
+
+.footer_container_content {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+}
+
+.footer_container_content_row {
+ display: flex;
+ flex-direction: row-reverse;
+ justify-content: space-between;
+ align-items: center;
+ width: 475px;
+}
+
+.footer_container_content_copyright {
+ color: rgba(169, 177, 182, 1);
+ font-size: 14px;
+ width: 100%;
+ text-align: right;
+ margin: 15px auto 0 auto;
+}
+
+.footer_container_content_row_social-media_container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ width: 150px;
+}
+
+.footer_container_content_row_social-media_item {
+ display: block;
+ width: 25px;
+}
+
+.footer_container_content_row_social-media_link {
+ cursor: pointer;
+}
+
+.footer_twitter_link {
+ display: block;
+ margin-right: 5px;
+}
+
+.footer_container_content_row_onion_container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+}
+
+
+.footer_container_content_row_onion_icon {
+ background-image: url("img/onion.svg");
+ background-repeat: no-repeat;
+ height: 32px;
+ width: 26px;
+}
+
+.footer_container_content_row_onion_link {
+ display: block;
+ font-size: 12px;
+ padding: 3px 3px 3px 10px;
+ color: #fff !important;
+ cursor: pointer;
+}
+
+.explorer-container > .footer > .container > *:nth-child(2) {
+ text-align: right;
+}
+
+.footer_container_content_onion-links {
+ border: 1px solid rgba(169, 177, 182, 1);
+ border-radius: 4px;
+ padding: 2px 20px;
+ /* margin: 0 auto; */
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+}
+
+img.footer_container_content_onion-links_icon {
+ width: auto !important;
+ height: 40px !important;
+}
+
+.footer_container_content_onion-links_row {
+ padding: 5px;
+ line-height: 1.5;
+ width: 100px;
+}
+
+.footer_container_content_onion-links_link {
+ color: rgba(0, 195, 255, 1) !important;
+}
+
+/* END FOOTER */
+
+.load-more-container {
+ margin-top: 24px;
+ text-align: center;
+}
+
+.load-more {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-touch-callout: none;
+ user-select: none;
+ cursor: pointer;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 400;
+ width: 140px !important;
+ height: 40px;
+ border: 1px solid #00ccff;
+ border-radius: 5px;
+ background-color: #22242c;
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+
+ display: table;
+ table-layout: fixed;
+ margin: 0 auto;
+}
+.load-more > * {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+.load-more > *:nth-child(1) {
+ text-align: center;
+}
+
+.load-more > div:nth-child(2) {
+ width: 30px;
+}
+
+.load-more > div:nth-child(2) img {
+ width: 30px;
+}
+
+.block-hash span, .block-stats-table a, .addr-stats-table a, .transaction-box .header a {
+ word-break: break-all;
+}
+
+
+.disabled {
+ opacity: 0.3;
+ pointer-events: none;
+}
+
+.mono {
+ font-family: Inconsolata;
+ line-height: 1.4 !important;
+}
+
+/* preload images. css hack via https://stackoverflow.com/a/14390213/865693 */
+body::after{
+ position:absolute; width:0; height:0; overflow:hidden; z-index:-1;
+ content: url(img/icons/plus.svg) url(img/icons/arrow_right_blu.png) url(img/icons/arrow_left_blu.png) url(img/icons/copy.png)
+ url(img/icons/menu-logo.svg) url(img/Loading.gif) url(img/icons/search.svg);
+}
+
+/* only show loading animation when we're loading for more than 0.5s,
+ * so that it doesn't flicker */
+
+.loading-delay {
+ animation: 0.3s showDelayed;
+ animation-fill-mode: forwards;
+ visibility: hidden;
+}
+@keyframes showDelayed {
+ 99% {
+ visibility: hidden;
+ }
+ 100% {
+ visibility: visible;
+ }
+}
+
+/* these should display in left-to-right, even with right-to-left languages */
+/* @noflip */
+.mono, .amount, .footer_container_content_copyright { direction: ltr }
+
+/* title bar for recent blocks */
+
+.title-bar-container {
+ width: 100%;
+ max-width: 1000px;
+ height: 70px;
+ margin: 0 auto;
+ padding-left: 27px;
+}
+
+.title-bar-recent-blocks {
+ display: inline-block;
+ height: 50px;
+ width: auto;
+ margin: 0 auto;
+ border-bottom: solid 3px rgba(0, 195, 255, 1);
+ height: 42px;
+}
+
+.title-bar-recent-blocks h1 {
+ font-size: 28px;
+}
+
+
+/* arrows */
+
+.arrow-prev {
+ background: url(img/icons/arrow_left_blu.png);
+}
+
+.arrow-next {
+ background: url(img/icons/arrow_right_blu.png);
+}
+
+.direction-arrow {
+ background: url(img/icons/arrow.svg);
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+/* flip arrow on RTL languages */
+[dir=rtl] .direction-arrow { transform: rotate(180deg) }
+
+.transaction-box .ins-and-outs .direction-arrow {
+ display: block;
+ justify-self: center;
+ width: 32px;
+ height: 33px;
+}
+
+.ins-and-outs {
+ position: relative !important;
+}
+
+.ins-and-outs_spacer {
+ width: 55px;
+}
+
+.direction-arrow-container {
+ display: flex;
+ width: auto;
+ position: absolute;
+ height: 100% !important;
+ flex-direction: column ;
+ justify-content: center ;
+ align-items: center ;
+ margin: 0;
+ padding: 0;
+}
+
+/* navbar changes */
+
+#navbar-menu {
+ position: relative;
+}
+.navbar-nav {
+ margin-left: 32px;
+ width: 330px;
+ display: flex;
+ justify-content: space-between;
+ margin-right: auto;
+}
+
+.nav-link {
+ color: #fff;
+ font-weight: 600;
+}
+
+.nav-link:hover {
+ color: rgba(0, 195, 255, 1) !important;
+}
+
+.navbar-dark .navbar-nav .active>.nav-link, .navbar-dark .navbar-nav .nav-link.active, .navbar-dark .navbar-nav .nav-link.show, .navbar-dark .navbar-nav .show>.nav-link {
+ color: rgba(0, 195, 255, 1) !important;
+}
+
+.nav-toggler {
+ position: absolute; /* relatively to #navbar-menu */
+ right: 0;
+ top: 4px;
+}
+
+.nav-bar_moon_icon {
+ background-image: url("img/icons/moon_dark.svg");
+ background-repeat: no-repeat;
+ width: 25px;
+ height: 27px;
+ cursor: pointer;
+}
+
+.navbar-dark .navbar-nav .nav-link {
+ color: #fff;
+}
+
+
+@media only screen and (max-width: 1000px) {
+ .blocks-table .blocks-table-row > div:nth-child(2) {
+ width: 250px;
+ }
+
+ .footer_container_blockstream-logo {
+ width: 200px;
+ height: 83px;
+ }
+}
+
+@media only screen and (max-width: 990px) {
+
+ .search-bar {
+ width: 560px;
+ height: 50px;
+ margin: 35px auto 0 auto;
+ }
+
+ .search-bar input {
+ height: 50px;
+ vertical-align: top;
+
+ }
+
+ .search-bar input.search-bar-input {
+ width: 500px;
+ font-size: 18px;
+ }
+
+ .page-search-bar {
+ margin: 5px auto 30px auto;
+ }
+
+ .nav-toggler {
+ position: initial;
+ }
+
+ .nav-bar_moon_icon {
+ margin-top: 5px;
+ }
+}
+
+
+@media only screen and (max-width: 850px) {
+
+ div.blocks-table-row.header {
+ display:none;
+ }
+
+ /* table row (transaction) */
+ .blocks-table-row {
+ margin: 0 0 1rem 0;
+ display: flex;
+ flex-direction: column;
+ height: auto !important;
+ padding: 20px;
+ }
+
+ .blocks-table-link-row {
+ margin-bottom: 20px;
+ }
+
+ .blocks-table-link-row:nth-child(odd) {
+ background: #22242c;
+ }
+
+ /* table row (transaction item) */
+ .blocks-table .blocks-table-row.block-data > * {
+ border: none;
+ position: relative;
+ padding-left: 0 !important;
+ padding: 10px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100% !important;
+ text-align: right;
+ /* border-top: 1px solid #22242C; */
+ }
+
+ .blocks-table-row {
+ /* Behave like a "row" */
+ display: block;
+ }
+
+ div.blocks-table-cell:before {
+ width: 45%;
+ padding-right: 10px;
+ font-weight: 600;
+ color: #78838e;
+ }
+
+ /*
+ Label the data
+ */
+ div.blocks-table-cell:before { content: attr(data-label); text-align: left; width: auto;}
+}
+
+
+/* mobile optimization - TRANSACTION - Matthias */
+@media only screen and (max-width: 850px) {
+ .transaction-box .header {
+ display: flex;
+ flex-direction: column-reverse;
+ height: 150px;
+ justify-content: space-evenly;
+ }
+
+ .transaction-box .ins-and-outs {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .transaction-box .ins-and-outs .direction-arrow-container {
+ width: 100% !important;
+ }
+
+ .transaction-box .ins-and-outs .direction-arrow {
+ transform: rotate(90deg);
+ }
+
+ .transaction-box .ins-and-outs > * {
+ padding: 20px 0;
+ }
+
+ .transaction-box > .footer > * {
+ display: block;
+ width: 100%;
+ }
+
+ .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) > .vin-body > div > div:nth-child(1), .transaction-box > .ins-and-outs > .vins > div:not(.vin-loading) .vout-body > div > div:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) > .vin-body > div > div:nth-child(1), .transaction-box > .ins-and-outs .vouts > div:not(.vin-loading) .vout-body > div > div:nth-child(1) {
+ text-transform: lowercase;
+ }
+
+ .footer_container_content_copyright {
+ font-size: 14px;
+ }
+
+ /* arrow */
+ .transaction-box > .ins-and-outs > div:nth-child(2) {
+ padding: 0 !important;
+ }
+
+.transaction-box .ins-and-outs .direction-arrow {
+ display: flex;
+ justify-self: center;
+}
+
+.ins-and-outs {
+ position: relative !important;
+}
+
+.ins-and-outs_spacer {
+ height: 20px;
+ width: 10px;
+}
+
+.direction-arrow-container {
+ width: 100%;
+ height: auto !important;
+ margin: 0;
+ padding: 0;
+}
+}
+
+@media only screen and (max-width: 825px) {
+
+ .explorer-container > .footer {
+ height: 330px;
+ }
+
+ .explorer-container > .footer > .container {
+ flex-direction: column;
+ }
+
+ .footer_container_content {
+ margin-top: 35px;
+ }
+
+ .search {
+ position: relative;
+ }
+
+ .search-bar {
+ width: 80%;
+ }
+
+ .search-bar input.search-bar-input {
+ width: 80%;
+ font-size: 18px;
+ }
+
+ .search-bar input.search-bar-submit {
+ float: right;
+ }
+
+ .footer_container_content_onion-links {
+ margin: 15px auto 0 auto;
+ }
+}
+
+@media only screen and (max-width: 600px) {
+ .address-qr-code {
+ display: block;
+ margin: 0 auto;
+ }
+}
+
+@media only screen and (max-width: 550px) {
+ .navbar .search-bar {
+ margin: 25px auto 5px auto;
+ width: 90% !important;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ }
+
+ .navbar .search-bar input.search-bar-input {
+ width: 100% !important;
+ }
+
+ .page-search-bar {
+ margin: 5px auto 30px auto;
+ }
+
+ .explorer-title-container h1 {
+ font-size: 30px;
+ }
+
+ .vin-body-row {
+ display: flex !important;
+ flex-direction: column !important;
+ margin: 5px 0;
+ }
+
+ .vin-body-row > .mono {
+ margin-top: 5px;
+ }
+
+ .vout-body-row {
+ display: flex !important;
+ flex-direction: column !important;
+ margin: 5px 0;
+ }
+
+ .vout-body-row > .mono {
+ margin-top: 5px;
+ }
+
+ .vout-header-container {
+ display: flex !important;
+ flex-direction: column !important;
+ justify-content: center;
+ align-items: flex-start;
+ }
+
+ .vout-header-container > * {
+ text-align: left !important;
+ margin: 0 !important;
+ padding: 3px 0;
+ }
+
+ .vin-header-container {
+ display: flex !important;
+ flex-direction: column !important;
+ justify-content: center;
+ align-items: flex-start;
+ }
+
+ .vin-header-container > * {
+ text-align: left !important;
+ margin: 0 !important;
+ padding: 3px 0;
+ }
+}
+
+@media only screen and (max-width: 450px) {
+ .explorer-title-container h1 {
+ font-size: 25px;
+ }
+
+ .explorer-title-container_logo {
+ height: 35px;
+ width: auto;
+ margin-right: 15px;
+ }
+}
+
+@media only screen and (max-width: 500px) {
+
+ .footer {
+ height: auto !important;
+ }
+
+ .footer_container_content_row {
+ flex-direction: column-reverse;
+ width: auto;
+ height: 160px;
+ margin: 0 auto;
+ }
+
+ .footer_container_content_row_onion_container {
+ margin-top: 10px;
+ }
+
+ .footer_container_content_row_onion_container {
+ margin: 0 auto;
+ }
+
+ .footer_container_content_copyright {
+ text-align: center;
+ margin: 15px auto;
+ }
+
+ .search-bar input.search-bar-input {
+ width: 76%;
+ }
+
+ .footer_container_content_onion-links {
+ flex-direction: column;
+ margin-top: 25px;
+ }
+
+ .footer_container_content_onion-links_row {
+ text-align: center;
+ }
+
+ .footer_container_blockstream-logo {
+ margin-top: 30px;
+ }
+}
+