on 851a9de help sign in
104 files changed+13358−11100
since splitsnapshots
unifiedsplit
.gitignore−1 .travis.yml−54 Cargo.lock+253−742 Cargo.toml+11−80 README.md+37−91 benches/benches.rs−118 build.sh+25−3 crates/js-api/Cargo.toml−22 crates/js-api/src/lib.rs−324 examples/counter/.gitignore+7 examples/counter/.travis.yml+11 examples/counter/LICENSE-APACHE+201 examples/counter/LICENSE-MIT+25 examples/counter/README.md+20−12 examples/counter/Cargo.toml → examples/counter/crate/Cargo.toml+7−8 examples/counter/crate/src/lib.rs+88 examples/counter/index.html−4 examples/counter/js/index.js+3 examples/counter/package-lock.json+5761 examples/counter/package.json+18 examples/counter/src/lib.rs−87 examples/counter/webpack.config.js+25 examples/game-of-life/Cargo.toml−29 examples/game-of-life/README.md−23 examples/game-of-life/index.html−44 examples/game-of-life/src/lib.rs−218 examples/hello-world/.bin/create-rust-webpack.js+38 examples/hello-world/.gitignore+7 examples/hello-world/.travis.yml+11 examples/hello-world/LICENSE-APACHE+201 examples/hello-world/LICENSE-MIT+25 examples/hello-world/README.md+20−12 examples/hello-world/Cargo.toml → examples/hello-world/crate/Cargo.toml+7−6 examples/hello-world/crate/src/lib.rs+45 examples/hello-world/index.html−4 examples/hello-world/js/index.js+3 examples/hello-world/package-lock.json+5761 examples/hello-world/package.json+21 examples/hello-world/src/lib.rs−42 examples/hello-world/webpack.config.js+25 examples/input-form/Cargo.toml−32 examples/input-form/README.md−22 examples/input-form/index.html−13 examples/input-form/src/lib.rs−81 examples/js-component/Cargo.toml−26 examples/js-component/README.md−23 examples/js-component/greeting.js−41 examples/js-component/index.html−14 examples/js-component/src/lib.rs−63 examples/moire/Cargo.toml−43 examples/moire/README.md−26 examples/moire/index.html−67 examples/moire/src/colors.rs−162 examples/moire/src/lib.rs−259 examples/sierpinski-triangle/Cargo.toml−28 examples/sierpinski-triangle/README.md−24 examples/sierpinski-triangle/ferris.png examples/sierpinski-triangle/index.html−69 examples/sierpinski-triangle/src/lib.rs−157 examples/todomvc/Cargo.toml−47 examples/todomvc/README.md−33 examples/todomvc/index.html−21 examples/todomvc/src/controller.rs−140 examples/todomvc/src/keys.rs−7 examples/todomvc/src/lib.rs−60 examples/todomvc/src/router.rs−68 examples/todomvc/src/todo.rs−229 examples/todomvc/src/todos.rs−300 examples/todomvc/src/utils.rs−32 examples/todomvc/src/visibility.rs−51 js/change-list-interpreter.js−377 js/change-list.js+180 js/package-lock.json+5 js/package.json+11 js/strace.js−80 publish.sh−11 src/builder.rs−1075 src/cached.rs−229 src/cached_set.rs−186 src/change_list.rs+235 src/change_list/emitter.rs−292 src/change_list/js.rs−40 src/change_list/mod.rs−353 src/change_list/strings.rs−66 src/change_list/traversal.rs−344 src/diff.rs−1125 src/events.rs−138 src/lib.rs+11−129 src/logging.rs−65 src/macros.rs+7 src/node.rs+66−243 src/render.rs−168 src/render_context.rs−104 src/strace.rs−22 src/vdom.rs+174−425 tests/web.rs+13 tests/web/cached.js−11 tests/web/cached.rs−289 tests/web/events.rs−250 tests/web/js_api.rs−153 tests/web/keyed.js−25 tests/web/keyed.rs−269 tests/web/main.rs−226 tests/web/render.rs−343
.gitignore−1
@@ -1,4 +1,3 @@
11/target
22**/*.rs.bk
33wasm-pack.log
4−/.vscode
.travis.ymldeleted−54
@@ -1,54 +0,0 @@
1−language: rust
2−sudo: false
3−
4−INSTALL_NODE_VIA_NVM: &INSTALL_NODE_VIA_NVM
5− |
6− rustup target add wasm32-unknown-unknown
7− curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
8− source ~/.nvm/nvm.sh
9− nvm install v10.5
10−
11−INSTALL_WASM_PPACK: &INSTALL_WASM_PACK
12− |
13− curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
14−
15−install:
16− - *INSTALL_NODE_VIA_NVM
17− - *INSTALL_WASM_PACK
18− - rustup target add wasm32-unknown-unknown
19−
20−matrix:
21− include:
22− - name: "build (stable)"
23− rust: stable
24− script: INSTALL=1 ./build.sh
25− - name: "build (beta)"
26− rust: beta
27− script: INSTALL=1 ./build.sh
28− - name: "headless browser tests (firefox)"
29− rust: stable
30− addons:
31− firefox: latest
32− script: wasm-pack test --firefox --headless -- --features xxx-unstable-internal-use-only
33− - name: "native tests"
34− rust: stable
35− install: echo "no install"
36− script: cargo test --all
37−
38− # TODO: A bug in `rustc` is making `js-sys` broken on nightly:
39− # https://github.com/rust-lang/rust/issues/69315
40− # - name: "build (nightly)"
41− # rust: nightly
42− # script: INSTALL=1 ./build.sh
43− # - name: "check native benches"
44− # rust: nightly
45− # install: echo "no install"
46− # script: cargo check --benches --features xxx-unstable-internal-use-only
47−
48− # TODO: `chromedriver` is complaining about ports or something. Temporarily
49− # disable in CI until we figure it out.
50− # - name: "headless browser tests (chrome)"
51− # rust: stable
52− # addons:
53− # chrome: stable
54− # script: wasm-pack test --chrome --headless -- --features xxx-unstable-internal-use-only
Cargo.lock+253−742
@@ -1,779 +1,332 @@
1−# This file is automatically @generated by Cargo.
2−# It is not intended for manual editing.
31[[package]]
4−name = "anyhow"
5−version = "1.0.25"
6−source = "registry+https://github.com/rust-lang/crates.io-index"
7−
8−[[package]]
9−name = "atty"
10−version = "0.2.13"
11−source = "registry+https://github.com/rust-lang/crates.io-index"
12−dependencies = [
13− "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
14− "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
15−]
16−
17−[[package]]
18−name = "autocfg"
19−version = "0.1.7"
20−source = "registry+https://github.com/rust-lang/crates.io-index"
21−
22−[[package]]
23−name = "bitflags"
24−version = "1.2.1"
25−source = "registry+https://github.com/rust-lang/crates.io-index"
26−
27−[[package]]
28−name = "bstr"
29−version = "0.2.8"
30−source = "registry+https://github.com/rust-lang/crates.io-index"
31−dependencies = [
32− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
33− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
34− "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
35− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
36−]
37−
38−[[package]]
39−name = "bumpalo"
40−version = "2.6.0"
41−source = "registry+https://github.com/rust-lang/crates.io-index"
42−
43−[[package]]
44−name = "byteorder"
45−version = "1.3.2"
46−source = "registry+https://github.com/rust-lang/crates.io-index"
47−
48−[[package]]
49−name = "cast"
50−version = "0.2.3"
2+name = "aho-corasick"
3+version = "0.6.9"
514source = "registry+https://github.com/rust-lang/crates.io-index"
525dependencies = [
53− "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
6+ "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
547]
558
569[[package]]
57−name = "cfg-if"
58−version = "0.1.10"
59−source = "registry+https://github.com/rust-lang/crates.io-index"
60−
61−[[package]]
62−name = "clap"
63−version = "2.33.0"
64−source = "registry+https://github.com/rust-lang/crates.io-index"
65−dependencies = [
66− "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
67− "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
68− "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
69−]
70−
71−[[package]]
72−name = "console_error_panic_hook"
73−version = "0.1.6"
74−source = "registry+https://github.com/rust-lang/crates.io-index"
75−dependencies = [
76− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
77− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
78−]
79−
80−[[package]]
81−name = "console_log"
82−version = "0.2.0"
83−source = "registry+https://github.com/rust-lang/crates.io-index"
84−dependencies = [
85− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
86− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
87−]
88−
89−[[package]]
90−name = "criterion"
91−version = "0.3.3"
92−source = "registry+https://github.com/rust-lang/crates.io-index"
93−dependencies = [
94− "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
95− "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
96− "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
97− "criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
98− "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
99− "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
100− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
101− "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
102− "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
103− "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
104− "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
105− "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
106− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
107− "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
108− "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
109− "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
110− "tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
111− "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
112−]
113−
114−[[package]]
115−name = "criterion-plot"
116−version = "0.4.3"
10+name = "atty"
11+version = "0.2.11"
11712source = "registry+https://github.com/rust-lang/crates.io-index"
11813dependencies = [
119− "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
120− "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
14+ "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)",
15+ "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
16+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
12117]
12218
12319[[package]]
124−name = "crossbeam-deque"
125−version = "0.7.2"
20+name = "backtrace"
21+version = "0.3.9"
12622source = "registry+https://github.com/rust-lang/crates.io-index"
12723dependencies = [
128− "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
129− "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
24+ "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
25+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
26+ "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)",
27+ "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
28+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
13029]
13130
13231[[package]]
133−name = "crossbeam-epoch"
134−version = "0.8.0"
32+name = "backtrace-sys"
33+version = "0.1.24"
13534source = "registry+https://github.com/rust-lang/crates.io-index"
13635dependencies = [
137− "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
138− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
139− "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
140− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
141− "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
142− "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
36+ "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
37+ "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)",
14338]
14439
14540[[package]]
146−name = "crossbeam-queue"
147−version = "0.2.0"
41+name = "bumpalo"
42+version = "1.1.0"
14843source = "registry+https://github.com/rust-lang/crates.io-index"
149−dependencies = [
150− "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
151−]
15244
15345[[package]]
154−name = "crossbeam-utils"
155−version = "0.7.0"
46+name = "cc"
47+version = "1.0.25"
15648source = "registry+https://github.com/rust-lang/crates.io-index"
157−dependencies = [
158− "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
159− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
160− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
161−]
16249
16350[[package]]
164−name = "csv"
165−version = "1.1.1"
51+name = "cfg-if"
52+version = "0.1.6"
16653source = "registry+https://github.com/rust-lang/crates.io-index"
167−dependencies = [
168− "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
169− "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
170− "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
171− "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
172− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
173−]
17454
17555[[package]]
176−name = "csv-core"
177−version = "0.1.6"
56+name = "console_error_panic_hook"
57+version = "0.1.5"
17858source = "registry+https://github.com/rust-lang/crates.io-index"
17959dependencies = [
180− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
60+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
61+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
18162]
18263
18364[[package]]
18465name = "dodrio"
185−version = "0.2.0"
186−dependencies = [
187− "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
188− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
189− "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
190− "criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
191− "dodrio-js-api 0.2.0",
192− "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
193− "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
194− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
195− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
196− "longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
197− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
198− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
199− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
200− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
201− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
202−]
203−
204−[[package]]
205−name = "dodrio-counter"
20666version = "0.1.0"
20767dependencies = [
208− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
209− "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
210− "dodrio 0.2.0",
211− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
212− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
213− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
214− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
68+ "bumpalo 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
69+ "js-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
70+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
71+ "wasm-bindgen-test 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
72+ "web-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
21573]
21674
21775[[package]]
218−name = "dodrio-game-of-life"
76+name = "dodrio-counter"
21977version = "0.1.0"
22078dependencies = [
221− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
222− "dodrio 0.2.0",
223− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
224− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
225− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
226− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
227− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
79+ "bumpalo 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
80+ "console_error_panic_hook 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
81+ "dodrio 0.1.0",
82+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
83+ "wasm-bindgen-test 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
84+ "web-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
22885]
22986
23087[[package]]
23188name = "dodrio-hello-world"
23289version = "0.1.0"
23390dependencies = [
234− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
235− "dodrio 0.2.0",
236− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
237− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
238− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
239−]
240−
241−[[package]]
242−name = "dodrio-input-form"
243−version = "0.1.0"
244−dependencies = [
245− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
246− "dodrio 0.2.0",
247− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
248− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
249− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
250−]
251−
252−[[package]]
253−name = "dodrio-js-api"
254−version = "0.2.0"
255−dependencies = [
256− "dodrio 0.2.0",
257− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
258− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
259− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
260− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
261−]
262−
263−[[package]]
264−name = "dodrio-js-component"
265−version = "0.1.0"
266−dependencies = [
267− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
268− "dodrio 0.2.0",
269− "dodrio-js-api 0.2.0",
270− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
271− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
272− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
273−]
274−
275−[[package]]
276−name = "dodrio-moire"
277−version = "0.1.0"
278−dependencies = [
279− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
280− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
281− "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
282− "dodrio 0.2.0",
283− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
284− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
285− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
286− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
287− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
288− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
289−]
290−
291−[[package]]
292−name = "dodrio-sierpinski"
293−version = "0.1.0"
294−dependencies = [
295− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
296− "dodrio 0.2.0",
297− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
298− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
299− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
300− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
301− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
302−]
303−
304−[[package]]
305−name = "dodrio-todomvc"
306−version = "0.1.0"
307−dependencies = [
308− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
309− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
310− "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
311− "dodrio 0.2.0",
312− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
313− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
314− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
315− "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
316− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
317− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
318− "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
319− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
320−]
321−
322−[[package]]
323−name = "either"
324−version = "1.5.3"
325−source = "registry+https://github.com/rust-lang/crates.io-index"
326−
327−[[package]]
328−name = "futures"
329−version = "0.3.5"
330−source = "registry+https://github.com/rust-lang/crates.io-index"
331−dependencies = [
332− "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
333− "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
334− "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
335− "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
336− "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
337− "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
338− "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
339−]
340−
341−[[package]]
342−name = "futures-channel"
343−version = "0.3.5"
344−source = "registry+https://github.com/rust-lang/crates.io-index"
345−dependencies = [
346− "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
347− "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
348−]
349−
350−[[package]]
351−name = "futures-core"
352−version = "0.3.5"
353−source = "registry+https://github.com/rust-lang/crates.io-index"
354−
355−[[package]]
356−name = "futures-executor"
357−version = "0.3.5"
358−source = "registry+https://github.com/rust-lang/crates.io-index"
359−dependencies = [
360− "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
361− "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
362− "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
363−]
364−
365−[[package]]
366−name = "futures-io"
367−version = "0.3.5"
368−source = "registry+https://github.com/rust-lang/crates.io-index"
369−
370−[[package]]
371−name = "futures-macro"
372−version = "0.3.5"
373−source = "registry+https://github.com/rust-lang/crates.io-index"
374−dependencies = [
375− "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
376− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
377− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
378− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
91+ "bumpalo 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
92+ "console_error_panic_hook 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
93+ "dodrio 0.1.0",
94+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
95+ "wasm-bindgen-test 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
96+ "web-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
37997]
38098
38199[[package]]
382−name = "futures-sink"
383−version = "0.3.5"
384−source = "registry+https://github.com/rust-lang/crates.io-index"
385−
386−[[package]]
387−name = "futures-task"
388−version = "0.3.5"
100+name = "env_logger"
101+version = "0.6.0"
389102source = "registry+https://github.com/rust-lang/crates.io-index"
390103dependencies = [
391− "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
104+ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
105+ "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
106+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
107+ "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
108+ "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
392109]
393110
394111[[package]]
395−name = "futures-util"
396−version = "0.3.5"
112+name = "failure"
113+version = "0.1.3"
397114source = "registry+https://github.com/rust-lang/crates.io-index"
398115dependencies = [
399− "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
400− "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
401− "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
402− "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
403− "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
404− "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
405− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
406− "pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
407− "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
408− "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
409− "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
410− "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
116+ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
117+ "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
411118]
412119
413120[[package]]
414−name = "fxhash"
415−version = "0.2.1"
121+name = "failure_derive"
122+version = "0.1.3"
416123source = "registry+https://github.com/rust-lang/crates.io-index"
417124dependencies = [
418− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
125+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
126+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
127+ "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
128+ "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
419129]
420130
421131[[package]]
422−name = "half"
423−version = "1.6.0"
132+name = "futures"
133+version = "0.1.25"
424134source = "registry+https://github.com/rust-lang/crates.io-index"
425135
426136[[package]]
427137name = "heck"
428−version = "0.3.1"
138+version = "0.3.0"
429139source = "registry+https://github.com/rust-lang/crates.io-index"
430140dependencies = [
431− "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
141+ "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
432142]
433143
434144[[package]]
435−name = "hermit-abi"
436−version = "0.1.3"
145+name = "humantime"
146+version = "1.2.0"
437147source = "registry+https://github.com/rust-lang/crates.io-index"
438148dependencies = [
439− "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
149+ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
440150]
441151
442−[[package]]
443−name = "itertools"
444−version = "0.9.0"
445−source = "registry+https://github.com/rust-lang/crates.io-index"
446−dependencies = [
447− "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
448−]
449−
450−[[package]]
451−name = "itoa"
452−version = "0.4.4"
453−source = "registry+https://github.com/rust-lang/crates.io-index"
454−
455152[[package]]
456153name = "js-sys"
457−version = "0.3.32"
154+version = "0.3.5"
458155source = "registry+https://github.com/rust-lang/crates.io-index"
459156dependencies = [
460− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
157+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
461158]
462159
463160[[package]]
464161name = "lazy_static"
465−version = "1.4.0"
162+version = "1.2.0"
466163source = "registry+https://github.com/rust-lang/crates.io-index"
467164
468165[[package]]
469166name = "libc"
470−version = "0.2.66"
167+version = "0.2.44"
471168source = "registry+https://github.com/rust-lang/crates.io-index"
472169
473170[[package]]
474171name = "log"
475−version = "0.4.11"
172+version = "0.4.6"
476173source = "registry+https://github.com/rust-lang/crates.io-index"
477174dependencies = [
478− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
175+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
479176]
480177
481−[[package]]
482−name = "longest-increasing-subsequence"
483−version = "0.1.0"
484−source = "registry+https://github.com/rust-lang/crates.io-index"
485−
486178[[package]]
487179name = "memchr"
488−version = "2.2.1"
489−source = "registry+https://github.com/rust-lang/crates.io-index"
490−dependencies = [
491− "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
492−]
493−
494−[[package]]
495−name = "memoffset"
496−version = "0.5.3"
180+version = "2.1.1"
497181source = "registry+https://github.com/rust-lang/crates.io-index"
498182dependencies = [
499− "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
500−]
501−
502−[[package]]
503−name = "nom"
504−version = "4.2.3"
505−source = "registry+https://github.com/rust-lang/crates.io-index"
506−dependencies = [
507− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
183+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
184+ "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)",
508185 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
509186]
510187
511188[[package]]
512−name = "num-traits"
513−version = "0.2.10"
514−source = "registry+https://github.com/rust-lang/crates.io-index"
515−dependencies = [
516− "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
517−]
518−
519−[[package]]
520−name = "num_cpus"
521−version = "1.11.1"
522−source = "registry+https://github.com/rust-lang/crates.io-index"
523−dependencies = [
524− "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
525− "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
526−]
527−
528−[[package]]
529−name = "once_cell"
530−version = "1.3.1"
531−source = "registry+https://github.com/rust-lang/crates.io-index"
532−
533−[[package]]
534−name = "oorandom"
535−version = "11.1.0"
536−source = "registry+https://github.com/rust-lang/crates.io-index"
537−
538−[[package]]
539−name = "pin-project"
540−version = "0.4.16"
541−source = "registry+https://github.com/rust-lang/crates.io-index"
542−dependencies = [
543− "pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
544−]
545−
546−[[package]]
547−name = "pin-project-internal"
548−version = "0.4.16"
549−source = "registry+https://github.com/rust-lang/crates.io-index"
550−dependencies = [
551− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
552− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
553− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
554−]
555−
556−[[package]]
557−name = "pin-utils"
558−version = "0.1.0"
559−source = "registry+https://github.com/rust-lang/crates.io-index"
560−
561−[[package]]
562−name = "plotters"
563−version = "0.2.12"
189+name = "nom"
190+version = "4.1.1"
564191source = "registry+https://github.com/rust-lang/crates.io-index"
565192dependencies = [
566− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
567− "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
568− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
569− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
193+ "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
570194]
571195
572196[[package]]
573−name = "proc-macro-hack"
574−version = "0.5.11"
197+name = "proc-macro2"
198+version = "0.4.24"
575199source = "registry+https://github.com/rust-lang/crates.io-index"
576200dependencies = [
577− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
578− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
579− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
201+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
580202]
581203
582204[[package]]
583−name = "proc-macro-nested"
584−version = "0.1.3"
585−source = "registry+https://github.com/rust-lang/crates.io-index"
586−
587−[[package]]
588−name = "proc-macro2"
589−version = "1.0.18"
205+name = "quick-error"
206+version = "1.2.2"
590207source = "registry+https://github.com/rust-lang/crates.io-index"
591−dependencies = [
592− "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
593−]
594208
595209[[package]]
596210name = "quote"
597−version = "1.0.2"
211+version = "0.6.10"
598212source = "registry+https://github.com/rust-lang/crates.io-index"
599213dependencies = [
600− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
214+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
601215]
602216
603217[[package]]
604−name = "rayon"
605−version = "1.3.0"
218+name = "redox_syscall"
219+version = "0.1.43"
606220source = "registry+https://github.com/rust-lang/crates.io-index"
607−dependencies = [
608− "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
609− "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
610− "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
611−]
612221
613222[[package]]
614−name = "rayon-core"
615−version = "1.7.0"
223+name = "redox_termios"
224+version = "0.1.1"
616225source = "registry+https://github.com/rust-lang/crates.io-index"
617226dependencies = [
618− "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
619− "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
620− "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
621− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
622− "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
227+ "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
623228]
624229
625230[[package]]
626231name = "regex"
627−version = "1.3.3"
628−source = "registry+https://github.com/rust-lang/crates.io-index"
629−dependencies = [
630− "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
631−]
632−
633−[[package]]
634−name = "regex-automata"
635−version = "0.1.8"
232+version = "1.0.6"
636233source = "registry+https://github.com/rust-lang/crates.io-index"
637234dependencies = [
638− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
235+ "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
236+ "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
237+ "regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
238+ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
239+ "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
639240]
640241
641242[[package]]
642243name = "regex-syntax"
643−version = "0.6.13"
644−source = "registry+https://github.com/rust-lang/crates.io-index"
645−
646−[[package]]
647−name = "rustc_version"
648−version = "0.2.3"
244+version = "0.6.3"
649245source = "registry+https://github.com/rust-lang/crates.io-index"
650246dependencies = [
651− "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
247+ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
652248]
653249
654250[[package]]
655−name = "ryu"
656−version = "1.0.2"
251+name = "rustc-demangle"
252+version = "0.1.9"
657253source = "registry+https://github.com/rust-lang/crates.io-index"
658254
659−[[package]]
660−name = "same-file"
661−version = "1.0.5"
662−source = "registry+https://github.com/rust-lang/crates.io-index"
663−dependencies = [
664− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
665−]
666−
667255[[package]]
668256name = "scoped-tls"
669−version = "1.0.0"
257+version = "0.1.2"
670258source = "registry+https://github.com/rust-lang/crates.io-index"
671259
672260[[package]]
673−name = "scopeguard"
674−version = "1.0.0"
261+name = "sourcefile"
262+version = "0.1.4"
675263source = "registry+https://github.com/rust-lang/crates.io-index"
676264
677265[[package]]
678−name = "semver"
679−version = "0.9.0"
266+name = "syn"
267+version = "0.15.22"
680268source = "registry+https://github.com/rust-lang/crates.io-index"
681269dependencies = [
682− "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
270+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
271+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
272+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
683273]
684274
685275[[package]]
686−name = "semver-parser"
687−version = "0.7.0"
688−source = "registry+https://github.com/rust-lang/crates.io-index"
689−
690−[[package]]
691−name = "serde"
692−version = "1.0.114"
276+name = "synstructure"
277+version = "0.10.1"
693278source = "registry+https://github.com/rust-lang/crates.io-index"
694279dependencies = [
695− "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
280+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
281+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
282+ "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
283+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
696284]
697285
698286[[package]]
699−name = "serde_cbor"
700−version = "0.11.1"
287+name = "termcolor"
288+version = "1.0.4"
701289source = "registry+https://github.com/rust-lang/crates.io-index"
702290dependencies = [
703− "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
704− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
291+ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
705292]
706293
707294[[package]]
708−name = "serde_derive"
709−version = "1.0.114"
295+name = "termion"
296+version = "1.5.1"
710297source = "registry+https://github.com/rust-lang/crates.io-index"
711298dependencies = [
712− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
713− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
714− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
299+ "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)",
300+ "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
301+ "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
715302]
716303
717304[[package]]
718−name = "serde_json"
719−version = "1.0.57"
305+name = "thread_local"
306+version = "0.3.6"
720307source = "registry+https://github.com/rust-lang/crates.io-index"
721308dependencies = [
722− "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
723− "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
724− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
309+ "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
725310]
726311
727312[[package]]
728−name = "slab"
729−version = "0.4.2"
730−source = "registry+https://github.com/rust-lang/crates.io-index"
731−
732−[[package]]
733−name = "sourcefile"
734−version = "0.1.4"
735−source = "registry+https://github.com/rust-lang/crates.io-index"
736−
737−[[package]]
738−name = "syn"
739−version = "1.0.33"
740−source = "registry+https://github.com/rust-lang/crates.io-index"
741−dependencies = [
742− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
743− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
744− "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
745−]
746−
747−[[package]]
748−name = "textwrap"
749−version = "0.11.0"
750−source = "registry+https://github.com/rust-lang/crates.io-index"
751−dependencies = [
752− "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
753−]
754−
755−[[package]]
756−name = "tinytemplate"
757−version = "1.1.0"
313+name = "ucd-util"
314+version = "0.1.3"
758315source = "registry+https://github.com/rust-lang/crates.io-index"
759−dependencies = [
760− "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
761− "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
762−]
763316
764317[[package]]
765318name = "unicode-segmentation"
766−version = "1.6.0"
319+version = "1.2.1"
767320source = "registry+https://github.com/rust-lang/crates.io-index"
768321
769322[[package]]
770−name = "unicode-width"
771−version = "0.1.6"
323+name = "unicode-xid"
324+version = "0.1.0"
772325source = "registry+https://github.com/rust-lang/crates.io-index"
773326
774327[[package]]
775−name = "unicode-xid"
776−version = "0.2.0"
328+name = "utf8-ranges"
329+version = "1.0.2"
777330source = "registry+https://github.com/rust-lang/crates.io-index"
778331
779332[[package]]
@@ -781,136 +334,126 @@ name = "version_check"
781334version = "0.1.5"
782335source = "registry+https://github.com/rust-lang/crates.io-index"
783336
784−[[package]]
785−name = "walkdir"
786−version = "2.3.1"
787−source = "registry+https://github.com/rust-lang/crates.io-index"
788−dependencies = [
789− "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
790− "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
791− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
792−]
793−
794337[[package]]
795338name = "wasm-bindgen"
796−version = "0.2.55"
339+version = "0.2.28"
797340source = "registry+https://github.com/rust-lang/crates.io-index"
798341dependencies = [
799− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
800− "wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
342+ "wasm-bindgen-macro 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
801343]
802344
803345[[package]]
804346name = "wasm-bindgen-backend"
805−version = "0.2.55"
347+version = "0.2.28"
806348source = "registry+https://github.com/rust-lang/crates.io-index"
807349dependencies = [
808− "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
809− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
810− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
811− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
812− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
813− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
814− "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
350+ "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
351+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
352+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
353+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
354+ "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
355+ "wasm-bindgen-shared 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
815356]
816357
817358[[package]]
818359name = "wasm-bindgen-futures"
819−version = "0.4.5"
360+version = "0.3.5"
820361source = "registry+https://github.com/rust-lang/crates.io-index"
821362dependencies = [
822− "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
823− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
824− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
825− "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
363+ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
364+ "js-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
365+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
826366]
827367
828368[[package]]
829369name = "wasm-bindgen-macro"
830−version = "0.2.55"
370+version = "0.2.28"
831371source = "registry+https://github.com/rust-lang/crates.io-index"
832372dependencies = [
833− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
834− "wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
373+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
374+ "wasm-bindgen-macro-support 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
835375]
836376
837377[[package]]
838378name = "wasm-bindgen-macro-support"
839−version = "0.2.55"
379+version = "0.2.28"
840380source = "registry+https://github.com/rust-lang/crates.io-index"
841381dependencies = [
842− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
843− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
844− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
845− "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
846− "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
382+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
383+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
384+ "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
385+ "wasm-bindgen-backend 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
386+ "wasm-bindgen-shared 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
847387]
848388
849389[[package]]
850390name = "wasm-bindgen-shared"
851−version = "0.2.55"
391+version = "0.2.28"
852392source = "registry+https://github.com/rust-lang/crates.io-index"
853393
854394[[package]]
855395name = "wasm-bindgen-test"
856−version = "0.3.5"
396+version = "0.2.28"
857397source = "registry+https://github.com/rust-lang/crates.io-index"
858398dependencies = [
859− "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
860− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
861− "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
862− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
863− "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
864− "wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
399+ "console_error_panic_hook 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
400+ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
401+ "js-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
402+ "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
403+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
404+ "wasm-bindgen-futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
405+ "wasm-bindgen-test-macro 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
865406]
866407
867408[[package]]
868409name = "wasm-bindgen-test-macro"
869−version = "0.3.5"
410+version = "0.2.28"
870411source = "registry+https://github.com/rust-lang/crates.io-index"
871412dependencies = [
872− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
873− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
413+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
414+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
874415]
875416
876417[[package]]
877418name = "wasm-bindgen-webidl"
878−version = "0.2.55"
419+version = "0.2.22"
879420source = "registry+https://github.com/rust-lang/crates.io-index"
880421dependencies = [
881− "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
882− "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
883− "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
884− "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
885− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
886− "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
887− "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
888− "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
422+ "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
423+ "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
424+ "heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
425+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
426+ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
427+ "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
428+ "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
429+ "wasm-bindgen-backend 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
430+ "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
889431]
890432
891433[[package]]
892434name = "web-sys"
893−version = "0.3.32"
435+version = "0.3.5"
894436source = "registry+https://github.com/rust-lang/crates.io-index"
895437dependencies = [
896− "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
897− "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
438+ "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
439+ "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
440+ "js-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
898441 "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
899− "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
900− "wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
442+ "wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)",
443+ "wasm-bindgen-webidl 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)",
901444]
902445
903446[[package]]
904447name = "weedle"
905−version = "0.10.0"
448+version = "0.8.0"
906449source = "registry+https://github.com/rust-lang/crates.io-index"
907450dependencies = [
908− "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
451+ "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
909452]
910453
911454[[package]]
912455name = "winapi"
913−version = "0.3.8"
456+version = "0.3.6"
914457source = "registry+https://github.com/rust-lang/crates.io-index"
915458dependencies = [
916459 "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -924,10 +467,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
924467
925468[[package]]
926469name = "winapi-util"
927−version = "0.1.2"
470+version = "0.1.1"
928471source = "registry+https://github.com/rust-lang/crates.io-index"
929472dependencies = [
930− "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
473+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
931474]
932475
933476[[package]]
@@ -935,101 +478,69 @@ name = "winapi-x86_64-pc-windows-gnu"
935478version = "0.4.0"
936479source = "registry+https://github.com/rust-lang/crates.io-index"
937480
481+[[package]]
482+name = "wincolor"
483+version = "1.0.1"
484+source = "registry+https://github.com/rust-lang/crates.io-index"
485+dependencies = [
486+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
487+ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
488+]
489+
938490[metadata]
939−"checksum anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14"
940−"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
941−"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
942−"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
943−"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245"
944−"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708"
945−"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
946−"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
947−"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
948−"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
949−"checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
950−"checksum console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494"
951−"checksum criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8"
952−"checksum criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d"
953−"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
954−"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
955−"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700"
956−"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
957−"checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d"
958−"checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c"
959−"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
960−"checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
961−"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
962−"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
963−"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
964−"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
965−"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
966−"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
967−"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
968−"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
969−"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
970−"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177"
971−"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
972−"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
973−"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
974−"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
975−"checksum js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "1c840fdb2167497b0bd0db43d6dfe61e91637fa72f9d061f8bd17ddc44ba6414"
976−"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
977−"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
978−"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
979−"checksum longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
980−"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
981−"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
982−"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
983−"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
984−"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
985−"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
986−"checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405"
987−"checksum pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1"
988−"checksum pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb"
989−"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
990−"checksum plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb"
991−"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
992−"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e"
993−"checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
994−"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
995−"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
996−"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
997−"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87"
998−"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9"
999−"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90"
1000−"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
1001−"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
1002−"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
1003−"checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
1004−"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
1005−"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
1006−"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
1007−"checksum serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
1008−"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
1009−"checksum serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
1010−"checksum serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)" = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c"
1011−"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
491+"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e"
492+"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
493+"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
494+"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
495+"checksum bumpalo 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc4fcb5e70b6c60b241977e660f32831396c2a8e2208fdb40277ad22f69e9644"
496+"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
497+"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
498+"checksum console_error_panic_hook 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6c5dd2c094474ec60a6acaf31780af270275e3153bafff2db5995b715295762e"
499+"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e"
500+"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7"
501+"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596"
502+"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
503+"checksum heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea04fa3ead4e05e51a7c806fc07271fdbde4e246a6c6d1efd52e72230b771b82"
504+"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
505+"checksum js-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9f476e674d55cc43a57dfd1d3986c7c305e41827ead21ff6373652804f728afe"
506+"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1"
507+"checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311"
508+"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
509+"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16"
510+"checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a"
511+"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09"
512+"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
513+"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c"
514+"checksum redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d"
515+"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
516+"checksum regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ee84f70c8c08744ea9641a731c7fadb475bf2ecc52d7f627feb833e0b3990467"
517+"checksum regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc557aac2b708fe84121caf261346cc2eed71978024337e42eb46b8a252ac6e"
518+"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395"
519+"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28"
1012520"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
1013−"checksum syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd"
1014−"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1015−"checksum tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f"
1016−"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
1017−"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
1018−"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
521+"checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7"
522+"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
523+"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
524+"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
525+"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
526+"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
527+"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
528+"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
529+"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"
1019530"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
1020−"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
1021−"checksum wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "29ae32af33bacd663a9a28241abecf01f2be64e6a185c6139b04f18b6385c5f2"
1022−"checksum wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "1845584bd3593442dc0de6e6d9f84454a59a057722f36f005e44665d6ab19d85"
1023−"checksum wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1458706aa1b8fe6898d19433c9f110d93a05d1f22ae6adf55810409a94df34b4"
1024−"checksum wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "87fcc747e6b73c93d22c947a6334644d22cfec5abd8b66238484dc2b0aeb9fe4"
1025−"checksum wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3dc4b3f2c4078c8c4a5f363b92fcf62604c5913cbd16c6ff5aaf0f74ec03f570"
1026−"checksum wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "ca0b78d6d3be8589b95d1d49cdc0794728ca734adf36d7c9f07e6459508bb53d"
1027−"checksum wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ed5833682054e941db0b7e2b4877b61bbaafd680608e40d268e070d34558b305"
1028−"checksum wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c5dcf70d21d0ff0ea5cdb97dba9a9b56ddad4a9bd10c8912eedc55618be022f"
1029−"checksum wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3126356474ceb717c8fb5549ae387c9fbf4872818454f4d87708bee997214bb5"
1030−"checksum web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "98405c0a2e722ed3db341b4c5b70eb9fe0021621f7350bab76df93b09b649bbf"
1031−"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164"
1032−"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
531+"checksum wasm-bindgen 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "dcefd48aa89f1319c61780595be0d378c5de5ccefd9d4e55c282aad4245a256c"
532+"checksum wasm-bindgen-backend 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "9b12e4c544f22adf78c7bc06fa605ac084566adc88bcbbe8857f0ceb0a12613a"
533+"checksum wasm-bindgen-futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e681f39732ced443d8ae6cc866ba00fdebc4482f6e0e7e96ef0c415681be83d0"
534+"checksum wasm-bindgen-macro 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c71b31dc194560c8696348975abc32ed134742c19a865601db3d7eb01a1c56"
535+"checksum wasm-bindgen-macro-support 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "890018bb4a49c4c977c66e0c6a5f633d82766f6e78a57e2bc8f611a22f72dc18"
536+"checksum wasm-bindgen-shared 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "0e38e79a1881e09015aaf8db197b04d97439e06da0f50a213608e93247f5ecfc"
537+"checksum wasm-bindgen-test 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "aae7dcae1123854b20b06288ea930153d6fa0fa75948aa0218fb50f81cac1a1d"
538+"checksum wasm-bindgen-test-macro 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "d7341ddac1babc9790b0647769f772d1dba217c9b16f204a55f82910853dca5b"
539+"checksum wasm-bindgen-webidl 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "0574f6b61287953b187391395e699d473f8ced87bcd6c1a413350a3e6af24ffd"
540+"checksum web-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c932243d3e8a9d7babf36e72631b08f6be19e33424ce942d04711f44ea5300c0"
541+"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044"
542+"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
1033543"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1034−"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
544+"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
1035545"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
546+"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
Cargo.toml+11−80
@@ -1,105 +1,36 @@
11[package]
2+name = "dodrio"
3+version = "0.1.0"
24authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3−categories = ["wasm", "web-programming"]
4−description = "A fast, bump-allocated virtual DOM library."
55edition = "2018"
6−keywords = ["virtual-dom", "vdom", "render", "bump"]
7−license = "MPL-2.0"
8−name = "dodrio"
9−readme = "./README.md"
10−repository = "https://github.com/fitzgen/dodrio"
11−version = "0.2.0"
12−
13−[badges]
14−travis-ci = { repository = "fitzgen/dodrio" }
15−
16−[lib]
17−path = "src/lib.rs"
18−bench = false
19−
20−[[test]]
21−name = "web"
22−path = "tests/web/main.rs"
23−required-features = ["xxx-unstable-internal-use-only"]
24−
25−[[bench]]
26−name = "benches"
27−path = "benches/benches.rs"
28−harness = false
29−required-features = ["xxx-unstable-internal-use-only"]
306
317[features]
32−# Don't rely on this feature! Its behavior will change and it could go away at
33−# any time. This enables monkey-patching DOM methods so that we wrap them and
34−# trace what DOM methods are used and how many times they are invoked when
35−# applying our emitted change lists to the physical DOM. This is useful for
36−# evaluating the differences between how Dodrio applies changes from virtual
37−# nodes to the physical DOM versus how other virtual DOM libraries do the same.
38−xxx-unstable-strace = []
39−
40−# Don't use this feature! It only exists for exposing otherwise-internal APIs
41−# for testing and benchmarks.
42−xxx-unstable-internal-use-only = []
8+default = []
439
4410[dependencies]
45−bumpalo = "2.6.0"
46−cfg-if = "0.1.10"
47−fxhash = "0.2.1"
48−js-sys = "0.3.32"
49−log = { version = "0.4.11", optional = true }
50−longest-increasing-subsequence = "0.1.0"
51−serde = { version = "1.0.114", optional = true }
52−wasm-bindgen = "0.2.55"
53−wasm-bindgen-futures = "0.4.5"
11+bumpalo = "1.0.2"
12+wasm-bindgen = "0.2.25"
13+js-sys = "0.3.2"
5414
5515[dependencies.web-sys]
56−version = "0.3.32"
16+version = "0.3.2"
5717features = [
5818 "console",
5919 "Document",
6020 "Element",
61− "Event",
6221 "Node",
6322 "Window",
6423]
6524
6625[dev-dependencies]
67−console_log = "0.2.0"
68−dodrio-js-api = { version = "=0.2.0", path = "./crates/js-api" }
69−futures = "0.3.5"
70−log = "0.4.11"
71−wasm-bindgen-test = "0.3.5"
72−
73−[dev-dependencies.web-sys]
74−version = "0.3.32"
75−features = [
76− "Attr",
77− "EventTarget",
78− "HtmlElement",
79− "NamedNodeMap",
80− "NodeList",
81−]
82−
83−[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
84−criterion = "0.3.3"
85−
86−[profile.bench]
87−debug = true
26+wasm-bindgen-test = "0.2"
8827
8928[profile.release]
90−incremental = false
91−lto = true
29+# Tell `rustc` to optimize for small code size.
9230opt-level = "s"
9331
9432[workspace]
9533members = [
96− "./crates/js-api",
97− "./examples/counter",
98− "./examples/game-of-life",
99− "./examples/hello-world",
100− "./examples/input-form",
101− "./examples/js-component",
102− "./examples/moire",
103− "./examples/sierpinski-triangle",
104− "./examples/todomvc",
34+ "./examples/counter/crate",
35+ "./examples/hello-world/crate",
10536]
README.md+37−91
@@ -1,108 +1,54 @@
1−# Dodrio
1+<meta charset="utf-8"/>
22
3−A fast, bump-allocated virtual DOM library for Rust and WebAssembly. Note that
4−Dodrio is still **experimental**.
3+# 🦀🕸️ `wasm-pack-template`
54
6−<!-- START doctoc generated TOC please keep comment here to allow auto update -->
7−<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
5+A template for kick starting a Rust and WebAssembly project using
6+[`wasm-pack`](https://github.com/rustwasm/wasm-pack).
87
8+This template is designed for compiling Rust libraries into WebAssembly and
9+publishing the resulting package to NPM.
910
10−- [Warning](#warning)
11−- [Examples](#examples)
12−- [Design](#design)
13− - [Bump Allocation](#bump-allocation)
14− - [Change List as Stack Machine](#change-list-as-stack-machine)
15− - [Library — Not Framework](#library--not-framework)
11+* Want to use the published NPM package in a Website? [Check out
12+ `create-wasm-app`.](https://github.com/rustwasm/create-wasm-app)
13+* Want to make a monorepo-style Website without publishing to NPM? Check out
14+ [`rust-webpack-template`](https://github.com/rustwasm/rust-webpack-template)
15+ and/or
16+ [`rust-parcel-template`](https://github.com/rustwasm/rust-parcel-template).
1617
17−<!-- END doctoc generated TOC please keep comment here to allow auto update -->
18+## 🔋 Batteries Included
1819
19−## Warning
20+* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating
21+ between WebAssembly and JavaScript.
22+* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook)
23+ for logging panic messages to the developer console.
24+* [`wee_alloc`](https://github.com/rustwasm/wee_alloc), an allocator optimized
25+ for small code size.
2026
21−I reiterate that Dodrio is in a very **experimental** state. It probably has
22−bugs, and no one is using it in production.
27+## 🚴 Usage
2328
24−## Examples
29+### 🐑 Use `cargo generate` to Clone this Template
2530
26−Here is the classic "Hello, World!" example:
31+[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate)
2732
28−```rust
29−struct Hello {
30− who: String,
31−}
32−
33−impl Render for Hello {
34− fn render<'a>(&self, cx: &mut RenderContext<a>) -> Node<'a> {
35− let who = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
36− div(cx)
37− .children([text(who.into_bump_str())])
38− .finish()
39− }
40−}
33+```
34+cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project
35+cd my-project
4136```
4237
43−More examples can be found in [the `examples`
44−directory](https://github.com/fitzgen/dodrio/tree/master/examples), including:
45−
46−* [`counter`](https://github.com/fitzgen/dodrio/tree/master/examples/counter):
47− Incrementing and decrementing a counter.
48−* [`input-form`](https://github.com/fitzgen/dodrio/tree/master/examples/input-form):
49− Reading an `<input>` and displaying its contents.
50−* [`todomvc`](https://github.com/fitzgen/dodrio/tree/master/examples/todomvc):
51− An implementation of the infamous TodoMVC application.
52−* [`moire`](https://github.com/fitzgen/dodrio/tree/master/examples/moire): The
53− WebRender Moiré patterns demo.
54−* [`game-of-life`](https://github.com/fitzgen/dodrio/tree/master/examples/game-of-life):
55− The Rust and WebAssembly book's Game of Life tutorial rendered with Dodrio
56− instead of to 2D canvas.
57−* [`js-component`](https://github.com/fitzgen/dodrio/tree/master/examples/js-component):
58− Defines a rendering component in JavaScript with the `dodrio-js-api` crate.
59−
60−## Cargo Features
61−
62−* `log` &mdash; enable debugging-oriented log messages with the `log` crate's
63− facade. You still have to initialize a logger for the messages to go anywhere,
64− such as [`console_log`](https://github.com/iamcodemaker/console_log).
65−
66−* `serde` &mdash; enable `serde::{Serialize, Deserialize}` implementations for
67− `Cached<R>` where `R` is serializable and deserializable.
68−
69−## Design
70−
71−### Bump Allocation
72−
73−Bump allocation is essentially the fastest method of allocating objects. It has
74−constraints, but works particularly well when allocation lifetimes match program
75−phases. And virtual DOMs are very phase oriented.
76−
77−Dodrio maintains three bump allocation arenas:
78−
79−1. The newest, most up-to-date virtual DOM. The virtual DOM nodes themselves and
80− any temporary containers needed while creating them are allocated into this
81− arena.
82−2. The previous virtual DOM. This reflects the current state of the physical
83− DOM.
84−3. The difference between (1) and (2). This is a sequence of DOM mutation
85− operations — colloquially known as a "change list" — which if applied to
86− the physical DOM, will make the physical DOM match (1).
87−
88−Rendering happens as follows:
38+### 🛠️ Build with `wasm-pack build`
8939
90−1. The application state is rendered into bump allocation arena (1).
91−2. (1) is diffed with (2) and the changes are emitted into (3).
92−3. JavaScript code applies the change list in (3) to the physical DOM.
93−4. (1) and (2) are swapped, double-buffering style, and the new (1) has its bump
94− allocation pointer reset, as does (3).
95−5. Rinse and repeat.
40+```
41+wasm-pack build
42+```
9643
97−### Change List as Stack Machine
44+### 🔬 Test in Headless Browsers with `wasm-pack test`
9845
99−The change list that represents the difference between how the physical DOM
100−currently looks, and our ideal virtual DOM state is encoded in a tiny stack
101−machine language. A stack machine works particularly well for applying DOM
102−diffs, a task that is essentially a tree traversal.
46+```
47+wasm-pack test --headless --firefox
48+```
10349
104−### Library — Not Framework
50+### 🎁 Publish to NPM with `wasm-pack publish`
10551
106−Dodrio is just a library. (And did I mention it is experimental?!) It is not a
107−full-fledged, complete, batteries-included solution for all frontend Web
108−development. And it never intends to become that either.
52+```
53+wasm-pack publish
54+```
benches/benches.rsdeleted−118
@@ -1,118 +0,0 @@
1−#![cfg(all(
2− feature = "xxx-unstable-internal-use-only",
3− not(target_arch = "wasm32")
4−))]
5−
6−use criterion::{
7− black_box, criterion_group, criterion_main, Benchmark, Criterion, ParameterizedBenchmark,
8− Throughput,
9−};
10−use dodrio::{
11− builder::*,
12− bumpalo::{self, Bump},
13− CachedSet, Node, Render, RenderContext, Vdom,
14−};
15−use std::cell::RefCell;
16−use std::convert::TryInto;
17−
18−/// The simplest thing we can render: `<div/>`.
19−struct Empty;
20−impl<'a> Render<'a> for Empty {
21− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
22− div(&cx).finish()
23− }
24−}
25−
26−/// Render a list that is `self.0` items long, has attributes and listeners.
27−struct SimpleList(usize);
28−impl<'a> Render<'a> for SimpleList {
29− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
30− let mut children = bumpalo::collections::Vec::with_capacity_in(self.0, cx.bump);
31− children.extend((0..self.0).map(|_| {
32− li(&cx)
33− .attr("class", "my-list-item")
34− .on("click", |_root, _vdom, _event| {
35− panic!("no one should call this")
36− })
37− .children([text("a list item")])
38− .finish()
39− }));
40− ol(&cx).attr("id", "my-list").children(children).finish()
41− }
42−}
43−
44−fn criterion_benchmark(c: &mut Criterion) {
45− c.bench(
46− "render",
47− Benchmark::new("empty", {
48− let mut bump = Bump::new();
49− let cached_set = RefCell::new(CachedSet::default());
50− let mut templates = Default::default();
51− move |b| {
52− bump.reset();
53− let mut cx = RenderContext::new(&bump, &cached_set, &mut templates);
54− b.iter(|| {
55− black_box(Empty.render(&mut cx));
56− })
57− }
58− }),
59− );
60−
61− c.bench(
62− "render",
63− ParameterizedBenchmark::new(
64− "list",
65− {
66− let mut bump = Bump::new();
67− let cached_set = RefCell::new(CachedSet::default());
68− let mut templates = Default::default();
69− move |b, n| {
70− bump.reset();
71− let mut cx = RenderContext::new(&bump, &cached_set, &mut templates);
72− b.iter(|| {
73− black_box(SimpleList(*n).render(&mut cx));
74− })
75− }
76− },
77− vec![100, 1_000, 10_000],
78− )
79− .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
80− );
81−
82− c.bench(
83− "render-and-diff",
84− ParameterizedBenchmark::new(
85− "same-list",
86− |b, &n| {
87− let vdom = Vdom::new(&(), SimpleList(n));
88− b.iter(|| {
89− vdom.immediately_render_and_diff(SimpleList(n));
90− black_box(&vdom);
91− })
92− },
93− vec![100, 1_000, 10_000],
94− )
95− .with_function("empty-to-full-list-to-empty", |b, &n| {
96− b.iter(|| {
97− let vdom = Vdom::new(&(), Empty);
98− vdom.immediately_render_and_diff(SimpleList(n));
99− black_box(&vdom);
100− vdom.immediately_render_and_diff(Empty);
101− black_box(&vdom);
102− });
103− })
104− .with_function("append-one-and-remove-one", |b, &n| {
105− let vdom = Vdom::new(&(), SimpleList(n));
106− b.iter(|| {
107− vdom.immediately_render_and_diff(SimpleList(n + 1));
108− black_box(&vdom);
109− vdom.immediately_render_and_diff(SimpleList(n));
110− black_box(&vdom);
111− })
112− })
113− .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
114− );
115−}
116−
117−criterion_group!(benches, criterion_benchmark);
118−criterion_main!(benches);
build.sh+25−3
@@ -3,9 +3,31 @@
33cd $(dirname $0)
44set -eux
55
6−cargo fmt --all || true
7−cargo build --all --target wasm32-unknown-unknown
6+INSTALL=${INSTALL:-""}
7+
8+function with_dir {
9+ pushd $1
10+ shift
11+ $@
12+ popd
13+}
14+
15+cargo fmt --all
16+cargo check --all --target wasm32-unknown-unknown
17+
18+if test "$INSTALL" != ""; then
19+ with_dir ./js npm link
20+fi
821
922for x in ./examples/*; do
10− wasm-pack build --target web "$x"
23+ wasm-pack build "$x/crate"
24+
25+ if test "$INSTALL" != ""; then
26+ with_dir "$x/crate/pkg" npm link
27+ with_dir "$x/crate/pkg" npm link dodrio
28+ with_dir "$x/js" npm install
29+ with_dir "$x/js" npm link dodrio
30+ fi
31+
32+ with_dir "$x/js/" npm run build
1133done
crates/js-api/Cargo.tomldeleted−22
@@ -1,22 +0,0 @@
1−[package]
2−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3−categories = ["wasm", "web-programming"]
4−description = "An API for implementing Dodrio rendering components with JavaScript"
5−edition = "2018"
6−keywords = ["javascript", "js", "vdom", "virtual-dom"]
7−license = "MPL-2.0"
8−name = "dodrio-js-api"
9−repository = "https://github.com/fitzgen/dodrio"
10−version = "0.2.0"
11−
12−[badges]
13−travis-ci = { repository = "fitzgen/dodrio" }
14−
15−[dependencies]
16−dodrio = { version = "=0.2.0", path = "../.." }
17−wasm-bindgen = "0.2.55"
18−js-sys = "0.3.32"
19−wasm-bindgen-futures = "0.4.5"
20−
21−[dev-dependencies]
22−wasm-bindgen-test = "0.3.5"
crates/js-api/src/lib.rsdeleted−324
@@ -1,324 +0,0 @@
1−/*!
2−
3−Implementing `dodrio` render components with JavaScript.
4−
5−This crate provides a Rust type `JsRender` that wraps a JavaScript object with a
6−`render` method. `JsRender` implements `dodrio::Render` by calling its wrapped
7−object's `render` method to get a JavaScript virtual DOM represented as a tree
8−of JavaScript values. It then converts this tree of JavaScript values into
9−`dodrio`'s normal bump-allocated virtual DOM representation.
10−
11−This is likely much slower than rendering virtual DOMs directly into the bump
12−allocator from the Rust side of things! Additionally, the shape of the
13−JavaScript virtual DOM is a bit funky and unidiomatic. Keep in mind that this
14−crate exists as a proof of concept for integrating JavaScript components into
15−`dodrio` -- which is itself *also* experimental -- and so this crate definitely
16−has some rough edges.
17−
18−# Example
19−
20−Here is a JavaScript implementation of a rendering component:
21−
22−```javascript
23−class Greeting {
24− constructor(who) {
25− this.who = who;
26− }
27−
28− render() {
29− return {
30− tagName: "p",
31− attributes: [
32− {
33− name: "class",
34− value: "greeting",
35− },
36− ],
37− listeners: [
38− {
39− on: "click",
40− callback: this.onClick.bind(this),
41− }
42− ],
43− children: [
44− "Hello, ",
45− {
46− tagName: "strong",
47− children: [this.who],
48− }
49− ],
50− };
51− }
52−
53− async onClick(vdom, event) {
54− // Be more excited!
55− this.who += "!";
56−
57− // Schedule a re-render.
58− await vdom.render();
59−
60− console.log("re-rendering finished!");
61− }
62−}
63−```
64−
65−And here is a Rust rendering component that internally uses the JS rendering
66−component:
67−
68−```rust,no_run
69−use dodrio::{Node, Render, RenderContext, Vdom};
70−use dodrio_js_api::JsRender;
71−use js_sys::Object;
72−use wasm_bindgen::prelude::*;
73−
74−#[wasm_bindgen]
75−extern {
76− // Import the JS `Greeting` class.
77− #[wasm_bindgen(extends = Object)]
78− #[derive(Clone, Debug)]
79− type Greeting;
80−
81− // And the `Greeting` class's constructor.
82− #[wasm_bindgen(constructor)]
83− fn new(who: &str) -> Greeting;
84−}
85−
86−/// This is our Rust rendering component that wraps the JS rendering component.
87−pub struct GreetingViaJs {
88− js: JsRender,
89−}
90−
91−impl GreetingViaJs {
92− /// Create a new `GreetingViaJs`, which will internally create a new JS
93− /// `Greeting`.
94− pub fn new(who: &str) -> GreetingViaJs {
95− let js = JsRender::new(Greeting::new(who));
96− GreetingViaJs { js }
97− }
98−}
99−
100−/// And finally the `Render` implementation! This adds a `<p>` element and some
101−/// text around whatever the inner JS `Greeting` component renders.
102−impl<'a> Render<'a> for GreetingViaJs {
103− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
104− use dodrio::builder::*;
105− p(&cx)
106− .children([
107− text("JavaScript says: "),
108− self.js.render(cx),
109− ])
110− .finish()
111− }
112−}
113−```
114−
115− */
116−#![deny(missing_docs, missing_debug_implementations)]
117−
118−use dodrio::{builder, bumpalo, Node, Render, RenderContext};
119−use js_sys::{Object, Promise, Reflect};
120−use wasm_bindgen::prelude::*;
121−use wasm_bindgen::JsCast;
122−
123−#[wasm_bindgen]
124−extern "C" {
125− /// A rendering component implemented in JavaScript.
126− ///
127− /// The rendering API is a bit duck-typed: any JS object with a `render`
128− /// method that returns a virtual DOM as JS values with the right shape
129− /// works.
130− ///
131− /// See `JsRender::new` for converting existing JS objects into `JsRender`s.
132− #[derive(Debug, Clone)]
133− pub type JsRender;
134− #[wasm_bindgen(structural, method)]
135− fn render(this: &JsRender) -> JsValue;
136−
137− #[wasm_bindgen(extends = Object)]
138− #[derive(Debug, Clone)]
139− type Element;
140− #[wasm_bindgen(structural, getter, method, js_name = tagName)]
141− fn tag_name(this: &Element) -> String;
142− #[wasm_bindgen(structural, getter, method)]
143− fn listeners(this: &Element) -> js_sys::Array;
144− #[wasm_bindgen(structural, getter, method)]
145− fn attributes(this: &Element) -> js_sys::Array;
146− #[wasm_bindgen(structural, getter, method)]
147− fn children(this: &Element) -> js_sys::Array;
148−
149− #[wasm_bindgen(extends = Object)]
150− #[derive(Debug, Clone)]
151− type Listener;
152− #[wasm_bindgen(structural, getter, method)]
153− fn on(this: &Listener) -> String;
154− #[wasm_bindgen(structural, getter, method)]
155− fn callback(this: &Listener) -> js_sys::Function;
156−
157− #[wasm_bindgen(extends = Object)]
158− #[derive(Debug, Clone)]
159− type Attribute;
160− #[wasm_bindgen(structural, getter, method)]
161− fn name(this: &Attribute) -> String;
162− #[wasm_bindgen(structural, getter, method)]
163− fn value(this: &Attribute) -> String;
164−}
165−
166−/// A weak handle to a virtual DOM.
167−///
168−/// This is essentially the same as `dodrio::VdomWeak`, but exposed to
169−/// JavaScript.
170−#[wasm_bindgen]
171−#[derive(Clone, Debug)]
172−pub struct VdomWeak {
173− inner: dodrio::VdomWeak,
174−}
175−
176−impl VdomWeak {
177− fn new(inner: dodrio::VdomWeak) -> VdomWeak {
178− VdomWeak { inner }
179− }
180−}
181−
182−#[wasm_bindgen]
183−impl VdomWeak {
184− /// Schedule re-rendering of the virtual DOM. A promise is returned that is
185− /// resolved after the rendering has happened.
186− pub fn render(&self) -> Promise {
187− let future = self.inner.render();
188−
189− wasm_bindgen_futures::future_to_promise(async move {
190− if let Err(e) = future.await {
191− let msg = e.to_string();
192− Err(js_sys::Error::new(&msg).into())
193− } else {
194− Ok(JsValue::null())
195− }
196− })
197− }
198−}
199−
200−impl JsRender {
201− /// Convert a `js_sys::Object` into a `JsRender`.
202− ///
203− /// The given object must have a `render` method that conforms to the
204− /// duck-typed virtual DOM interface which is described in the crate-level
205− /// documentation.
206− pub fn new<O>(object: O) -> JsRender
207− where
208− O: Into<Object>,
209− {
210− let object = object.into();
211− debug_assert!(
212− has_property(&object, "render"),
213− "JS rendering components must have a `render` method"
214− );
215− object.unchecked_into::<JsRender>()
216− }
217−}
218−
219−impl<'a> Render<'a> for JsRender {
220− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
221− create(cx, self.render())
222− }
223−}
224−
225−fn has_property(obj: &Object, property: &str) -> bool {
226− Reflect::has(obj, &property.into()).unwrap_or_default()
227−}
228−
229−fn create<'a>(cx: &mut RenderContext<'a>, val: JsValue) -> Node<'a> {
230− if let Some(txt) = val.as_string() {
231− let text = bumpalo::collections::String::from_str_in(&txt, cx.bump);
232− return builder::text(text.into_bump_str());
233− }
234−
235− let elem = val.unchecked_into::<Element>();
236− debug_assert!(
237− elem.is_instance_of::<Object>(),
238− "JS render methods should only return strings for text nodes or objects for elements"
239− );
240− debug_assert!(
241− has_property(&elem, "tagName"),
242− "element objects returned by JS render methods must have a `tagName` property"
243− );
244−
245− let tag_name = elem.tag_name();
246− let tag_name = bumpalo::collections::String::from_str_in(&tag_name, cx.bump);
247−
248− builder::ElementBuilder::new(cx.bump, tag_name.into_bump_str())
249− .listeners({
250− let mut listeners =
251− bumpalo::collections::Vec::new_in(cx.bump);
252− if has_property(&elem, "listeners") {
253− let js_listeners = elem.listeners();
254− listeners.reserve(js_listeners.length() as usize);
255− js_listeners.for_each(&mut |listener, _index, _array| {
256− let listener = listener.unchecked_into::<Listener>();
257− debug_assert!(
258− listener.is_instance_of::<Object>(),
259− "listeners returned by JS render methods must be objects"
260− );
261− debug_assert!(
262− has_property(&listener, "on"),
263− "listener objects returned by JS render methods must have an `on` property"
264− );
265− debug_assert!(
266− has_property(&listener, "callback"),
267− "listener objects returned by JS render methods must have an `callback` property"
268− );
269− let on = listener.on();
270− let on = bumpalo::collections::String::from_str_in(&on, cx.bump);
271− let callback = listener.callback();
272− let elem = elem.clone();
273− listeners.push(builder::on(cx.bump, on.into_bump_str(), move |_root, vdom, event| {
274− let vdom = VdomWeak::new(vdom);
275− let vdom: JsValue = vdom.into();
276− if let Err(e) = callback.call2(&elem, &vdom, &event) {
277− wasm_bindgen::throw_val(e);
278− }
279− }));
280− });
281− }
282− listeners
283− })
284− .attributes({
285− let mut attributes = bumpalo::collections::Vec::new_in(cx.bump);
286− if has_property(&elem, "attributes") {
287− let js_attributes = elem.attributes();
288− attributes.reserve(js_attributes.length() as usize);
289− js_attributes.for_each(&mut |attribute, _index, _array| {
290− let attribute = attribute.unchecked_into::<Attribute>();
291− debug_assert!(
292− attribute.is_instance_of::<Object>(),
293− "attributes returned by JS render methods must be objects"
294− );
295− debug_assert!(
296− has_property(&attribute, "name"),
297− "attribute objects returned by JS render methods must have a `name` property"
298− );
299− debug_assert!(
300− has_property(&attribute, "value"),
301− "attribute objects returned by JS render methods must have a `value` property"
302− );
303− let name = attribute.name();
304− let name = bumpalo::collections::String::from_str_in(&name, cx.bump);
305− let value = attribute.value();
306− let value = bumpalo::collections::String::from_str_in(&value, cx.bump);
307− attributes.push(builder::attr(name.into_bump_str(), value.into_bump_str()));
308− });
309− }
310− attributes
311− })
312− .children({
313− let mut children = bumpalo::collections::Vec::new_in(cx.bump);
314− if has_property(&elem, "children") {
315− let js_children = elem.children();
316− children.reserve(js_children.length() as usize);
317− js_children.for_each(&mut |child, _index, _array| {
318− children.push(create(cx, child));
319− });
320− }
321− children
322− })
323− .finish()
324−}
examples/counter/.gitignorenew file+7
@@ -0,0 +1,7 @@
1+dist
2+node_modules
3+crate/bin
4+crate/pkg
5+crate/target
6+crate/wasm-pack.log
7+crate/Cargo.lock
examples/counter/.travis.ymlnew file+11
@@ -0,0 +1,11 @@
1+language: rust
2+
3+install:
4+ - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
5+ - source ~/.nvm/nvm.sh
6+ - nvm install v10.5
7+ - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
8+
9+script:
10+ - npm install
11+ - npm run build
examples/counter/LICENSE-APACHEnew file+201
@@ -0,0 +1,201 @@
1+ Apache License
2+ Version 2.0, January 2004
3+ http://www.apache.org/licenses/
4+
5+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6+
7+1. Definitions.
8+
9+ "License" shall mean the terms and conditions for use, reproduction,
10+ and distribution as defined by Sections 1 through 9 of this document.
11+
12+ "Licensor" shall mean the copyright owner or entity authorized by
13+ the copyright owner that is granting the License.
14+
15+ "Legal Entity" shall mean the union of the acting entity and all
16+ other entities that control, are controlled by, or are under common
17+ control with that entity. For the purposes of this definition,
18+ "control" means (i) the power, direct or indirect, to cause the
19+ direction or management of such entity, whether by contract or
20+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21+ outstanding shares, or (iii) beneficial ownership of such entity.
22+
23+ "You" (or "Your") shall mean an individual or Legal Entity
24+ exercising permissions granted by this License.
25+
26+ "Source" form shall mean the preferred form for making modifications,
27+ including but not limited to software source code, documentation
28+ source, and configuration files.
29+
30+ "Object" form shall mean any form resulting from mechanical
31+ transformation or translation of a Source form, including but
32+ not limited to compiled object code, generated documentation,
33+ and conversions to other media types.
34+
35+ "Work" shall mean the work of authorship, whether in Source or
36+ Object form, made available under the License, as indicated by a
37+ copyright notice that is included in or attached to the work
38+ (an example is provided in the Appendix below).
39+
40+ "Derivative Works" shall mean any work, whether in Source or Object
41+ form, that is based on (or derived from) the Work and for which the
42+ editorial revisions, annotations, elaborations, or other modifications
43+ represent, as a whole, an original work of authorship. For the purposes
44+ of this License, Derivative Works shall not include works that remain
45+ separable from, or merely link (or bind by name) to the interfaces of,
46+ the Work and Derivative Works thereof.
47+
48+ "Contribution" shall mean any work of authorship, including
49+ the original version of the Work and any modifications or additions
50+ to that Work or Derivative Works thereof, that is intentionally
51+ submitted to Licensor for inclusion in the Work by the copyright owner
52+ or by an individual or Legal Entity authorized to submit on behalf of
53+ the copyright owner. For the purposes of this definition, "submitted"
54+ means any form of electronic, verbal, or written communication sent
55+ to the Licensor or its representatives, including but not limited to
56+ communication on electronic mailing lists, source code control systems,
57+ and issue tracking systems that are managed by, or on behalf of, the
58+ Licensor for the purpose of discussing and improving the Work, but
59+ excluding communication that is conspicuously marked or otherwise
60+ designated in writing by the copyright owner as "Not a Contribution."
61+
62+ "Contributor" shall mean Licensor and any individual or Legal Entity
63+ on behalf of whom a Contribution has been received by Licensor and
64+ subsequently incorporated within the Work.
65+
66+2. Grant of Copyright License. Subject to the terms and conditions of
67+ this License, each Contributor hereby grants to You a perpetual,
68+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69+ copyright license to reproduce, prepare Derivative Works of,
70+ publicly display, publicly perform, sublicense, and distribute the
71+ Work and such Derivative Works in Source or Object form.
72+
73+3. Grant of Patent License. Subject to the terms and conditions of
74+ this License, each Contributor hereby grants to You a perpetual,
75+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76+ (except as stated in this section) patent license to make, have made,
77+ use, offer to sell, sell, import, and otherwise transfer the Work,
78+ where such license applies only to those patent claims licensable
79+ by such Contributor that are necessarily infringed by their
80+ Contribution(s) alone or by combination of their Contribution(s)
81+ with the Work to which such Contribution(s) was submitted. If You
82+ institute patent litigation against any entity (including a
83+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84+ or a Contribution incorporated within the Work constitutes direct
85+ or contributory patent infringement, then any patent licenses
86+ granted to You under this License for that Work shall terminate
87+ as of the date such litigation is filed.
88+
89+4. Redistribution. You may reproduce and distribute copies of the
90+ Work or Derivative Works thereof in any medium, with or without
91+ modifications, and in Source or Object form, provided that You
92+ meet the following conditions:
93+
94+ (a) You must give any other recipients of the Work or
95+ Derivative Works a copy of this License; and
96+
97+ (b) You must cause any modified files to carry prominent notices
98+ stating that You changed the files; and
99+
100+ (c) You must retain, in the Source form of any Derivative Works
101+ that You distribute, all copyright, patent, trademark, and
102+ attribution notices from the Source form of the Work,
103+ excluding those notices that do not pertain to any part of
104+ the Derivative Works; and
105+
106+ (d) If the Work includes a "NOTICE" text file as part of its
107+ distribution, then any Derivative Works that You distribute must
108+ include a readable copy of the attribution notices contained
109+ within such NOTICE file, excluding those notices that do not
110+ pertain to any part of the Derivative Works, in at least one
111+ of the following places: within a NOTICE text file distributed
112+ as part of the Derivative Works; within the Source form or
113+ documentation, if provided along with the Derivative Works; or,
114+ within a display generated by the Derivative Works, if and
115+ wherever such third-party notices normally appear. The contents
116+ of the NOTICE file are for informational purposes only and
117+ do not modify the License. You may add Your own attribution
118+ notices within Derivative Works that You distribute, alongside
119+ or as an addendum to the NOTICE text from the Work, provided
120+ that such additional attribution notices cannot be construed
121+ as modifying the License.
122+
123+ You may add Your own copyright statement to Your modifications and
124+ may provide additional or different license terms and conditions
125+ for use, reproduction, or distribution of Your modifications, or
126+ for any such Derivative Works as a whole, provided Your use,
127+ reproduction, and distribution of the Work otherwise complies with
128+ the conditions stated in this License.
129+
130+5. Submission of Contributions. Unless You explicitly state otherwise,
131+ any Contribution intentionally submitted for inclusion in the Work
132+ by You to the Licensor shall be under the terms and conditions of
133+ this License, without any additional terms or conditions.
134+ Notwithstanding the above, nothing herein shall supersede or modify
135+ the terms of any separate license agreement you may have executed
136+ with Licensor regarding such Contributions.
137+
138+6. Trademarks. This License does not grant permission to use the trade
139+ names, trademarks, service marks, or product names of the Licensor,
140+ except as required for reasonable and customary use in describing the
141+ origin of the Work and reproducing the content of the NOTICE file.
142+
143+7. Disclaimer of Warranty. Unless required by applicable law or
144+ agreed to in writing, Licensor provides the Work (and each
145+ Contributor provides its Contributions) on an "AS IS" BASIS,
146+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147+ implied, including, without limitation, any warranties or conditions
148+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149+ PARTICULAR PURPOSE. You are solely responsible for determining the
150+ appropriateness of using or redistributing the Work and assume any
151+ risks associated with Your exercise of permissions under this License.
152+
153+8. Limitation of Liability. In no event and under no legal theory,
154+ whether in tort (including negligence), contract, or otherwise,
155+ unless required by applicable law (such as deliberate and grossly
156+ negligent acts) or agreed to in writing, shall any Contributor be
157+ liable to You for damages, including any direct, indirect, special,
158+ incidental, or consequential damages of any character arising as a
159+ result of this License or out of the use or inability to use the
160+ Work (including but not limited to damages for loss of goodwill,
161+ work stoppage, computer failure or malfunction, or any and all
162+ other commercial damages or losses), even if such Contributor
163+ has been advised of the possibility of such damages.
164+
165+9. Accepting Warranty or Additional Liability. While redistributing
166+ the Work or Derivative Works thereof, You may choose to offer,
167+ and charge a fee for, acceptance of support, warranty, indemnity,
168+ or other liability obligations and/or rights consistent with this
169+ License. However, in accepting such obligations, You may act only
170+ on Your own behalf and on Your sole responsibility, not on behalf
171+ of any other Contributor, and only if You agree to indemnify,
172+ defend, and hold each Contributor harmless for any liability
173+ incurred by, or claims asserted against, such Contributor by reason
174+ of your accepting any such warranty or additional liability.
175+
176+END OF TERMS AND CONDITIONS
177+
178+APPENDIX: How to apply the Apache License to your work.
179+
180+ To apply the Apache License to your work, attach the following
181+ boilerplate notice, with the fields enclosed by brackets "[]"
182+ replaced with your own identifying information. (Don't include
183+ the brackets!) The text should be enclosed in the appropriate
184+ comment syntax for the file format. We also recommend that a
185+ file or class name and description of purpose be included on the
186+ same "printed page" as the copyright notice for easier
187+ identification within third-party archives.
188+
189+Copyright [yyyy] [name of copyright owner]
190+
191+Licensed under the Apache License, Version 2.0 (the "License");
192+you may not use this file except in compliance with the License.
193+You may obtain a copy of the License at
194+
195+ http://www.apache.org/licenses/LICENSE-2.0
196+
197+Unless required by applicable law or agreed to in writing, software
198+distributed under the License is distributed on an "AS IS" BASIS,
199+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200+See the License for the specific language governing permissions and
201+limitations under the License.
examples/counter/LICENSE-MITnew file+25
@@ -0,0 +1,25 @@
1+Copyright (c) 2015 The Rust Project Developers
2+
3+Permission is hereby granted, free of charge, to any
4+person obtaining a copy of this software and associated
5+documentation files (the "Software"), to deal in the
6+Software without restriction, including without
7+limitation the rights to use, copy, modify, merge,
8+publish, distribute, sublicense, and/or sell copies of
9+the Software, and to permit persons to whom the Software
10+is furnished to do so, subject to the following
11+conditions:
12+
13+The above copyright notice and this permission notice
14+shall be included in all copies or substantial portions
15+of the Software.
16+
17+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25+DEALINGS IN THE SOFTWARE.
examples/counter/README.md+20−12
@@ -1,21 +1,29 @@
1−# Counter
1+# 🦀🕸 `rust-webpack-template`
22
3−A counter that can be incremented and decremented.
3+> **Kickstart your Rust, WebAssembly, and Webpack project!**
44
5−## Source
5+This template is designed for creating monorepo-style Web applications with
6+Rust-generated WebAssembly and Webpack without publishing your wasm to NPM.
67
7−See `src/lib.rs`.
8+* Want to create and publish NPM packages with Rust and WebAssembly? [Check out
9+ `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)
810
9−## Build
11+## 🔋 Batteries Included
1012
11−```
12−wasm-pack build --target web
13−```
13+This template comes pre-configured with all the boilerplate for compiling Rust
14+to WebAssembly and hooking into a Webpack build pipeline.
1415
15−## Serve
16+* `npm run start` -- Serve the project locally for development at
17+ `http://localhost:8080`.
1618
17−Use any HTTP server, for example:
19+* `npm run build` -- Bundle the project (in production mode).
1820
19−```
20−python -m SimpleHTTPServer
21+## 🚴 Using This Template
22+
23+First, [install `wasm-pack`!](https://rustwasm.github.io/wasm-pack/installer/)
24+
25+Then, use `npm init` to clone this template:
26+
27+```sh
28+npm init rust-webpack my-app
2129```
examples/counter/Cargo.toml → examples/counter/crate/Cargo.tomlrenamed+7−8
@@ -5,19 +5,18 @@ authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
55edition = "2018"
66
77[lib]
8−crate-type = ["cdylib"]
8+crate-type = ["cdylib", "rlib"]
99
1010[features]
1111
1212[dependencies]
13−console_error_panic_hook = "0.1.6"
14−console_log = "0.2.0"
15−dodrio = { path = "../.." }
16−log = "0.4.11"
17−wasm-bindgen = "0.2.55"
13+bumpalo = "1.0.2"
14+dodrio = { path = "../../.." }
15+wasm-bindgen = "0.2"
16+console_error_panic_hook = "0.1.1"
1817
1918[dependencies.web-sys]
20−version = "0.3.32"
19+version = "0.3.2"
2120features = [
2221 "console",
2322 "Document",
@@ -30,4 +29,4 @@ features = [
3029]
3130
3231[dev-dependencies]
33−wasm-bindgen-test = "0.3.5"
32+wasm-bindgen-test = "0.2"
examples/counter/crate/src/lib.rsnew file+88
@@ -0,0 +1,88 @@
1+use bumpalo::Bump;
2+use dodrio::{Attribute, Node, Render};
3+use wasm_bindgen::prelude::*;
4+use wasm_bindgen::JsCast;
5+
6+struct Counter {
7+ val: isize,
8+}
9+
10+impl Counter {
11+ fn new() -> Counter {
12+ Counter { val: 0 }
13+ }
14+
15+ fn increment(&mut self) {
16+ self.val += 1;
17+ }
18+
19+ fn decrement(&mut self) {
20+ self.val -= 1;
21+ }
22+}
23+
24+impl Render for Counter {
25+ fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> dodrio::node::NodeRef<'bump>
26+ where
27+ 'a: 'bump,
28+ {
29+ let val = bumpalo::format!(in bump, "{}", self.val);
30+
31+ let increment = bump.alloc(Node::element(
32+ "button",
33+ [Attribute {
34+ name: "data-action",
35+ value: "increment",
36+ }],
37+ [bump.alloc(Node::text("+")).into()],
38+ ));
39+
40+ let decrement = bump.alloc(Node::element(
41+ "button",
42+ [Attribute {
43+ name: "data-action",
44+ value: "decrement",
45+ }],
46+ [bump.alloc(Node::text("-")).into()],
47+ ));
48+
49+ bump.alloc(Node::element(
50+ "div",
51+ [],
52+ [
53+ increment.into(),
54+ bump.alloc(Node::text(val.into_bump_str())).into(),
55+ decrement.into(),
56+ ],
57+ ))
58+ .into()
59+ }
60+}
61+
62+#[wasm_bindgen]
63+pub fn run() {
64+ console_error_panic_hook::set_once();
65+
66+ let window = web_sys::window().unwrap();
67+ let document = window.document().unwrap();
68+ let body = document.body().unwrap();
69+
70+ let mut counter = Counter::new();
71+ let mut vdom = dodrio::Vdom::new(&body, &counter);
72+
73+ let on_click = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
74+ match event
75+ .target()
76+ .and_then(|t| t.dyn_into::<web_sys::Element>().ok())
77+ .and_then(|e| e.get_attribute("data-action"))
78+ {
79+ Some(ref s) if s == "increment" => counter.increment(),
80+ Some(ref s) if s == "decrement" => counter.decrement(),
81+ _ => {}
82+ }
83+ vdom.render(&counter);
84+ }) as Box<FnMut(_)>);
85+
86+ let _ = body.add_event_listener_with_callback("click", on_click.as_ref().unchecked_ref());
87+ on_click.forget();
88+}
examples/counter/index.html−4
@@ -5,9 +5,5 @@
55 <title>Counter</title>
66 </head>
77 <body>
8− <script type="module">
9− import init from "./pkg/dodrio_counter.js";
10− init("./pkg/dodrio_counter_bg.wasm");
11− </script>
128 </body>
139</html>
examples/counter/js/index.jsnew file+3
@@ -0,0 +1,3 @@
1+import("../crate/pkg").then(module => {
2+ module.run();
3+});
examples/counter/package-lock.jsonnew file+5761
@@ -0,0 +1,5761 @@
1+{
2+ "name": "create-rust-webpack",
3+ "version": "0.1.5",
4+ "lockfileVersion": 1,
5+ "requires": true,
6+ "dependencies": {
7+ "@wasm-tool/wasm-pack-plugin": {
8+ "version": "0.1.5",
9+ "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.1.5.tgz",
10+ "integrity": "sha512-c/M5A+7Y7UcyxxAa0WltyR3M4f1a//omC7IZ/EcVLRfQURnvCLs1QB+zaXvsuCDn6jJr3x4spps20FwQcSqZtw==",
11+ "dev": true,
12+ "requires": {
13+ "chalk": "^2.4.1",
14+ "command-exists": "^1.2.7",
15+ "glob": "^7.1.2",
16+ "watchpack": "^1.6.0"
17+ }
18+ },
19+ "@webassemblyjs/ast": {
20+ "version": "1.7.11",
21+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
22+ "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
23+ "dev": true,
24+ "requires": {
25+ "@webassemblyjs/helper-module-context": "1.7.11",
26+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
27+ "@webassemblyjs/wast-parser": "1.7.11"
28+ }
29+ },
30+ "@webassemblyjs/floating-point-hex-parser": {
31+ "version": "1.7.11",
32+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
33+ "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
34+ "dev": true
35+ },
36+ "@webassemblyjs/helper-api-error": {
37+ "version": "1.7.11",
38+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
39+ "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
40+ "dev": true
41+ },
42+ "@webassemblyjs/helper-buffer": {
43+ "version": "1.7.11",
44+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
45+ "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
46+ "dev": true
47+ },
48+ "@webassemblyjs/helper-code-frame": {
49+ "version": "1.7.11",
50+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
51+ "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
52+ "dev": true,
53+ "requires": {
54+ "@webassemblyjs/wast-printer": "1.7.11"
55+ }
56+ },
57+ "@webassemblyjs/helper-fsm": {
58+ "version": "1.7.11",
59+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
60+ "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
61+ "dev": true
62+ },
63+ "@webassemblyjs/helper-module-context": {
64+ "version": "1.7.11",
65+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
66+ "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
67+ "dev": true
68+ },
69+ "@webassemblyjs/helper-wasm-bytecode": {
70+ "version": "1.7.11",
71+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
72+ "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
73+ "dev": true
74+ },
75+ "@webassemblyjs/helper-wasm-section": {
76+ "version": "1.7.11",
77+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
78+ "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
79+ "dev": true,
80+ "requires": {
81+ "@webassemblyjs/ast": "1.7.11",
82+ "@webassemblyjs/helper-buffer": "1.7.11",
83+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
84+ "@webassemblyjs/wasm-gen": "1.7.11"
85+ }
86+ },
87+ "@webassemblyjs/ieee754": {
88+ "version": "1.7.11",
89+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
90+ "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
91+ "dev": true,
92+ "requires": {
93+ "@xtuc/ieee754": "^1.2.0"
94+ }
95+ },
96+ "@webassemblyjs/leb128": {
97+ "version": "1.7.11",
98+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
99+ "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
100+ "dev": true,
101+ "requires": {
102+ "@xtuc/long": "4.2.1"
103+ }
104+ },
105+ "@webassemblyjs/utf8": {
106+ "version": "1.7.11",
107+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
108+ "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
109+ "dev": true
110+ },
111+ "@webassemblyjs/wasm-edit": {
112+ "version": "1.7.11",
113+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
114+ "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
115+ "dev": true,
116+ "requires": {
117+ "@webassemblyjs/ast": "1.7.11",
118+ "@webassemblyjs/helper-buffer": "1.7.11",
119+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
120+ "@webassemblyjs/helper-wasm-section": "1.7.11",
121+ "@webassemblyjs/wasm-gen": "1.7.11",
122+ "@webassemblyjs/wasm-opt": "1.7.11",
123+ "@webassemblyjs/wasm-parser": "1.7.11",
124+ "@webassemblyjs/wast-printer": "1.7.11"
125+ }
126+ },
127+ "@webassemblyjs/wasm-gen": {
128+ "version": "1.7.11",
129+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
130+ "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
131+ "dev": true,
132+ "requires": {
133+ "@webassemblyjs/ast": "1.7.11",
134+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
135+ "@webassemblyjs/ieee754": "1.7.11",
136+ "@webassemblyjs/leb128": "1.7.11",
137+ "@webassemblyjs/utf8": "1.7.11"
138+ }
139+ },
140+ "@webassemblyjs/wasm-opt": {
141+ "version": "1.7.11",
142+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
143+ "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
144+ "dev": true,
145+ "requires": {
146+ "@webassemblyjs/ast": "1.7.11",
147+ "@webassemblyjs/helper-buffer": "1.7.11",
148+ "@webassemblyjs/wasm-gen": "1.7.11",
149+ "@webassemblyjs/wasm-parser": "1.7.11"
150+ }
151+ },
152+ "@webassemblyjs/wasm-parser": {
153+ "version": "1.7.11",
154+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
155+ "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
156+ "dev": true,
157+ "requires": {
158+ "@webassemblyjs/ast": "1.7.11",
159+ "@webassemblyjs/helper-api-error": "1.7.11",
160+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
161+ "@webassemblyjs/ieee754": "1.7.11",
162+ "@webassemblyjs/leb128": "1.7.11",
163+ "@webassemblyjs/utf8": "1.7.11"
164+ }
165+ },
166+ "@webassemblyjs/wast-parser": {
167+ "version": "1.7.11",
168+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
169+ "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
170+ "dev": true,
171+ "requires": {
172+ "@webassemblyjs/ast": "1.7.11",
173+ "@webassemblyjs/floating-point-hex-parser": "1.7.11",
174+ "@webassemblyjs/helper-api-error": "1.7.11",
175+ "@webassemblyjs/helper-code-frame": "1.7.11",
176+ "@webassemblyjs/helper-fsm": "1.7.11",
177+ "@xtuc/long": "4.2.1"
178+ }
179+ },
180+ "@webassemblyjs/wast-printer": {
181+ "version": "1.7.11",
182+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
183+ "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
184+ "dev": true,
185+ "requires": {
186+ "@webassemblyjs/ast": "1.7.11",
187+ "@webassemblyjs/wast-parser": "1.7.11",
188+ "@xtuc/long": "4.2.1"
189+ }
190+ },
191+ "@xtuc/ieee754": {
192+ "version": "1.2.0",
193+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
194+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
195+ "dev": true
196+ },
197+ "@xtuc/long": {
198+ "version": "4.2.1",
199+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
200+ "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
201+ "dev": true
202+ },
203+ "accepts": {
204+ "version": "1.3.5",
205+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
206+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
207+ "dev": true,
208+ "requires": {
209+ "mime-types": "~2.1.18",
210+ "negotiator": "0.6.1"
211+ }
212+ },
213+ "acorn": {
214+ "version": "5.7.3",
215+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
216+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
217+ "dev": true
218+ },
219+ "acorn-dynamic-import": {
220+ "version": "3.0.0",
221+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
222+ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
223+ "dev": true,
224+ "requires": {
225+ "acorn": "^5.0.0"
226+ }
227+ },
228+ "ajv": {
229+ "version": "6.5.3",
230+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
231+ "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
232+ "dev": true,
233+ "requires": {
234+ "fast-deep-equal": "^2.0.1",
235+ "fast-json-stable-stringify": "^2.0.0",
236+ "json-schema-traverse": "^0.4.1",
237+ "uri-js": "^4.2.2"
238+ }
239+ },
240+ "ajv-errors": {
241+ "version": "1.0.0",
242+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz",
243+ "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=",
244+ "dev": true
245+ },
246+ "ajv-keywords": {
247+ "version": "3.2.0",
248+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
249+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
250+ "dev": true
251+ },
252+ "ansi-colors": {
253+ "version": "3.2.1",
254+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz",
255+ "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==",
256+ "dev": true
257+ },
258+ "ansi-html": {
259+ "version": "0.0.7",
260+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
261+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
262+ "dev": true
263+ },
264+ "ansi-regex": {
265+ "version": "2.1.1",
266+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
267+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
268+ "dev": true
269+ },
270+ "ansi-styles": {
271+ "version": "3.2.1",
272+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
273+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
274+ "dev": true,
275+ "requires": {
276+ "color-convert": "^1.9.0"
277+ }
278+ },
279+ "anymatch": {
280+ "version": "2.0.0",
281+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
282+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
283+ "dev": true,
284+ "requires": {
285+ "micromatch": "^3.1.4",
286+ "normalize-path": "^2.1.1"
287+ }
288+ },
289+ "aproba": {
290+ "version": "1.2.0",
291+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
292+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
293+ "dev": true
294+ },
295+ "arr-diff": {
296+ "version": "4.0.0",
297+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
298+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
299+ "dev": true
300+ },
301+ "arr-flatten": {
302+ "version": "1.1.0",
303+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
304+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
305+ "dev": true
306+ },
307+ "arr-union": {
308+ "version": "3.1.0",
309+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
310+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
311+ "dev": true
312+ },
313+ "array-flatten": {
314+ "version": "2.1.1",
315+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
316+ "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
317+ "dev": true
318+ },
319+ "array-union": {
320+ "version": "1.0.2",
321+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
322+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
323+ "dev": true,
324+ "requires": {
325+ "array-uniq": "^1.0.1"
326+ }
327+ },
328+ "array-uniq": {
329+ "version": "1.0.3",
330+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
331+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
332+ "dev": true
333+ },
334+ "array-unique": {
335+ "version": "0.3.2",
336+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
337+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
338+ "dev": true
339+ },
340+ "asn1.js": {
341+ "version": "4.10.1",
342+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
343+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
344+ "dev": true,
345+ "requires": {
346+ "bn.js": "^4.0.0",
347+ "inherits": "^2.0.1",
348+ "minimalistic-assert": "^1.0.0"
349+ }
350+ },
351+ "assert": {
352+ "version": "1.4.1",
353+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
354+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
355+ "dev": true,
356+ "requires": {
357+ "util": "0.10.3"
358+ },
359+ "dependencies": {
360+ "inherits": {
361+ "version": "2.0.1",
362+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
363+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
364+ "dev": true
365+ },
366+ "util": {
367+ "version": "0.10.3",
368+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
369+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
370+ "dev": true,
371+ "requires": {
372+ "inherits": "2.0.1"
373+ }
374+ }
375+ }
376+ },
377+ "assign-symbols": {
378+ "version": "1.0.0",
379+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
380+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
381+ "dev": true
382+ },
383+ "async": {
384+ "version": "1.5.2",
385+ "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
386+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
387+ "dev": true
388+ },
389+ "async-each": {
390+ "version": "1.0.1",
391+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
392+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
393+ "dev": true
394+ },
395+ "atob": {
396+ "version": "2.1.1",
397+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
398+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
399+ "dev": true
400+ },
401+ "balanced-match": {
402+ "version": "1.0.0",
403+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
404+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
405+ "dev": true
406+ },
407+ "base": {
408+ "version": "0.11.2",
409+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
410+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
411+ "dev": true,
412+ "requires": {
413+ "cache-base": "^1.0.1",
414+ "class-utils": "^0.3.5",
415+ "component-emitter": "^1.2.1",
416+ "define-property": "^1.0.0",
417+ "isobject": "^3.0.1",
418+ "mixin-deep": "^1.2.0",
419+ "pascalcase": "^0.1.1"
420+ },
421+ "dependencies": {
422+ "define-property": {
423+ "version": "1.0.0",
424+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
425+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
426+ "dev": true,
427+ "requires": {
428+ "is-descriptor": "^1.0.0"
429+ }
430+ },
431+ "is-accessor-descriptor": {
432+ "version": "1.0.0",
433+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
434+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
435+ "dev": true,
436+ "requires": {
437+ "kind-of": "^6.0.0"
438+ }
439+ },
440+ "is-data-descriptor": {
441+ "version": "1.0.0",
442+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
443+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
444+ "dev": true,
445+ "requires": {
446+ "kind-of": "^6.0.0"
447+ }
448+ },
449+ "is-descriptor": {
450+ "version": "1.0.2",
451+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
452+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
453+ "dev": true,
454+ "requires": {
455+ "is-accessor-descriptor": "^1.0.0",
456+ "is-data-descriptor": "^1.0.0",
457+ "kind-of": "^6.0.2"
458+ }
459+ }
460+ }
461+ },
462+ "base64-js": {
463+ "version": "1.3.0",
464+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
465+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
466+ "dev": true
467+ },
468+ "batch": {
469+ "version": "0.6.1",
470+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
471+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
472+ "dev": true
473+ },
474+ "big.js": {
475+ "version": "3.2.0",
476+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
477+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
478+ "dev": true
479+ },
480+ "binary-extensions": {
481+ "version": "1.11.0",
482+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
483+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
484+ "dev": true
485+ },
486+ "bluebird": {
487+ "version": "3.5.2",
488+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
489+ "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
490+ "dev": true
491+ },
492+ "bn.js": {
493+ "version": "4.11.8",
494+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
495+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
496+ "dev": true
497+ },
498+ "body-parser": {
499+ "version": "1.18.3",
500+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
501+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
502+ "dev": true,
503+ "requires": {
504+ "bytes": "3.0.0",
505+ "content-type": "~1.0.4",
506+ "debug": "2.6.9",
507+ "depd": "~1.1.2",
508+ "http-errors": "~1.6.3",
509+ "iconv-lite": "0.4.23",
510+ "on-finished": "~2.3.0",
511+ "qs": "6.5.2",
512+ "raw-body": "2.3.3",
513+ "type-is": "~1.6.16"
514+ },
515+ "dependencies": {
516+ "debug": {
517+ "version": "2.6.9",
518+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
519+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
520+ "dev": true,
521+ "requires": {
522+ "ms": "2.0.0"
523+ }
524+ }
525+ }
526+ },
527+ "bonjour": {
528+ "version": "3.5.0",
529+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
530+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
531+ "dev": true,
532+ "requires": {
533+ "array-flatten": "^2.1.0",
534+ "deep-equal": "^1.0.1",
535+ "dns-equal": "^1.0.0",
536+ "dns-txt": "^2.0.2",
537+ "multicast-dns": "^6.0.1",
538+ "multicast-dns-service-types": "^1.1.0"
539+ }
540+ },
541+ "boolbase": {
542+ "version": "1.0.0",
543+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
544+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
545+ "dev": true
546+ },
547+ "brace-expansion": {
548+ "version": "1.1.11",
549+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
550+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
551+ "dev": true,
552+ "requires": {
553+ "balanced-match": "^1.0.0",
554+ "concat-map": "0.0.1"
555+ }
556+ },
557+ "braces": {
558+ "version": "2.3.2",
559+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
560+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
561+ "dev": true,
562+ "requires": {
563+ "arr-flatten": "^1.1.0",
564+ "array-unique": "^0.3.2",
565+ "extend-shallow": "^2.0.1",
566+ "fill-range": "^4.0.0",
567+ "isobject": "^3.0.1",
568+ "repeat-element": "^1.1.2",
569+ "snapdragon": "^0.8.1",
570+ "snapdragon-node": "^2.0.1",
571+ "split-string": "^3.0.2",
572+ "to-regex": "^3.0.1"
573+ },
574+ "dependencies": {
575+ "extend-shallow": {
576+ "version": "2.0.1",
577+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
578+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
579+ "dev": true,
580+ "requires": {
581+ "is-extendable": "^0.1.0"
582+ }
583+ }
584+ }
585+ },
586+ "brorand": {
587+ "version": "1.1.0",
588+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
589+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
590+ "dev": true
591+ },
592+ "browserify-aes": {
593+ "version": "1.2.0",
594+ "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
595+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
596+ "dev": true,
597+ "requires": {
598+ "buffer-xor": "^1.0.3",
599+ "cipher-base": "^1.0.0",
600+ "create-hash": "^1.1.0",
601+ "evp_bytestokey": "^1.0.3",
602+ "inherits": "^2.0.1",
603+ "safe-buffer": "^5.0.1"
604+ }
605+ },
606+ "browserify-cipher": {
607+ "version": "1.0.1",
608+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
609+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
610+ "dev": true,
611+ "requires": {
612+ "browserify-aes": "^1.0.4",
613+ "browserify-des": "^1.0.0",
614+ "evp_bytestokey": "^1.0.0"
615+ }
616+ },
617+ "browserify-des": {
618+ "version": "1.0.2",
619+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
620+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
621+ "dev": true,
622+ "requires": {
623+ "cipher-base": "^1.0.1",
624+ "des.js": "^1.0.0",
625+ "inherits": "^2.0.1",
626+ "safe-buffer": "^5.1.2"
627+ }
628+ },
629+ "browserify-rsa": {
630+ "version": "4.0.1",
631+ "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
632+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
633+ "dev": true,
634+ "requires": {
635+ "bn.js": "^4.1.0",
636+ "randombytes": "^2.0.1"
637+ }
638+ },
639+ "browserify-sign": {
640+ "version": "4.0.4",
641+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
642+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
643+ "dev": true,
644+ "requires": {
645+ "bn.js": "^4.1.1",
646+ "browserify-rsa": "^4.0.0",
647+ "create-hash": "^1.1.0",
648+ "create-hmac": "^1.1.2",
649+ "elliptic": "^6.0.0",
650+ "inherits": "^2.0.1",
651+ "parse-asn1": "^5.0.0"
652+ }
653+ },
654+ "browserify-zlib": {
655+ "version": "0.2.0",
656+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
657+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
658+ "dev": true,
659+ "requires": {
660+ "pako": "~1.0.5"
661+ }
662+ },
663+ "buffer": {
664+ "version": "4.9.1",
665+ "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
666+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
667+ "dev": true,
668+ "requires": {
669+ "base64-js": "^1.0.2",
670+ "ieee754": "^1.1.4",
671+ "isarray": "^1.0.0"
672+ }
673+ },
674+ "buffer-from": {
675+ "version": "1.1.1",
676+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
677+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
678+ "dev": true
679+ },
680+ "buffer-indexof": {
681+ "version": "1.1.1",
682+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
683+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
684+ "dev": true
685+ },
686+ "buffer-xor": {
687+ "version": "1.0.3",
688+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
689+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
690+ "dev": true
691+ },
692+ "builtin-status-codes": {
693+ "version": "3.0.0",
694+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
695+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
696+ "dev": true
697+ },
698+ "bytes": {
699+ "version": "3.0.0",
700+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
701+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
702+ "dev": true
703+ },
704+ "cacache": {
705+ "version": "10.0.4",
706+ "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
707+ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
708+ "dev": true,
709+ "requires": {
710+ "bluebird": "^3.5.1",
711+ "chownr": "^1.0.1",
712+ "glob": "^7.1.2",
713+ "graceful-fs": "^4.1.11",
714+ "lru-cache": "^4.1.1",
715+ "mississippi": "^2.0.0",
716+ "mkdirp": "^0.5.1",
717+ "move-concurrently": "^1.0.1",
718+ "promise-inflight": "^1.0.1",
719+ "rimraf": "^2.6.2",
720+ "ssri": "^5.2.4",
721+ "unique-filename": "^1.1.0",
722+ "y18n": "^4.0.0"
723+ }
724+ },
725+ "cache-base": {
726+ "version": "1.0.1",
727+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
728+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
729+ "dev": true,
730+ "requires": {
731+ "collection-visit": "^1.0.0",
732+ "component-emitter": "^1.2.1",
733+ "get-value": "^2.0.6",
734+ "has-value": "^1.0.0",
735+ "isobject": "^3.0.1",
736+ "set-value": "^2.0.0",
737+ "to-object-path": "^0.3.0",
738+ "union-value": "^1.0.0",
739+ "unset-value": "^1.0.0"
740+ }
741+ },
742+ "camel-case": {
743+ "version": "3.0.0",
744+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
745+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
746+ "dev": true,
747+ "requires": {
748+ "no-case": "^2.2.0",
749+ "upper-case": "^1.1.1"
750+ }
751+ },
752+ "camelcase": {
753+ "version": "4.1.0",
754+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
755+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
756+ "dev": true
757+ },
758+ "chalk": {
759+ "version": "2.4.1",
760+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
761+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
762+ "dev": true,
763+ "requires": {
764+ "ansi-styles": "^3.2.1",
765+ "escape-string-regexp": "^1.0.5",
766+ "supports-color": "^5.3.0"
767+ }
768+ },
769+ "chokidar": {
770+ "version": "2.0.4",
771+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
772+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
773+ "dev": true,
774+ "requires": {
775+ "anymatch": "^2.0.0",
776+ "async-each": "^1.0.0",
777+ "braces": "^2.3.0",
778+ "fsevents": "^1.2.2",
779+ "glob-parent": "^3.1.0",
780+ "inherits": "^2.0.1",
781+ "is-binary-path": "^1.0.0",
782+ "is-glob": "^4.0.0",
783+ "lodash.debounce": "^4.0.8",
784+ "normalize-path": "^2.1.1",
785+ "path-is-absolute": "^1.0.0",
786+ "readdirp": "^2.0.0",
787+ "upath": "^1.0.5"
788+ }
789+ },
790+ "chownr": {
791+ "version": "1.1.1",
792+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
793+ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
794+ "dev": true
795+ },
796+ "chrome-trace-event": {
797+ "version": "1.0.0",
798+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
799+ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
800+ "dev": true,
801+ "requires": {
802+ "tslib": "^1.9.0"
803+ }
804+ },
805+ "cipher-base": {
806+ "version": "1.0.4",
807+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
808+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
809+ "dev": true,
810+ "requires": {
811+ "inherits": "^2.0.1",
812+ "safe-buffer": "^5.0.1"
813+ }
814+ },
815+ "class-utils": {
816+ "version": "0.3.6",
817+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
818+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
819+ "dev": true,
820+ "requires": {
821+ "arr-union": "^3.1.0",
822+ "define-property": "^0.2.5",
823+ "isobject": "^3.0.0",
824+ "static-extend": "^0.1.1"
825+ },
826+ "dependencies": {
827+ "define-property": {
828+ "version": "0.2.5",
829+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
830+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
831+ "dev": true,
832+ "requires": {
833+ "is-descriptor": "^0.1.0"
834+ }
835+ }
836+ }
837+ },
838+ "clean-css": {
839+ "version": "4.1.11",
840+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
841+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
842+ "dev": true,
843+ "requires": {
844+ "source-map": "0.5.x"
845+ }
846+ },
847+ "cliui": {
848+ "version": "4.1.0",
849+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
850+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
851+ "dev": true,
852+ "requires": {
853+ "string-width": "^2.1.1",
854+ "strip-ansi": "^4.0.0",
855+ "wrap-ansi": "^2.0.0"
856+ },
857+ "dependencies": {
858+ "ansi-regex": {
859+ "version": "3.0.0",
860+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
861+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
862+ "dev": true
863+ },
864+ "strip-ansi": {
865+ "version": "4.0.0",
866+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
867+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
868+ "dev": true,
869+ "requires": {
870+ "ansi-regex": "^3.0.0"
871+ }
872+ }
873+ }
874+ },
875+ "code-point-at": {
876+ "version": "1.1.0",
877+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
878+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
879+ "dev": true
880+ },
881+ "collection-visit": {
882+ "version": "1.0.0",
883+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
884+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
885+ "dev": true,
886+ "requires": {
887+ "map-visit": "^1.0.0",
888+ "object-visit": "^1.0.0"
889+ }
890+ },
891+ "color-convert": {
892+ "version": "1.9.2",
893+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
894+ "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
895+ "dev": true,
896+ "requires": {
897+ "color-name": "1.1.1"
898+ }
899+ },
900+ "color-name": {
901+ "version": "1.1.1",
902+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
903+ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
904+ "dev": true
905+ },
906+ "command-exists": {
907+ "version": "1.2.8",
908+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
909+ "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==",
910+ "dev": true
911+ },
912+ "commander": {
913+ "version": "2.13.0",
914+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
915+ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
916+ "dev": true
917+ },
918+ "commondir": {
919+ "version": "1.0.1",
920+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
921+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
922+ "dev": true
923+ },
924+ "component-emitter": {
925+ "version": "1.2.1",
926+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
927+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
928+ "dev": true
929+ },
930+ "compressible": {
931+ "version": "2.0.15",
932+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
933+ "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
934+ "dev": true,
935+ "requires": {
936+ "mime-db": ">= 1.36.0 < 2"
937+ }
938+ },
939+ "compression": {
940+ "version": "1.7.3",
941+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
942+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
943+ "dev": true,
944+ "requires": {
945+ "accepts": "~1.3.5",
946+ "bytes": "3.0.0",
947+ "compressible": "~2.0.14",
948+ "debug": "2.6.9",
949+ "on-headers": "~1.0.1",
950+ "safe-buffer": "5.1.2",
951+ "vary": "~1.1.2"
952+ },
953+ "dependencies": {
954+ "debug": {
955+ "version": "2.6.9",
956+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
957+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
958+ "dev": true,
959+ "requires": {
960+ "ms": "2.0.0"
961+ }
962+ }
963+ }
964+ },
965+ "concat-map": {
966+ "version": "0.0.1",
967+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
968+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
969+ "dev": true
970+ },
971+ "concat-stream": {
972+ "version": "1.6.2",
973+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
974+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
975+ "dev": true,
976+ "requires": {
977+ "buffer-from": "^1.0.0",
978+ "inherits": "^2.0.3",
979+ "readable-stream": "^2.2.2",
980+ "typedarray": "^0.0.6"
981+ }
982+ },
983+ "connect-history-api-fallback": {
984+ "version": "1.5.0",
985+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
986+ "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
987+ "dev": true
988+ },
989+ "console-browserify": {
990+ "version": "1.1.0",
991+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
992+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
993+ "dev": true,
994+ "requires": {
995+ "date-now": "^0.1.4"
996+ }
997+ },
998+ "constants-browserify": {
999+ "version": "1.0.0",
1000+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1001+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
1002+ "dev": true
1003+ },
1004+ "content-disposition": {
1005+ "version": "0.5.2",
1006+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
1007+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
1008+ "dev": true
1009+ },
1010+ "content-type": {
1011+ "version": "1.0.4",
1012+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1013+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
1014+ "dev": true
1015+ },
1016+ "cookie": {
1017+ "version": "0.3.1",
1018+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
1019+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
1020+ "dev": true
1021+ },
1022+ "cookie-signature": {
1023+ "version": "1.0.6",
1024+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1025+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
1026+ "dev": true
1027+ },
1028+ "copy-concurrently": {
1029+ "version": "1.0.5",
1030+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
1031+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
1032+ "dev": true,
1033+ "requires": {
1034+ "aproba": "^1.1.1",
1035+ "fs-write-stream-atomic": "^1.0.8",
1036+ "iferr": "^0.1.5",
1037+ "mkdirp": "^0.5.1",
1038+ "rimraf": "^2.5.4",
1039+ "run-queue": "^1.0.0"
1040+ }
1041+ },
1042+ "copy-descriptor": {
1043+ "version": "0.1.1",
1044+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
1045+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
1046+ "dev": true
1047+ },
1048+ "core-util-is": {
1049+ "version": "1.0.2",
1050+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1051+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1052+ "dev": true
1053+ },
1054+ "create-ecdh": {
1055+ "version": "4.0.3",
1056+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
1057+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
1058+ "dev": true,
1059+ "requires": {
1060+ "bn.js": "^4.1.0",
1061+ "elliptic": "^6.0.0"
1062+ }
1063+ },
1064+ "create-hash": {
1065+ "version": "1.2.0",
1066+ "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1067+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1068+ "dev": true,
1069+ "requires": {
1070+ "cipher-base": "^1.0.1",
1071+ "inherits": "^2.0.1",
1072+ "md5.js": "^1.3.4",
1073+ "ripemd160": "^2.0.1",
1074+ "sha.js": "^2.4.0"
1075+ }
1076+ },
1077+ "create-hmac": {
1078+ "version": "1.1.7",
1079+ "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1080+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1081+ "dev": true,
1082+ "requires": {
1083+ "cipher-base": "^1.0.3",
1084+ "create-hash": "^1.1.0",
1085+ "inherits": "^2.0.1",
1086+ "ripemd160": "^2.0.0",
1087+ "safe-buffer": "^5.0.1",
1088+ "sha.js": "^2.4.8"
1089+ }
1090+ },
1091+ "cross-spawn": {
1092+ "version": "6.0.5",
1093+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1094+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1095+ "dev": true,
1096+ "requires": {
1097+ "nice-try": "^1.0.4",
1098+ "path-key": "^2.0.1",
1099+ "semver": "^5.5.0",
1100+ "shebang-command": "^1.2.0",
1101+ "which": "^1.2.9"
1102+ }
1103+ },
1104+ "crypto-browserify": {
1105+ "version": "3.12.0",
1106+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1107+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1108+ "dev": true,
1109+ "requires": {
1110+ "browserify-cipher": "^1.0.0",
1111+ "browserify-sign": "^4.0.0",
1112+ "create-ecdh": "^4.0.0",
1113+ "create-hash": "^1.1.0",
1114+ "create-hmac": "^1.1.0",
1115+ "diffie-hellman": "^5.0.0",
1116+ "inherits": "^2.0.1",
1117+ "pbkdf2": "^3.0.3",
1118+ "public-encrypt": "^4.0.0",
1119+ "randombytes": "^2.0.0",
1120+ "randomfill": "^1.0.3"
1121+ }
1122+ },
1123+ "css-select": {
1124+ "version": "1.2.0",
1125+ "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
1126+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
1127+ "dev": true,
1128+ "requires": {
1129+ "boolbase": "~1.0.0",
1130+ "css-what": "2.1",
1131+ "domutils": "1.5.1",
1132+ "nth-check": "~1.0.1"
1133+ }
1134+ },
1135+ "css-what": {
1136+ "version": "2.1.0",
1137+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
1138+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
1139+ "dev": true
1140+ },
1141+ "cyclist": {
1142+ "version": "0.2.2",
1143+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
1144+ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
1145+ "dev": true
1146+ },
1147+ "date-now": {
1148+ "version": "0.1.4",
1149+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
1150+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
1151+ "dev": true
1152+ },
1153+ "debug": {
1154+ "version": "3.2.6",
1155+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1156+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1157+ "dev": true,
1158+ "requires": {
1159+ "ms": "^2.1.1"
1160+ },
1161+ "dependencies": {
1162+ "ms": {
1163+ "version": "2.1.1",
1164+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1165+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1166+ "dev": true
1167+ }
1168+ }
1169+ },
1170+ "decamelize": {
1171+ "version": "2.0.0",
1172+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
1173+ "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
1174+ "dev": true,
1175+ "requires": {
1176+ "xregexp": "4.0.0"
1177+ }
1178+ },
1179+ "decode-uri-component": {
1180+ "version": "0.2.0",
1181+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1182+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1183+ "dev": true
1184+ },
1185+ "deep-equal": {
1186+ "version": "1.0.1",
1187+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
1188+ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
1189+ "dev": true
1190+ },
1191+ "default-gateway": {
1192+ "version": "2.7.2",
1193+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
1194+ "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
1195+ "dev": true,
1196+ "requires": {
1197+ "execa": "^0.10.0",
1198+ "ip-regex": "^2.1.0"
1199+ }
1200+ },
1201+ "define-properties": {
1202+ "version": "1.1.2",
1203+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
1204+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
1205+ "dev": true,
1206+ "requires": {
1207+ "foreach": "^2.0.5",
1208+ "object-keys": "^1.0.8"
1209+ }
1210+ },
1211+ "define-property": {
1212+ "version": "2.0.2",
1213+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1214+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1215+ "dev": true,
1216+ "requires": {
1217+ "is-descriptor": "^1.0.2",
1218+ "isobject": "^3.0.1"
1219+ },
1220+ "dependencies": {
1221+ "is-accessor-descriptor": {
1222+ "version": "1.0.0",
1223+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1224+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1225+ "dev": true,
1226+ "requires": {
1227+ "kind-of": "^6.0.0"
1228+ }
1229+ },
1230+ "is-data-descriptor": {
1231+ "version": "1.0.0",
1232+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1233+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1234+ "dev": true,
1235+ "requires": {
1236+ "kind-of": "^6.0.0"
1237+ }
1238+ },
1239+ "is-descriptor": {
1240+ "version": "1.0.2",
1241+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1242+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1243+ "dev": true,
1244+ "requires": {
1245+ "is-accessor-descriptor": "^1.0.0",
1246+ "is-data-descriptor": "^1.0.0",
1247+ "kind-of": "^6.0.2"
1248+ }
1249+ }
1250+ }
1251+ },
1252+ "del": {
1253+ "version": "3.0.0",
1254+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
1255+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
1256+ "dev": true,
1257+ "requires": {
1258+ "globby": "^6.1.0",
1259+ "is-path-cwd": "^1.0.0",
1260+ "is-path-in-cwd": "^1.0.0",
1261+ "p-map": "^1.1.1",
1262+ "pify": "^3.0.0",
1263+ "rimraf": "^2.2.8"
1264+ }
1265+ },
1266+ "depd": {
1267+ "version": "1.1.2",
1268+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1269+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
1270+ "dev": true
1271+ },
1272+ "des.js": {
1273+ "version": "1.0.0",
1274+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
1275+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
1276+ "dev": true,
1277+ "requires": {
1278+ "inherits": "^2.0.1",
1279+ "minimalistic-assert": "^1.0.0"
1280+ }
1281+ },
1282+ "destroy": {
1283+ "version": "1.0.4",
1284+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
1285+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
1286+ "dev": true
1287+ },
1288+ "detect-node": {
1289+ "version": "2.0.4",
1290+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
1291+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
1292+ "dev": true
1293+ },
1294+ "diffie-hellman": {
1295+ "version": "5.0.3",
1296+ "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1297+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1298+ "dev": true,
1299+ "requires": {
1300+ "bn.js": "^4.1.0",
1301+ "miller-rabin": "^4.0.0",
1302+ "randombytes": "^2.0.0"
1303+ }
1304+ },
1305+ "dns-equal": {
1306+ "version": "1.0.0",
1307+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
1308+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
1309+ "dev": true
1310+ },
1311+ "dns-packet": {
1312+ "version": "1.3.1",
1313+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
1314+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
1315+ "dev": true,
1316+ "requires": {
1317+ "ip": "^1.1.0",
1318+ "safe-buffer": "^5.0.1"
1319+ }
1320+ },
1321+ "dns-txt": {
1322+ "version": "2.0.2",
1323+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
1324+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
1325+ "dev": true,
1326+ "requires": {
1327+ "buffer-indexof": "^1.0.0"
1328+ }
1329+ },
1330+ "dom-converter": {
1331+ "version": "0.1.4",
1332+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
1333+ "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
1334+ "dev": true,
1335+ "requires": {
1336+ "utila": "~0.3"
1337+ },
1338+ "dependencies": {
1339+ "utila": {
1340+ "version": "0.3.3",
1341+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
1342+ "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
1343+ "dev": true
1344+ }
1345+ }
1346+ },
1347+ "dom-serializer": {
1348+ "version": "0.1.0",
1349+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
1350+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
1351+ "dev": true,
1352+ "requires": {
1353+ "domelementtype": "~1.1.1",
1354+ "entities": "~1.1.1"
1355+ },
1356+ "dependencies": {
1357+ "domelementtype": {
1358+ "version": "1.1.3",
1359+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1360+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1361+ "dev": true
1362+ }
1363+ }
1364+ },
1365+ "domain-browser": {
1366+ "version": "1.2.0",
1367+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1368+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1369+ "dev": true
1370+ },
1371+ "domelementtype": {
1372+ "version": "1.3.0",
1373+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
1374+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
1375+ "dev": true
1376+ },
1377+ "domhandler": {
1378+ "version": "2.1.0",
1379+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
1380+ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
1381+ "dev": true,
1382+ "requires": {
1383+ "domelementtype": "1"
1384+ }
1385+ },
1386+ "domutils": {
1387+ "version": "1.5.1",
1388+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
1389+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
1390+ "dev": true,
1391+ "requires": {
1392+ "dom-serializer": "0",
1393+ "domelementtype": "1"
1394+ }
1395+ },
1396+ "duplexify": {
1397+ "version": "3.6.1",
1398+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
1399+ "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
1400+ "dev": true,
1401+ "requires": {
1402+ "end-of-stream": "^1.0.0",
1403+ "inherits": "^2.0.1",
1404+ "readable-stream": "^2.0.0",
1405+ "stream-shift": "^1.0.0"
1406+ }
1407+ },
1408+ "ee-first": {
1409+ "version": "1.1.1",
1410+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1411+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
1412+ "dev": true
1413+ },
1414+ "elliptic": {
1415+ "version": "6.4.1",
1416+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
1417+ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
1418+ "dev": true,
1419+ "requires": {
1420+ "bn.js": "^4.4.0",
1421+ "brorand": "^1.0.1",
1422+ "hash.js": "^1.0.0",
1423+ "hmac-drbg": "^1.0.0",
1424+ "inherits": "^2.0.1",
1425+ "minimalistic-assert": "^1.0.0",
1426+ "minimalistic-crypto-utils": "^1.0.0"
1427+ }
1428+ },
1429+ "emojis-list": {
1430+ "version": "2.1.0",
1431+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
1432+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
1433+ "dev": true
1434+ },
1435+ "encodeurl": {
1436+ "version": "1.0.2",
1437+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1438+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
1439+ "dev": true
1440+ },
1441+ "end-of-stream": {
1442+ "version": "1.4.1",
1443+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1444+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1445+ "dev": true,
1446+ "requires": {
1447+ "once": "^1.4.0"
1448+ }
1449+ },
1450+ "enhanced-resolve": {
1451+ "version": "4.1.0",
1452+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
1453+ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
1454+ "dev": true,
1455+ "requires": {
1456+ "graceful-fs": "^4.1.2",
1457+ "memory-fs": "^0.4.0",
1458+ "tapable": "^1.0.0"
1459+ }
1460+ },
1461+ "entities": {
1462+ "version": "1.1.1",
1463+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
1464+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
1465+ "dev": true
1466+ },
1467+ "errno": {
1468+ "version": "0.1.7",
1469+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
1470+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
1471+ "dev": true,
1472+ "requires": {
1473+ "prr": "~1.0.1"
1474+ }
1475+ },
1476+ "es-abstract": {
1477+ "version": "1.12.0",
1478+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
1479+ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
1480+ "dev": true,
1481+ "requires": {
1482+ "es-to-primitive": "^1.1.1",
1483+ "function-bind": "^1.1.1",
1484+ "has": "^1.0.1",
1485+ "is-callable": "^1.1.3",
1486+ "is-regex": "^1.0.4"
1487+ }
1488+ },
1489+ "es-to-primitive": {
1490+ "version": "1.1.1",
1491+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
1492+ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
1493+ "dev": true,
1494+ "requires": {
1495+ "is-callable": "^1.1.1",
1496+ "is-date-object": "^1.0.1",
1497+ "is-symbol": "^1.0.1"
1498+ }
1499+ },
1500+ "escape-html": {
1501+ "version": "1.0.3",
1502+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1503+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
1504+ "dev": true
1505+ },
1506+ "escape-string-regexp": {
1507+ "version": "1.0.5",
1508+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1509+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1510+ "dev": true
1511+ },
1512+ "eslint-scope": {
1513+ "version": "4.0.0",
1514+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
1515+ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
1516+ "dev": true,
1517+ "requires": {
1518+ "esrecurse": "^4.1.0",
1519+ "estraverse": "^4.1.1"
1520+ }
1521+ },
1522+ "esrecurse": {
1523+ "version": "4.2.1",
1524+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1525+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1526+ "dev": true,
1527+ "requires": {
1528+ "estraverse": "^4.1.0"
1529+ }
1530+ },
1531+ "estraverse": {
1532+ "version": "4.2.0",
1533+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1534+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1535+ "dev": true
1536+ },
1537+ "etag": {
1538+ "version": "1.8.1",
1539+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1540+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
1541+ "dev": true
1542+ },
1543+ "eventemitter3": {
1544+ "version": "3.1.0",
1545+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
1546+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
1547+ "dev": true
1548+ },
1549+ "events": {
1550+ "version": "1.1.1",
1551+ "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
1552+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
1553+ "dev": true
1554+ },
1555+ "eventsource": {
1556+ "version": "1.0.7",
1557+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
1558+ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
1559+ "dev": true,
1560+ "requires": {
1561+ "original": "^1.0.0"
1562+ }
1563+ },
1564+ "evp_bytestokey": {
1565+ "version": "1.0.3",
1566+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1567+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1568+ "dev": true,
1569+ "requires": {
1570+ "md5.js": "^1.3.4",
1571+ "safe-buffer": "^5.1.1"
1572+ }
1573+ },
1574+ "execa": {
1575+ "version": "0.10.0",
1576+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
1577+ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
1578+ "dev": true,
1579+ "requires": {
1580+ "cross-spawn": "^6.0.0",
1581+ "get-stream": "^3.0.0",
1582+ "is-stream": "^1.1.0",
1583+ "npm-run-path": "^2.0.0",
1584+ "p-finally": "^1.0.0",
1585+ "signal-exit": "^3.0.0",
1586+ "strip-eof": "^1.0.0"
1587+ }
1588+ },
1589+ "expand-brackets": {
1590+ "version": "2.1.4",
1591+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
1592+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
1593+ "dev": true,
1594+ "requires": {
1595+ "debug": "^2.3.3",
1596+ "define-property": "^0.2.5",
1597+ "extend-shallow": "^2.0.1",
1598+ "posix-character-classes": "^0.1.0",
1599+ "regex-not": "^1.0.0",
1600+ "snapdragon": "^0.8.1",
1601+ "to-regex": "^3.0.1"
1602+ },
1603+ "dependencies": {
1604+ "debug": {
1605+ "version": "2.6.9",
1606+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1607+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1608+ "dev": true,
1609+ "requires": {
1610+ "ms": "2.0.0"
1611+ }
1612+ },
1613+ "define-property": {
1614+ "version": "0.2.5",
1615+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1616+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1617+ "dev": true,
1618+ "requires": {
1619+ "is-descriptor": "^0.1.0"
1620+ }
1621+ },
1622+ "extend-shallow": {
1623+ "version": "2.0.1",
1624+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1625+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1626+ "dev": true,
1627+ "requires": {
1628+ "is-extendable": "^0.1.0"
1629+ }
1630+ }
1631+ }
1632+ },
1633+ "express": {
1634+ "version": "4.16.4",
1635+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
1636+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
1637+ "dev": true,
1638+ "requires": {
1639+ "accepts": "~1.3.5",
1640+ "array-flatten": "1.1.1",
1641+ "body-parser": "1.18.3",
1642+ "content-disposition": "0.5.2",
1643+ "content-type": "~1.0.4",
1644+ "cookie": "0.3.1",
1645+ "cookie-signature": "1.0.6",
1646+ "debug": "2.6.9",
1647+ "depd": "~1.1.2",
1648+ "encodeurl": "~1.0.2",
1649+ "escape-html": "~1.0.3",
1650+ "etag": "~1.8.1",
1651+ "finalhandler": "1.1.1",
1652+ "fresh": "0.5.2",
1653+ "merge-descriptors": "1.0.1",
1654+ "methods": "~1.1.2",
1655+ "on-finished": "~2.3.0",
1656+ "parseurl": "~1.3.2",
1657+ "path-to-regexp": "0.1.7",
1658+ "proxy-addr": "~2.0.4",
1659+ "qs": "6.5.2",
1660+ "range-parser": "~1.2.0",
1661+ "safe-buffer": "5.1.2",
1662+ "send": "0.16.2",
1663+ "serve-static": "1.13.2",
1664+ "setprototypeof": "1.1.0",
1665+ "statuses": "~1.4.0",
1666+ "type-is": "~1.6.16",
1667+ "utils-merge": "1.0.1",
1668+ "vary": "~1.1.2"
1669+ },
1670+ "dependencies": {
1671+ "array-flatten": {
1672+ "version": "1.1.1",
1673+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1674+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
1675+ "dev": true
1676+ },
1677+ "debug": {
1678+ "version": "2.6.9",
1679+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1680+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1681+ "dev": true,
1682+ "requires": {
1683+ "ms": "2.0.0"
1684+ }
1685+ }
1686+ }
1687+ },
1688+ "extend-shallow": {
1689+ "version": "3.0.2",
1690+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1691+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1692+ "dev": true,
1693+ "requires": {
1694+ "assign-symbols": "^1.0.0",
1695+ "is-extendable": "^1.0.1"
1696+ },
1697+ "dependencies": {
1698+ "is-extendable": {
1699+ "version": "1.0.1",
1700+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1701+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1702+ "dev": true,
1703+ "requires": {
1704+ "is-plain-object": "^2.0.4"
1705+ }
1706+ }
1707+ }
1708+ },
1709+ "extglob": {
1710+ "version": "2.0.4",
1711+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
1712+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
1713+ "dev": true,
1714+ "requires": {
1715+ "array-unique": "^0.3.2",
1716+ "define-property": "^1.0.0",
1717+ "expand-brackets": "^2.1.4",
1718+ "extend-shallow": "^2.0.1",
1719+ "fragment-cache": "^0.2.1",
1720+ "regex-not": "^1.0.0",
1721+ "snapdragon": "^0.8.1",
1722+ "to-regex": "^3.0.1"
1723+ },
1724+ "dependencies": {
1725+ "define-property": {
1726+ "version": "1.0.0",
1727+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1728+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1729+ "dev": true,
1730+ "requires": {
1731+ "is-descriptor": "^1.0.0"
1732+ }
1733+ },
1734+ "extend-shallow": {
1735+ "version": "2.0.1",
1736+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1737+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1738+ "dev": true,
1739+ "requires": {
1740+ "is-extendable": "^0.1.0"
1741+ }
1742+ },
1743+ "is-accessor-descriptor": {
1744+ "version": "1.0.0",
1745+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1746+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1747+ "dev": true,
1748+ "requires": {
1749+ "kind-of": "^6.0.0"
1750+ }
1751+ },
1752+ "is-data-descriptor": {
1753+ "version": "1.0.0",
1754+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1755+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1756+ "dev": true,
1757+ "requires": {
1758+ "kind-of": "^6.0.0"
1759+ }
1760+ },
1761+ "is-descriptor": {
1762+ "version": "1.0.2",
1763+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1764+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1765+ "dev": true,
1766+ "requires": {
1767+ "is-accessor-descriptor": "^1.0.0",
1768+ "is-data-descriptor": "^1.0.0",
1769+ "kind-of": "^6.0.2"
1770+ }
1771+ }
1772+ }
1773+ },
1774+ "fast-deep-equal": {
1775+ "version": "2.0.1",
1776+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1777+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1778+ "dev": true
1779+ },
1780+ "fast-json-stable-stringify": {
1781+ "version": "2.0.0",
1782+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1783+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1784+ "dev": true
1785+ },
1786+ "faye-websocket": {
1787+ "version": "0.10.0",
1788+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
1789+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
1790+ "dev": true,
1791+ "requires": {
1792+ "websocket-driver": ">=0.5.1"
1793+ }
1794+ },
1795+ "fill-range": {
1796+ "version": "4.0.0",
1797+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
1798+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
1799+ "dev": true,
1800+ "requires": {
1801+ "extend-shallow": "^2.0.1",
1802+ "is-number": "^3.0.0",
1803+ "repeat-string": "^1.6.1",
1804+ "to-regex-range": "^2.1.0"
1805+ },
1806+ "dependencies": {
1807+ "extend-shallow": {
1808+ "version": "2.0.1",
1809+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1810+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1811+ "dev": true,
1812+ "requires": {
1813+ "is-extendable": "^0.1.0"
1814+ }
1815+ }
1816+ }
1817+ },
1818+ "finalhandler": {
1819+ "version": "1.1.1",
1820+ "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
1821+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
1822+ "dev": true,
1823+ "requires": {
1824+ "debug": "2.6.9",
1825+ "encodeurl": "~1.0.2",
1826+ "escape-html": "~1.0.3",
1827+ "on-finished": "~2.3.0",
1828+ "parseurl": "~1.3.2",
1829+ "statuses": "~1.4.0",
1830+ "unpipe": "~1.0.0"
1831+ },
1832+ "dependencies": {
1833+ "debug": {
1834+ "version": "2.6.9",
1835+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1836+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1837+ "dev": true,
1838+ "requires": {
1839+ "ms": "2.0.0"
1840+ }
1841+ }
1842+ }
1843+ },
1844+ "find-cache-dir": {
1845+ "version": "1.0.0",
1846+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
1847+ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
1848+ "dev": true,
1849+ "requires": {
1850+ "commondir": "^1.0.1",
1851+ "make-dir": "^1.0.0",
1852+ "pkg-dir": "^2.0.0"
1853+ }
1854+ },
1855+ "find-up": {
1856+ "version": "2.1.0",
1857+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1858+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1859+ "dev": true,
1860+ "requires": {
1861+ "locate-path": "^2.0.0"
1862+ }
1863+ },
1864+ "flush-write-stream": {
1865+ "version": "1.0.3",
1866+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
1867+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
1868+ "dev": true,
1869+ "requires": {
1870+ "inherits": "^2.0.1",
1871+ "readable-stream": "^2.0.4"
1872+ }
1873+ },
1874+ "follow-redirects": {
1875+ "version": "1.5.9",
1876+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz",
1877+ "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==",
1878+ "dev": true,
1879+ "requires": {
1880+ "debug": "=3.1.0"
1881+ },
1882+ "dependencies": {
1883+ "debug": {
1884+ "version": "3.1.0",
1885+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1886+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1887+ "dev": true,
1888+ "requires": {
1889+ "ms": "2.0.0"
1890+ }
1891+ }
1892+ }
1893+ },
1894+ "for-in": {
1895+ "version": "1.0.2",
1896+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1897+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1898+ "dev": true
1899+ },
1900+ "foreach": {
1901+ "version": "2.0.5",
1902+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1903+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1904+ "dev": true
1905+ },
1906+ "forwarded": {
1907+ "version": "0.1.2",
1908+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1909+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
1910+ "dev": true
1911+ },
1912+ "fragment-cache": {
1913+ "version": "0.2.1",
1914+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
1915+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
1916+ "dev": true,
1917+ "requires": {
1918+ "map-cache": "^0.2.2"
1919+ }
1920+ },
1921+ "fresh": {
1922+ "version": "0.5.2",
1923+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1924+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
1925+ "dev": true
1926+ },
1927+ "from2": {
1928+ "version": "2.3.0",
1929+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1930+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1931+ "dev": true,
1932+ "requires": {
1933+ "inherits": "^2.0.1",
1934+ "readable-stream": "^2.0.0"
1935+ }
1936+ },
1937+ "fs-write-stream-atomic": {
1938+ "version": "1.0.10",
1939+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
1940+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
1941+ "dev": true,
1942+ "requires": {
1943+ "graceful-fs": "^4.1.2",
1944+ "iferr": "^0.1.5",
1945+ "imurmurhash": "^0.1.4",
1946+ "readable-stream": "1 || 2"
1947+ }
1948+ },
1949+ "fs.realpath": {
1950+ "version": "1.0.0",
1951+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1952+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1953+ "dev": true
1954+ },
1955+ "fsevents": {
1956+ "version": "1.2.4",
1957+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
1958+ "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
1959+ "dev": true,
1960+ "optional": true,
1961+ "requires": {
1962+ "nan": "^2.9.2",
1963+ "node-pre-gyp": "^0.10.0"
1964+ },
1965+ "dependencies": {
1966+ "abbrev": {
1967+ "version": "1.1.1",
1968+ "bundled": true,
1969+ "dev": true,
1970+ "optional": true
1971+ },
1972+ "ansi-regex": {
1973+ "version": "2.1.1",
1974+ "bundled": true,
1975+ "dev": true
1976+ },
1977+ "aproba": {
1978+ "version": "1.2.0",
1979+ "bundled": true,
1980+ "dev": true,
1981+ "optional": true
1982+ },
1983+ "are-we-there-yet": {
1984+ "version": "1.1.4",
1985+ "bundled": true,
1986+ "dev": true,
1987+ "optional": true,
1988+ "requires": {
1989+ "delegates": "^1.0.0",
1990+ "readable-stream": "^2.0.6"
1991+ }
1992+ },
1993+ "balanced-match": {
1994+ "version": "1.0.0",
1995+ "bundled": true,
1996+ "dev": true
1997+ },
1998+ "brace-expansion": {
1999+ "version": "1.1.11",
2000+ "bundled": true,
2001+ "dev": true,
2002+ "requires": {
2003+ "balanced-match": "^1.0.0",
2004+ "concat-map": "0.0.1"
2005+ }
2006+ },
2007+ "chownr": {
2008+ "version": "1.0.1",
2009+ "bundled": true,
2010+ "dev": true,
2011+ "optional": true
2012+ },
2013+ "code-point-at": {
2014+ "version": "1.1.0",
2015+ "bundled": true,
2016+ "dev": true
2017+ },
2018+ "concat-map": {
2019+ "version": "0.0.1",
2020+ "bundled": true,
2021+ "dev": true
2022+ },
2023+ "console-control-strings": {
2024+ "version": "1.1.0",
2025+ "bundled": true,
2026+ "dev": true
2027+ },
2028+ "core-util-is": {
2029+ "version": "1.0.2",
2030+ "bundled": true,
2031+ "dev": true,
2032+ "optional": true
2033+ },
2034+ "debug": {
2035+ "version": "2.6.9",
2036+ "bundled": true,
2037+ "dev": true,
2038+ "optional": true,
2039+ "requires": {
2040+ "ms": "2.0.0"
2041+ }
2042+ },
2043+ "deep-extend": {
2044+ "version": "0.5.1",
2045+ "bundled": true,
2046+ "dev": true,
2047+ "optional": true
2048+ },
2049+ "delegates": {
2050+ "version": "1.0.0",
2051+ "bundled": true,
2052+ "dev": true,
2053+ "optional": true
2054+ },
2055+ "detect-libc": {
2056+ "version": "1.0.3",
2057+ "bundled": true,
2058+ "dev": true,
2059+ "optional": true
2060+ },
2061+ "fs-minipass": {
2062+ "version": "1.2.5",
2063+ "bundled": true,
2064+ "dev": true,
2065+ "optional": true,
2066+ "requires": {
2067+ "minipass": "^2.2.1"
2068+ }
2069+ },
2070+ "fs.realpath": {
2071+ "version": "1.0.0",
2072+ "bundled": true,
2073+ "dev": true,
2074+ "optional": true
2075+ },
2076+ "gauge": {
2077+ "version": "2.7.4",
2078+ "bundled": true,
2079+ "dev": true,
2080+ "optional": true,
2081+ "requires": {
2082+ "aproba": "^1.0.3",
2083+ "console-control-strings": "^1.0.0",
2084+ "has-unicode": "^2.0.0",
2085+ "object-assign": "^4.1.0",
2086+ "signal-exit": "^3.0.0",
2087+ "string-width": "^1.0.1",
2088+ "strip-ansi": "^3.0.1",
2089+ "wide-align": "^1.1.0"
2090+ }
2091+ },
2092+ "glob": {
2093+ "version": "7.1.2",
2094+ "bundled": true,
2095+ "dev": true,
2096+ "optional": true,
2097+ "requires": {
2098+ "fs.realpath": "^1.0.0",
2099+ "inflight": "^1.0.4",
2100+ "inherits": "2",
2101+ "minimatch": "^3.0.4",
2102+ "once": "^1.3.0",
2103+ "path-is-absolute": "^1.0.0"
2104+ }
2105+ },
2106+ "has-unicode": {
2107+ "version": "2.0.1",
2108+ "bundled": true,
2109+ "dev": true,
2110+ "optional": true
2111+ },
2112+ "iconv-lite": {
2113+ "version": "0.4.21",
2114+ "bundled": true,
2115+ "dev": true,
2116+ "optional": true,
2117+ "requires": {
2118+ "safer-buffer": "^2.1.0"
2119+ }
2120+ },
2121+ "ignore-walk": {
2122+ "version": "3.0.1",
2123+ "bundled": true,
2124+ "dev": true,
2125+ "optional": true,
2126+ "requires": {
2127+ "minimatch": "^3.0.4"
2128+ }
2129+ },
2130+ "inflight": {
2131+ "version": "1.0.6",
2132+ "bundled": true,
2133+ "dev": true,
2134+ "optional": true,
2135+ "requires": {
2136+ "once": "^1.3.0",
2137+ "wrappy": "1"
2138+ }
2139+ },
2140+ "inherits": {
2141+ "version": "2.0.3",
2142+ "bundled": true,
2143+ "dev": true
2144+ },
2145+ "ini": {
2146+ "version": "1.3.5",
2147+ "bundled": true,
2148+ "dev": true,
2149+ "optional": true
2150+ },
2151+ "is-fullwidth-code-point": {
2152+ "version": "1.0.0",
2153+ "bundled": true,
2154+ "dev": true,
2155+ "requires": {
2156+ "number-is-nan": "^1.0.0"
2157+ }
2158+ },
2159+ "isarray": {
2160+ "version": "1.0.0",
2161+ "bundled": true,
2162+ "dev": true,
2163+ "optional": true
2164+ },
2165+ "minimatch": {
2166+ "version": "3.0.4",
2167+ "bundled": true,
2168+ "dev": true,
2169+ "requires": {
2170+ "brace-expansion": "^1.1.7"
2171+ }
2172+ },
2173+ "minimist": {
2174+ "version": "0.0.8",
2175+ "bundled": true,
2176+ "dev": true
2177+ },
2178+ "minipass": {
2179+ "version": "2.2.4",
2180+ "bundled": true,
2181+ "dev": true,
2182+ "requires": {
2183+ "safe-buffer": "^5.1.1",
2184+ "yallist": "^3.0.0"
2185+ }
2186+ },
2187+ "minizlib": {
2188+ "version": "1.1.0",
2189+ "bundled": true,
2190+ "dev": true,
2191+ "optional": true,
2192+ "requires": {
2193+ "minipass": "^2.2.1"
2194+ }
2195+ },
2196+ "mkdirp": {
2197+ "version": "0.5.1",
2198+ "bundled": true,
2199+ "dev": true,
2200+ "requires": {
2201+ "minimist": "0.0.8"
2202+ }
2203+ },
2204+ "ms": {
2205+ "version": "2.0.0",
2206+ "bundled": true,
2207+ "dev": true,
2208+ "optional": true
2209+ },
2210+ "needle": {
2211+ "version": "2.2.0",
2212+ "bundled": true,
2213+ "dev": true,
2214+ "optional": true,
2215+ "requires": {
2216+ "debug": "^2.1.2",
2217+ "iconv-lite": "^0.4.4",
2218+ "sax": "^1.2.4"
2219+ }
2220+ },
2221+ "node-pre-gyp": {
2222+ "version": "0.10.0",
2223+ "bundled": true,
2224+ "dev": true,
2225+ "optional": true,
2226+ "requires": {
2227+ "detect-libc": "^1.0.2",
2228+ "mkdirp": "^0.5.1",
2229+ "needle": "^2.2.0",
2230+ "nopt": "^4.0.1",
2231+ "npm-packlist": "^1.1.6",
2232+ "npmlog": "^4.0.2",
2233+ "rc": "^1.1.7",
2234+ "rimraf": "^2.6.1",
2235+ "semver": "^5.3.0",
2236+ "tar": "^4"
2237+ }
2238+ },
2239+ "nopt": {
2240+ "version": "4.0.1",
2241+ "bundled": true,
2242+ "dev": true,
2243+ "optional": true,
2244+ "requires": {
2245+ "abbrev": "1",
2246+ "osenv": "^0.1.4"
2247+ }
2248+ },
2249+ "npm-bundled": {
2250+ "version": "1.0.3",
2251+ "bundled": true,
2252+ "dev": true,
2253+ "optional": true
2254+ },
2255+ "npm-packlist": {
2256+ "version": "1.1.10",
2257+ "bundled": true,
2258+ "dev": true,
2259+ "optional": true,
2260+ "requires": {
2261+ "ignore-walk": "^3.0.1",
2262+ "npm-bundled": "^1.0.1"
2263+ }
2264+ },
2265+ "npmlog": {
2266+ "version": "4.1.2",
2267+ "bundled": true,
2268+ "dev": true,
2269+ "optional": true,
2270+ "requires": {
2271+ "are-we-there-yet": "~1.1.2",
2272+ "console-control-strings": "~1.1.0",
2273+ "gauge": "~2.7.3",
2274+ "set-blocking": "~2.0.0"
2275+ }
2276+ },
2277+ "number-is-nan": {
2278+ "version": "1.0.1",
2279+ "bundled": true,
2280+ "dev": true
2281+ },
2282+ "object-assign": {
2283+ "version": "4.1.1",
2284+ "bundled": true,
2285+ "dev": true,
2286+ "optional": true
2287+ },
2288+ "once": {
2289+ "version": "1.4.0",
2290+ "bundled": true,
2291+ "dev": true,
2292+ "requires": {
2293+ "wrappy": "1"
2294+ }
2295+ },
2296+ "os-homedir": {
2297+ "version": "1.0.2",
2298+ "bundled": true,
2299+ "dev": true,
2300+ "optional": true
2301+ },
2302+ "os-tmpdir": {
2303+ "version": "1.0.2",
2304+ "bundled": true,
2305+ "dev": true,
2306+ "optional": true
2307+ },
2308+ "osenv": {
2309+ "version": "0.1.5",
2310+ "bundled": true,
2311+ "dev": true,
2312+ "optional": true,
2313+ "requires": {
2314+ "os-homedir": "^1.0.0",
2315+ "os-tmpdir": "^1.0.0"
2316+ }
2317+ },
2318+ "path-is-absolute": {
2319+ "version": "1.0.1",
2320+ "bundled": true,
2321+ "dev": true,
2322+ "optional": true
2323+ },
2324+ "process-nextick-args": {
2325+ "version": "2.0.0",
2326+ "bundled": true,
2327+ "dev": true,
2328+ "optional": true
2329+ },
2330+ "rc": {
2331+ "version": "1.2.7",
2332+ "bundled": true,
2333+ "dev": true,
2334+ "optional": true,
2335+ "requires": {
2336+ "deep-extend": "^0.5.1",
2337+ "ini": "~1.3.0",
2338+ "minimist": "^1.2.0",
2339+ "strip-json-comments": "~2.0.1"
2340+ },
2341+ "dependencies": {
2342+ "minimist": {
2343+ "version": "1.2.0",
2344+ "bundled": true,
2345+ "dev": true,
2346+ "optional": true
2347+ }
2348+ }
2349+ },
2350+ "readable-stream": {
2351+ "version": "2.3.6",
2352+ "bundled": true,
2353+ "dev": true,
2354+ "optional": true,
2355+ "requires": {
2356+ "core-util-is": "~1.0.0",
2357+ "inherits": "~2.0.3",
2358+ "isarray": "~1.0.0",
2359+ "process-nextick-args": "~2.0.0",
2360+ "safe-buffer": "~5.1.1",
2361+ "string_decoder": "~1.1.1",
2362+ "util-deprecate": "~1.0.1"
2363+ }
2364+ },
2365+ "rimraf": {
2366+ "version": "2.6.2",
2367+ "bundled": true,
2368+ "dev": true,
2369+ "optional": true,
2370+ "requires": {
2371+ "glob": "^7.0.5"
2372+ }
2373+ },
2374+ "safe-buffer": {
2375+ "version": "5.1.1",
2376+ "bundled": true,
2377+ "dev": true
2378+ },
2379+ "safer-buffer": {
2380+ "version": "2.1.2",
2381+ "bundled": true,
2382+ "dev": true,
2383+ "optional": true
2384+ },
2385+ "sax": {
2386+ "version": "1.2.4",
2387+ "bundled": true,
2388+ "dev": true,
2389+ "optional": true
2390+ },
2391+ "semver": {
2392+ "version": "5.5.0",
2393+ "bundled": true,
2394+ "dev": true,
2395+ "optional": true
2396+ },
2397+ "set-blocking": {
2398+ "version": "2.0.0",
2399+ "bundled": true,
2400+ "dev": true,
2401+ "optional": true
2402+ },
2403+ "signal-exit": {
2404+ "version": "3.0.2",
2405+ "bundled": true,
2406+ "dev": true,
2407+ "optional": true
2408+ },
2409+ "string-width": {
2410+ "version": "1.0.2",
2411+ "bundled": true,
2412+ "dev": true,
2413+ "requires": {
2414+ "code-point-at": "^1.0.0",
2415+ "is-fullwidth-code-point": "^1.0.0",
2416+ "strip-ansi": "^3.0.0"
2417+ }
2418+ },
2419+ "string_decoder": {
2420+ "version": "1.1.1",
2421+ "bundled": true,
2422+ "dev": true,
2423+ "optional": true,
2424+ "requires": {
2425+ "safe-buffer": "~5.1.0"
2426+ }
2427+ },
2428+ "strip-ansi": {
2429+ "version": "3.0.1",
2430+ "bundled": true,
2431+ "dev": true,
2432+ "requires": {
2433+ "ansi-regex": "^2.0.0"
2434+ }
2435+ },
2436+ "strip-json-comments": {
2437+ "version": "2.0.1",
2438+ "bundled": true,
2439+ "dev": true,
2440+ "optional": true
2441+ },
2442+ "tar": {
2443+ "version": "4.4.1",
2444+ "bundled": true,
2445+ "dev": true,
2446+ "optional": true,
2447+ "requires": {
2448+ "chownr": "^1.0.1",
2449+ "fs-minipass": "^1.2.5",
2450+ "minipass": "^2.2.4",
2451+ "minizlib": "^1.1.0",
2452+ "mkdirp": "^0.5.0",
2453+ "safe-buffer": "^5.1.1",
2454+ "yallist": "^3.0.2"
2455+ }
2456+ },
2457+ "util-deprecate": {
2458+ "version": "1.0.2",
2459+ "bundled": true,
2460+ "dev": true,
2461+ "optional": true
2462+ },
2463+ "wide-align": {
2464+ "version": "1.1.2",
2465+ "bundled": true,
2466+ "dev": true,
2467+ "optional": true,
2468+ "requires": {
2469+ "string-width": "^1.0.2"
2470+ }
2471+ },
2472+ "wrappy": {
2473+ "version": "1.0.2",
2474+ "bundled": true,
2475+ "dev": true
2476+ },
2477+ "yallist": {
2478+ "version": "3.0.2",
2479+ "bundled": true,
2480+ "dev": true
2481+ }
2482+ }
2483+ },
2484+ "function-bind": {
2485+ "version": "1.1.1",
2486+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2487+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2488+ "dev": true
2489+ },
2490+ "get-caller-file": {
2491+ "version": "1.0.3",
2492+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
2493+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
2494+ "dev": true
2495+ },
2496+ "get-stream": {
2497+ "version": "3.0.0",
2498+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2499+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2500+ "dev": true
2501+ },
2502+ "get-value": {
2503+ "version": "2.0.6",
2504+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
2505+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
2506+ "dev": true
2507+ },
2508+ "glob": {
2509+ "version": "7.1.2",
2510+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2511+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2512+ "dev": true,
2513+ "requires": {
2514+ "fs.realpath": "^1.0.0",
2515+ "inflight": "^1.0.4",
2516+ "inherits": "2",
2517+ "minimatch": "^3.0.4",
2518+ "once": "^1.3.0",
2519+ "path-is-absolute": "^1.0.0"
2520+ }
2521+ },
2522+ "glob-parent": {
2523+ "version": "3.1.0",
2524+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
2525+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
2526+ "dev": true,
2527+ "requires": {
2528+ "is-glob": "^3.1.0",
2529+ "path-dirname": "^1.0.0"
2530+ },
2531+ "dependencies": {
2532+ "is-glob": {
2533+ "version": "3.1.0",
2534+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
2535+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
2536+ "dev": true,
2537+ "requires": {
2538+ "is-extglob": "^2.1.0"
2539+ }
2540+ }
2541+ }
2542+ },
2543+ "global-modules-path": {
2544+ "version": "2.3.0",
2545+ "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
2546+ "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
2547+ "dev": true
2548+ },
2549+ "globby": {
2550+ "version": "6.1.0",
2551+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
2552+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
2553+ "dev": true,
2554+ "requires": {
2555+ "array-union": "^1.0.1",
2556+ "glob": "^7.0.3",
2557+ "object-assign": "^4.0.1",
2558+ "pify": "^2.0.0",
2559+ "pinkie-promise": "^2.0.0"
2560+ },
2561+ "dependencies": {
2562+ "pify": {
2563+ "version": "2.3.0",
2564+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2565+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2566+ "dev": true
2567+ }
2568+ }
2569+ },
2570+ "graceful-fs": {
2571+ "version": "4.1.11",
2572+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2573+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2574+ "dev": true
2575+ },
2576+ "handle-thing": {
2577+ "version": "1.2.5",
2578+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
2579+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
2580+ "dev": true
2581+ },
2582+ "has": {
2583+ "version": "1.0.3",
2584+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2585+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2586+ "dev": true,
2587+ "requires": {
2588+ "function-bind": "^1.1.1"
2589+ }
2590+ },
2591+ "has-flag": {
2592+ "version": "3.0.0",
2593+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2594+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2595+ "dev": true
2596+ },
2597+ "has-value": {
2598+ "version": "1.0.0",
2599+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
2600+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
2601+ "dev": true,
2602+ "requires": {
2603+ "get-value": "^2.0.6",
2604+ "has-values": "^1.0.0",
2605+ "isobject": "^3.0.0"
2606+ }
2607+ },
2608+ "has-values": {
2609+ "version": "1.0.0",
2610+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
2611+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
2612+ "dev": true,
2613+ "requires": {
2614+ "is-number": "^3.0.0",
2615+ "kind-of": "^4.0.0"
2616+ },
2617+ "dependencies": {
2618+ "kind-of": {
2619+ "version": "4.0.0",
2620+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2621+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2622+ "dev": true,
2623+ "requires": {
2624+ "is-buffer": "^1.1.5"
2625+ }
2626+ }
2627+ }
2628+ },
2629+ "hash-base": {
2630+ "version": "3.0.4",
2631+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
2632+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
2633+ "dev": true,
2634+ "requires": {
2635+ "inherits": "^2.0.1",
2636+ "safe-buffer": "^5.0.1"
2637+ }
2638+ },
2639+ "hash.js": {
2640+ "version": "1.1.5",
2641+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
2642+ "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
2643+ "dev": true,
2644+ "requires": {
2645+ "inherits": "^2.0.3",
2646+ "minimalistic-assert": "^1.0.1"
2647+ }
2648+ },
2649+ "he": {
2650+ "version": "1.1.1",
2651+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2652+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2653+ "dev": true
2654+ },
2655+ "hmac-drbg": {
2656+ "version": "1.0.1",
2657+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2658+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2659+ "dev": true,
2660+ "requires": {
2661+ "hash.js": "^1.0.3",
2662+ "minimalistic-assert": "^1.0.0",
2663+ "minimalistic-crypto-utils": "^1.0.1"
2664+ }
2665+ },
2666+ "hpack.js": {
2667+ "version": "2.1.6",
2668+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
2669+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
2670+ "dev": true,
2671+ "requires": {
2672+ "inherits": "^2.0.1",
2673+ "obuf": "^1.0.0",
2674+ "readable-stream": "^2.0.1",
2675+ "wbuf": "^1.1.0"
2676+ }
2677+ },
2678+ "html-entities": {
2679+ "version": "1.2.1",
2680+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
2681+ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
2682+ "dev": true
2683+ },
2684+ "html-minifier": {
2685+ "version": "3.5.19",
2686+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz",
2687+ "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==",
2688+ "dev": true,
2689+ "requires": {
2690+ "camel-case": "3.0.x",
2691+ "clean-css": "4.1.x",
2692+ "commander": "2.16.x",
2693+ "he": "1.1.x",
2694+ "param-case": "2.1.x",
2695+ "relateurl": "0.2.x",
2696+ "uglify-js": "3.4.x"
2697+ },
2698+ "dependencies": {
2699+ "commander": {
2700+ "version": "2.16.0",
2701+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
2702+ "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
2703+ "dev": true
2704+ },
2705+ "source-map": {
2706+ "version": "0.6.1",
2707+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2708+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2709+ "dev": true
2710+ },
2711+ "uglify-js": {
2712+ "version": "3.4.7",
2713+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz",
2714+ "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==",
2715+ "dev": true,
2716+ "requires": {
2717+ "commander": "~2.16.0",
2718+ "source-map": "~0.6.1"
2719+ }
2720+ }
2721+ }
2722+ },
2723+ "html-webpack-plugin": {
2724+ "version": "3.2.0",
2725+ "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
2726+ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
2727+ "dev": true,
2728+ "requires": {
2729+ "html-minifier": "^3.2.3",
2730+ "loader-utils": "^0.2.16",
2731+ "lodash": "^4.17.3",
2732+ "pretty-error": "^2.0.2",
2733+ "tapable": "^1.0.0",
2734+ "toposort": "^1.0.0",
2735+ "util.promisify": "1.0.0"
2736+ },
2737+ "dependencies": {
2738+ "loader-utils": {
2739+ "version": "0.2.17",
2740+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
2741+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
2742+ "dev": true,
2743+ "requires": {
2744+ "big.js": "^3.1.3",
2745+ "emojis-list": "^2.0.0",
2746+ "json5": "^0.5.0",
2747+ "object-assign": "^4.0.1"
2748+ }
2749+ }
2750+ }
2751+ },
2752+ "htmlparser2": {
2753+ "version": "3.3.0",
2754+ "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
2755+ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
2756+ "dev": true,
2757+ "requires": {
2758+ "domelementtype": "1",
2759+ "domhandler": "2.1",
2760+ "domutils": "1.1",
2761+ "readable-stream": "1.0"
2762+ },
2763+ "dependencies": {
2764+ "domutils": {
2765+ "version": "1.1.6",
2766+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
2767+ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
2768+ "dev": true,
2769+ "requires": {
2770+ "domelementtype": "1"
2771+ }
2772+ },
2773+ "isarray": {
2774+ "version": "0.0.1",
2775+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2776+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
2777+ "dev": true
2778+ },
2779+ "readable-stream": {
2780+ "version": "1.0.34",
2781+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2782+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2783+ "dev": true,
2784+ "requires": {
2785+ "core-util-is": "~1.0.0",
2786+ "inherits": "~2.0.1",
2787+ "isarray": "0.0.1",
2788+ "string_decoder": "~0.10.x"
2789+ }
2790+ },
2791+ "string_decoder": {
2792+ "version": "0.10.31",
2793+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2794+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
2795+ "dev": true
2796+ }
2797+ }
2798+ },
2799+ "http-deceiver": {
2800+ "version": "1.2.7",
2801+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
2802+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
2803+ "dev": true
2804+ },
2805+ "http-errors": {
2806+ "version": "1.6.3",
2807+ "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
2808+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
2809+ "dev": true,
2810+ "requires": {
2811+ "depd": "~1.1.2",
2812+ "inherits": "2.0.3",
2813+ "setprototypeof": "1.1.0",
2814+ "statuses": ">= 1.4.0 < 2"
2815+ }
2816+ },
2817+ "http-parser-js": {
2818+ "version": "0.5.0",
2819+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
2820+ "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
2821+ "dev": true
2822+ },
2823+ "http-proxy": {
2824+ "version": "1.17.0",
2825+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
2826+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
2827+ "dev": true,
2828+ "requires": {
2829+ "eventemitter3": "^3.0.0",
2830+ "follow-redirects": "^1.0.0",
2831+ "requires-port": "^1.0.0"
2832+ }
2833+ },
2834+ "http-proxy-middleware": {
2835+ "version": "0.18.0",
2836+ "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
2837+ "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
2838+ "dev": true,
2839+ "requires": {
2840+ "http-proxy": "^1.16.2",
2841+ "is-glob": "^4.0.0",
2842+ "lodash": "^4.17.5",
2843+ "micromatch": "^3.1.9"
2844+ }
2845+ },
2846+ "https-browserify": {
2847+ "version": "1.0.0",
2848+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2849+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2850+ "dev": true
2851+ },
2852+ "iconv-lite": {
2853+ "version": "0.4.23",
2854+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
2855+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
2856+ "dev": true,
2857+ "requires": {
2858+ "safer-buffer": ">= 2.1.2 < 3"
2859+ }
2860+ },
2861+ "ieee754": {
2862+ "version": "1.1.12",
2863+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
2864+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
2865+ "dev": true
2866+ },
2867+ "iferr": {
2868+ "version": "0.1.5",
2869+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
2870+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
2871+ "dev": true
2872+ },
2873+ "import-local": {
2874+ "version": "2.0.0",
2875+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
2876+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
2877+ "dev": true,
2878+ "requires": {
2879+ "pkg-dir": "^3.0.0",
2880+ "resolve-cwd": "^2.0.0"
2881+ },
2882+ "dependencies": {
2883+ "find-up": {
2884+ "version": "3.0.0",
2885+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2886+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2887+ "dev": true,
2888+ "requires": {
2889+ "locate-path": "^3.0.0"
2890+ }
2891+ },
2892+ "locate-path": {
2893+ "version": "3.0.0",
2894+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2895+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2896+ "dev": true,
2897+ "requires": {
2898+ "p-locate": "^3.0.0",
2899+ "path-exists": "^3.0.0"
2900+ }
2901+ },
2902+ "p-limit": {
2903+ "version": "2.0.0",
2904+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
2905+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
2906+ "dev": true,
2907+ "requires": {
2908+ "p-try": "^2.0.0"
2909+ }
2910+ },
2911+ "p-locate": {
2912+ "version": "3.0.0",
2913+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2914+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2915+ "dev": true,
2916+ "requires": {
2917+ "p-limit": "^2.0.0"
2918+ }
2919+ },
2920+ "p-try": {
2921+ "version": "2.0.0",
2922+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
2923+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
2924+ "dev": true
2925+ },
2926+ "pkg-dir": {
2927+ "version": "3.0.0",
2928+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
2929+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
2930+ "dev": true,
2931+ "requires": {
2932+ "find-up": "^3.0.0"
2933+ }
2934+ }
2935+ }
2936+ },
2937+ "imurmurhash": {
2938+ "version": "0.1.4",
2939+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2940+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2941+ "dev": true
2942+ },
2943+ "indexof": {
2944+ "version": "0.0.1",
2945+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2946+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2947+ "dev": true
2948+ },
2949+ "inflight": {
2950+ "version": "1.0.6",
2951+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2952+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2953+ "dev": true,
2954+ "requires": {
2955+ "once": "^1.3.0",
2956+ "wrappy": "1"
2957+ }
2958+ },
2959+ "inherits": {
2960+ "version": "2.0.3",
2961+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2962+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2963+ "dev": true
2964+ },
2965+ "internal-ip": {
2966+ "version": "3.0.1",
2967+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
2968+ "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
2969+ "dev": true,
2970+ "requires": {
2971+ "default-gateway": "^2.6.0",
2972+ "ipaddr.js": "^1.5.2"
2973+ }
2974+ },
2975+ "interpret": {
2976+ "version": "1.1.0",
2977+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2978+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2979+ "dev": true
2980+ },
2981+ "invert-kv": {
2982+ "version": "2.0.0",
2983+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
2984+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
2985+ "dev": true
2986+ },
2987+ "ip": {
2988+ "version": "1.1.5",
2989+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
2990+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
2991+ "dev": true
2992+ },
2993+ "ip-regex": {
2994+ "version": "2.1.0",
2995+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
2996+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
2997+ "dev": true
2998+ },
2999+ "ipaddr.js": {
3000+ "version": "1.8.0",
3001+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
3002+ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
3003+ "dev": true
3004+ },
3005+ "is-accessor-descriptor": {
3006+ "version": "0.1.6",
3007+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
3008+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
3009+ "dev": true,
3010+ "requires": {
3011+ "kind-of": "^3.0.2"
3012+ },
3013+ "dependencies": {
3014+ "kind-of": {
3015+ "version": "3.2.2",
3016+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3017+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3018+ "dev": true,
3019+ "requires": {
3020+ "is-buffer": "^1.1.5"
3021+ }
3022+ }
3023+ }
3024+ },
3025+ "is-binary-path": {
3026+ "version": "1.0.1",
3027+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
3028+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
3029+ "dev": true,
3030+ "requires": {
3031+ "binary-extensions": "^1.0.0"
3032+ }
3033+ },
3034+ "is-buffer": {
3035+ "version": "1.1.6",
3036+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3037+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3038+ "dev": true
3039+ },
3040+ "is-callable": {
3041+ "version": "1.1.4",
3042+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
3043+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
3044+ "dev": true
3045+ },
3046+ "is-data-descriptor": {
3047+ "version": "0.1.4",
3048+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
3049+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
3050+ "dev": true,
3051+ "requires": {
3052+ "kind-of": "^3.0.2"
3053+ },
3054+ "dependencies": {
3055+ "kind-of": {
3056+ "version": "3.2.2",
3057+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3058+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3059+ "dev": true,
3060+ "requires": {
3061+ "is-buffer": "^1.1.5"
3062+ }
3063+ }
3064+ }
3065+ },
3066+ "is-date-object": {
3067+ "version": "1.0.1",
3068+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
3069+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
3070+ "dev": true
3071+ },
3072+ "is-descriptor": {
3073+ "version": "0.1.6",
3074+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
3075+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
3076+ "dev": true,
3077+ "requires": {
3078+ "is-accessor-descriptor": "^0.1.6",
3079+ "is-data-descriptor": "^0.1.4",
3080+ "kind-of": "^5.0.0"
3081+ },
3082+ "dependencies": {
3083+ "kind-of": {
3084+ "version": "5.1.0",
3085+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
3086+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
3087+ "dev": true
3088+ }
3089+ }
3090+ },
3091+ "is-extendable": {
3092+ "version": "0.1.1",
3093+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3094+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3095+ "dev": true
3096+ },
3097+ "is-extglob": {
3098+ "version": "2.1.1",
3099+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3100+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
3101+ "dev": true
3102+ },
3103+ "is-fullwidth-code-point": {
3104+ "version": "2.0.0",
3105+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3106+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3107+ "dev": true
3108+ },
3109+ "is-glob": {
3110+ "version": "4.0.0",
3111+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
3112+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
3113+ "dev": true,
3114+ "requires": {
3115+ "is-extglob": "^2.1.1"
3116+ }
3117+ },
3118+ "is-number": {
3119+ "version": "3.0.0",
3120+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3121+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3122+ "dev": true,
3123+ "requires": {
3124+ "kind-of": "^3.0.2"
3125+ },
3126+ "dependencies": {
3127+ "kind-of": {
3128+ "version": "3.2.2",
3129+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3130+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3131+ "dev": true,
3132+ "requires": {
3133+ "is-buffer": "^1.1.5"
3134+ }
3135+ }
3136+ }
3137+ },
3138+ "is-path-cwd": {
3139+ "version": "1.0.0",
3140+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
3141+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
3142+ "dev": true
3143+ },
3144+ "is-path-in-cwd": {
3145+ "version": "1.0.1",
3146+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
3147+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
3148+ "dev": true,
3149+ "requires": {
3150+ "is-path-inside": "^1.0.0"
3151+ }
3152+ },
3153+ "is-path-inside": {
3154+ "version": "1.0.1",
3155+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
3156+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
3157+ "dev": true,
3158+ "requires": {
3159+ "path-is-inside": "^1.0.1"
3160+ }
3161+ },
3162+ "is-plain-object": {
3163+ "version": "2.0.4",
3164+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3165+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3166+ "dev": true,
3167+ "requires": {
3168+ "isobject": "^3.0.1"
3169+ }
3170+ },
3171+ "is-regex": {
3172+ "version": "1.0.4",
3173+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
3174+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
3175+ "dev": true,
3176+ "requires": {
3177+ "has": "^1.0.1"
3178+ }
3179+ },
3180+ "is-stream": {
3181+ "version": "1.1.0",
3182+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
3183+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
3184+ "dev": true
3185+ },
3186+ "is-symbol": {
3187+ "version": "1.0.1",
3188+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
3189+ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
3190+ "dev": true
3191+ },
3192+ "is-windows": {
3193+ "version": "1.0.2",
3194+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
3195+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
3196+ "dev": true
3197+ },
3198+ "is-wsl": {
3199+ "version": "1.1.0",
3200+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
3201+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
3202+ "dev": true
3203+ },
3204+ "isarray": {
3205+ "version": "1.0.0",
3206+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3207+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3208+ "dev": true
3209+ },
3210+ "isexe": {
3211+ "version": "2.0.0",
3212+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3213+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
3214+ "dev": true
3215+ },
3216+ "isobject": {
3217+ "version": "3.0.1",
3218+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3219+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
3220+ "dev": true
3221+ },
3222+ "json-parse-better-errors": {
3223+ "version": "1.0.2",
3224+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
3225+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
3226+ "dev": true
3227+ },
3228+ "json-schema-traverse": {
3229+ "version": "0.4.1",
3230+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
3231+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
3232+ "dev": true
3233+ },
3234+ "json3": {
3235+ "version": "3.3.2",
3236+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
3237+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
3238+ "dev": true
3239+ },
3240+ "json5": {
3241+ "version": "0.5.1",
3242+ "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
3243+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
3244+ "dev": true
3245+ },
3246+ "killable": {
3247+ "version": "1.0.1",
3248+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
3249+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
3250+ "dev": true
3251+ },
3252+ "kind-of": {
3253+ "version": "6.0.2",
3254+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
3255+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
3256+ "dev": true
3257+ },
3258+ "lcid": {
3259+ "version": "2.0.0",
3260+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
3261+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
3262+ "dev": true,
3263+ "requires": {
3264+ "invert-kv": "^2.0.0"
3265+ }
3266+ },
3267+ "loader-runner": {
3268+ "version": "2.3.1",
3269+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
3270+ "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
3271+ "dev": true
3272+ },
3273+ "loader-utils": {
3274+ "version": "1.1.0",
3275+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
3276+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
3277+ "dev": true,
3278+ "requires": {
3279+ "big.js": "^3.1.3",
3280+ "emojis-list": "^2.0.0",
3281+ "json5": "^0.5.0"
3282+ }
3283+ },
3284+ "locate-path": {
3285+ "version": "2.0.0",
3286+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
3287+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
3288+ "dev": true,
3289+ "requires": {
3290+ "p-locate": "^2.0.0",
3291+ "path-exists": "^3.0.0"
3292+ }
3293+ },
3294+ "lodash": {
3295+ "version": "4.17.10",
3296+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
3297+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
3298+ "dev": true
3299+ },
3300+ "lodash.debounce": {
3301+ "version": "4.0.8",
3302+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3303+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
3304+ "dev": true
3305+ },
3306+ "loglevel": {
3307+ "version": "1.6.1",
3308+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
3309+ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
3310+ "dev": true
3311+ },
3312+ "lower-case": {
3313+ "version": "1.1.4",
3314+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
3315+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
3316+ "dev": true
3317+ },
3318+ "lru-cache": {
3319+ "version": "4.1.3",
3320+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
3321+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
3322+ "dev": true,
3323+ "requires": {
3324+ "pseudomap": "^1.0.2",
3325+ "yallist": "^2.1.2"
3326+ }
3327+ },
3328+ "make-dir": {
3329+ "version": "1.3.0",
3330+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
3331+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
3332+ "dev": true,
3333+ "requires": {
3334+ "pify": "^3.0.0"
3335+ }
3336+ },
3337+ "map-age-cleaner": {
3338+ "version": "0.1.2",
3339+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
3340+ "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
3341+ "dev": true,
3342+ "requires": {
3343+ "p-defer": "^1.0.0"
3344+ }
3345+ },
3346+ "map-cache": {
3347+ "version": "0.2.2",
3348+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
3349+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
3350+ "dev": true
3351+ },
3352+ "map-visit": {
3353+ "version": "1.0.0",
3354+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
3355+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
3356+ "dev": true,
3357+ "requires": {
3358+ "object-visit": "^1.0.0"
3359+ }
3360+ },
3361+ "md5.js": {
3362+ "version": "1.3.5",
3363+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
3364+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
3365+ "dev": true,
3366+ "requires": {
3367+ "hash-base": "^3.0.0",
3368+ "inherits": "^2.0.1",
3369+ "safe-buffer": "^5.1.2"
3370+ }
3371+ },
3372+ "media-typer": {
3373+ "version": "0.3.0",
3374+ "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
3375+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
3376+ "dev": true
3377+ },
3378+ "mem": {
3379+ "version": "4.0.0",
3380+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
3381+ "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
3382+ "dev": true,
3383+ "requires": {
3384+ "map-age-cleaner": "^0.1.1",
3385+ "mimic-fn": "^1.0.0",
3386+ "p-is-promise": "^1.1.0"
3387+ }
3388+ },
3389+ "memory-fs": {
3390+ "version": "0.4.1",
3391+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
3392+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
3393+ "dev": true,
3394+ "requires": {
3395+ "errno": "^0.1.3",
3396+ "readable-stream": "^2.0.1"
3397+ },
3398+ "dependencies": {
3399+ "isarray": {
3400+ "version": "1.0.0",
3401+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3402+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3403+ "dev": true
3404+ },
3405+ "readable-stream": {
3406+ "version": "2.3.6",
3407+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
3408+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
3409+ "dev": true,
3410+ "requires": {
3411+ "core-util-is": "~1.0.0",
3412+ "inherits": "~2.0.3",
3413+ "isarray": "~1.0.0",
3414+ "process-nextick-args": "~2.0.0",
3415+ "safe-buffer": "~5.1.1",
3416+ "string_decoder": "~1.1.1",
3417+ "util-deprecate": "~1.0.1"
3418+ }
3419+ },
3420+ "string_decoder": {
3421+ "version": "1.1.1",
3422+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3423+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3424+ "dev": true,
3425+ "requires": {
3426+ "safe-buffer": "~5.1.0"
3427+ }
3428+ }
3429+ }
3430+ },
3431+ "merge-descriptors": {
3432+ "version": "1.0.1",
3433+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
3434+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
3435+ "dev": true
3436+ },
3437+ "methods": {
3438+ "version": "1.1.2",
3439+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
3440+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
3441+ "dev": true
3442+ },
3443+ "micromatch": {
3444+ "version": "3.1.10",
3445+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
3446+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
3447+ "dev": true,
3448+ "requires": {
3449+ "arr-diff": "^4.0.0",
3450+ "array-unique": "^0.3.2",
3451+ "braces": "^2.3.1",
3452+ "define-property": "^2.0.2",
3453+ "extend-shallow": "^3.0.2",
3454+ "extglob": "^2.0.4",
3455+ "fragment-cache": "^0.2.1",
3456+ "kind-of": "^6.0.2",
3457+ "nanomatch": "^1.2.9",
3458+ "object.pick": "^1.3.0",
3459+ "regex-not": "^1.0.0",
3460+ "snapdragon": "^0.8.1",
3461+ "to-regex": "^3.0.2"
3462+ }
3463+ },
3464+ "miller-rabin": {
3465+ "version": "4.0.1",
3466+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
3467+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
3468+ "dev": true,
3469+ "requires": {
3470+ "bn.js": "^4.0.0",
3471+ "brorand": "^1.0.1"
3472+ }
3473+ },
3474+ "mime": {
3475+ "version": "1.4.1",
3476+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
3477+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
3478+ "dev": true
3479+ },
3480+ "mime-db": {
3481+ "version": "1.37.0",
3482+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
3483+ "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
3484+ "dev": true
3485+ },
3486+ "mime-types": {
3487+ "version": "2.1.21",
3488+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
3489+ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
3490+ "dev": true,
3491+ "requires": {
3492+ "mime-db": "~1.37.0"
3493+ }
3494+ },
3495+ "mimic-fn": {
3496+ "version": "1.2.0",
3497+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
3498+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
3499+ "dev": true
3500+ },
3501+ "minimalistic-assert": {
3502+ "version": "1.0.1",
3503+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
3504+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
3505+ "dev": true
3506+ },
3507+ "minimalistic-crypto-utils": {
3508+ "version": "1.0.1",
3509+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
3510+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
3511+ "dev": true
3512+ },
3513+ "minimatch": {
3514+ "version": "3.0.4",
3515+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3516+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3517+ "dev": true,
3518+ "requires": {
3519+ "brace-expansion": "^1.1.7"
3520+ }
3521+ },
3522+ "minimist": {
3523+ "version": "0.0.8",
3524+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3525+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3526+ "dev": true
3527+ },
3528+ "mississippi": {
3529+ "version": "2.0.0",
3530+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
3531+ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
3532+ "dev": true,
3533+ "requires": {
3534+ "concat-stream": "^1.5.0",
3535+ "duplexify": "^3.4.2",
3536+ "end-of-stream": "^1.1.0",
3537+ "flush-write-stream": "^1.0.0",
3538+ "from2": "^2.1.0",
3539+ "parallel-transform": "^1.1.0",
3540+ "pump": "^2.0.1",
3541+ "pumpify": "^1.3.3",
3542+ "stream-each": "^1.1.0",
3543+ "through2": "^2.0.0"
3544+ }
3545+ },
3546+ "mixin-deep": {
3547+ "version": "1.3.1",
3548+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
3549+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
3550+ "dev": true,
3551+ "requires": {
3552+ "for-in": "^1.0.2",
3553+ "is-extendable": "^1.0.1"
3554+ },
3555+ "dependencies": {
3556+ "is-extendable": {
3557+ "version": "1.0.1",
3558+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
3559+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
3560+ "dev": true,
3561+ "requires": {
3562+ "is-plain-object": "^2.0.4"
3563+ }
3564+ }
3565+ }
3566+ },
3567+ "mkdirp": {
3568+ "version": "0.5.1",
3569+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3570+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3571+ "dev": true,
3572+ "requires": {
3573+ "minimist": "0.0.8"
3574+ }
3575+ },
3576+ "move-concurrently": {
3577+ "version": "1.0.1",
3578+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
3579+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
3580+ "dev": true,
3581+ "requires": {
3582+ "aproba": "^1.1.1",
3583+ "copy-concurrently": "^1.0.0",
3584+ "fs-write-stream-atomic": "^1.0.8",
3585+ "mkdirp": "^0.5.1",
3586+ "rimraf": "^2.5.4",
3587+ "run-queue": "^1.0.3"
3588+ }
3589+ },
3590+ "ms": {
3591+ "version": "2.0.0",
3592+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3593+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3594+ "dev": true
3595+ },
3596+ "multicast-dns": {
3597+ "version": "6.2.3",
3598+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
3599+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
3600+ "dev": true,
3601+ "requires": {
3602+ "dns-packet": "^1.3.1",
3603+ "thunky": "^1.0.2"
3604+ }
3605+ },
3606+ "multicast-dns-service-types": {
3607+ "version": "1.1.0",
3608+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
3609+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
3610+ "dev": true
3611+ },
3612+ "nan": {
3613+ "version": "2.11.1",
3614+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
3615+ "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
3616+ "dev": true,
3617+ "optional": true
3618+ },
3619+ "nanomatch": {
3620+ "version": "1.2.13",
3621+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
3622+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
3623+ "dev": true,
3624+ "requires": {
3625+ "arr-diff": "^4.0.0",
3626+ "array-unique": "^0.3.2",
3627+ "define-property": "^2.0.2",
3628+ "extend-shallow": "^3.0.2",
3629+ "fragment-cache": "^0.2.1",
3630+ "is-windows": "^1.0.2",
3631+ "kind-of": "^6.0.2",
3632+ "object.pick": "^1.3.0",
3633+ "regex-not": "^1.0.0",
3634+ "snapdragon": "^0.8.1",
3635+ "to-regex": "^3.0.1"
3636+ }
3637+ },
3638+ "negotiator": {
3639+ "version": "0.6.1",
3640+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
3641+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
3642+ "dev": true
3643+ },
3644+ "neo-async": {
3645+ "version": "2.5.1",
3646+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
3647+ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
3648+ "dev": true
3649+ },
3650+ "nice-try": {
3651+ "version": "1.0.4",
3652+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
3653+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
3654+ "dev": true
3655+ },
3656+ "no-case": {
3657+ "version": "2.3.2",
3658+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
3659+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
3660+ "dev": true,
3661+ "requires": {
3662+ "lower-case": "^1.1.1"
3663+ }
3664+ },
3665+ "node-forge": {
3666+ "version": "0.7.5",
3667+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
3668+ "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
3669+ "dev": true
3670+ },
3671+ "node-libs-browser": {
3672+ "version": "2.1.0",
3673+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
3674+ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
3675+ "dev": true,
3676+ "requires": {
3677+ "assert": "^1.1.1",
3678+ "browserify-zlib": "^0.2.0",
3679+ "buffer": "^4.3.0",
3680+ "console-browserify": "^1.1.0",
3681+ "constants-browserify": "^1.0.0",
3682+ "crypto-browserify": "^3.11.0",
3683+ "domain-browser": "^1.1.1",
3684+ "events": "^1.0.0",
3685+ "https-browserify": "^1.0.0",
3686+ "os-browserify": "^0.3.0",
3687+ "path-browserify": "0.0.0",
3688+ "process": "^0.11.10",
3689+ "punycode": "^1.2.4",
3690+ "querystring-es3": "^0.2.0",
3691+ "readable-stream": "^2.3.3",
3692+ "stream-browserify": "^2.0.1",
3693+ "stream-http": "^2.7.2",
3694+ "string_decoder": "^1.0.0",
3695+ "timers-browserify": "^2.0.4",
3696+ "tty-browserify": "0.0.0",
3697+ "url": "^0.11.0",
3698+ "util": "^0.10.3",
3699+ "vm-browserify": "0.0.4"
3700+ },
3701+ "dependencies": {
3702+ "punycode": {
3703+ "version": "1.4.1",
3704+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3705+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
3706+ "dev": true
3707+ }
3708+ }
3709+ },
3710+ "normalize-path": {
3711+ "version": "2.1.1",
3712+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3713+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3714+ "dev": true,
3715+ "requires": {
3716+ "remove-trailing-separator": "^1.0.1"
3717+ }
3718+ },
3719+ "npm-run-path": {
3720+ "version": "2.0.2",
3721+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3722+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3723+ "dev": true,
3724+ "requires": {
3725+ "path-key": "^2.0.0"
3726+ }
3727+ },
3728+ "nth-check": {
3729+ "version": "1.0.1",
3730+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
3731+ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
3732+ "dev": true,
3733+ "requires": {
3734+ "boolbase": "~1.0.0"
3735+ }
3736+ },
3737+ "number-is-nan": {
3738+ "version": "1.0.1",
3739+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3740+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3741+ "dev": true
3742+ },
3743+ "object-assign": {
3744+ "version": "4.1.1",
3745+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3746+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3747+ "dev": true
3748+ },
3749+ "object-copy": {
3750+ "version": "0.1.0",
3751+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
3752+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
3753+ "dev": true,
3754+ "requires": {
3755+ "copy-descriptor": "^0.1.0",
3756+ "define-property": "^0.2.5",
3757+ "kind-of": "^3.0.3"
3758+ },
3759+ "dependencies": {
3760+ "define-property": {
3761+ "version": "0.2.5",
3762+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3763+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3764+ "dev": true,
3765+ "requires": {
3766+ "is-descriptor": "^0.1.0"
3767+ }
3768+ },
3769+ "kind-of": {
3770+ "version": "3.2.2",
3771+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3772+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3773+ "dev": true,
3774+ "requires": {
3775+ "is-buffer": "^1.1.5"
3776+ }
3777+ }
3778+ }
3779+ },
3780+ "object-keys": {
3781+ "version": "1.0.12",
3782+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
3783+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
3784+ "dev": true
3785+ },
3786+ "object-visit": {
3787+ "version": "1.0.1",
3788+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
3789+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
3790+ "dev": true,
3791+ "requires": {
3792+ "isobject": "^3.0.0"
3793+ }
3794+ },
3795+ "object.getownpropertydescriptors": {
3796+ "version": "2.0.3",
3797+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
3798+ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
3799+ "dev": true,
3800+ "requires": {
3801+ "define-properties": "^1.1.2",
3802+ "es-abstract": "^1.5.1"
3803+ }
3804+ },
3805+ "object.pick": {
3806+ "version": "1.3.0",
3807+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
3808+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
3809+ "dev": true,
3810+ "requires": {
3811+ "isobject": "^3.0.1"
3812+ }
3813+ },
3814+ "obuf": {
3815+ "version": "1.1.2",
3816+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
3817+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
3818+ "dev": true
3819+ },
3820+ "on-finished": {
3821+ "version": "2.3.0",
3822+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
3823+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
3824+ "dev": true,
3825+ "requires": {
3826+ "ee-first": "1.1.1"
3827+ }
3828+ },
3829+ "on-headers": {
3830+ "version": "1.0.1",
3831+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
3832+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
3833+ "dev": true
3834+ },
3835+ "once": {
3836+ "version": "1.4.0",
3837+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3838+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3839+ "dev": true,
3840+ "requires": {
3841+ "wrappy": "1"
3842+ }
3843+ },
3844+ "opn": {
3845+ "version": "5.4.0",
3846+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
3847+ "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
3848+ "dev": true,
3849+ "requires": {
3850+ "is-wsl": "^1.1.0"
3851+ }
3852+ },
3853+ "original": {
3854+ "version": "1.0.2",
3855+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
3856+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
3857+ "dev": true,
3858+ "requires": {
3859+ "url-parse": "^1.4.3"
3860+ }
3861+ },
3862+ "os-browserify": {
3863+ "version": "0.3.0",
3864+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
3865+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
3866+ "dev": true
3867+ },
3868+ "os-locale": {
3869+ "version": "3.0.1",
3870+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
3871+ "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
3872+ "dev": true,
3873+ "requires": {
3874+ "execa": "^0.10.0",
3875+ "lcid": "^2.0.0",
3876+ "mem": "^4.0.0"
3877+ }
3878+ },
3879+ "p-defer": {
3880+ "version": "1.0.0",
3881+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
3882+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
3883+ "dev": true
3884+ },
3885+ "p-finally": {
3886+ "version": "1.0.0",
3887+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3888+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3889+ "dev": true
3890+ },
3891+ "p-is-promise": {
3892+ "version": "1.1.0",
3893+ "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
3894+ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
3895+ "dev": true
3896+ },
3897+ "p-limit": {
3898+ "version": "1.3.0",
3899+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
3900+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
3901+ "dev": true,
3902+ "requires": {
3903+ "p-try": "^1.0.0"
3904+ }
3905+ },
3906+ "p-locate": {
3907+ "version": "2.0.0",
3908+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3909+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3910+ "dev": true,
3911+ "requires": {
3912+ "p-limit": "^1.1.0"
3913+ }
3914+ },
3915+ "p-map": {
3916+ "version": "1.2.0",
3917+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
3918+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
3919+ "dev": true
3920+ },
3921+ "p-try": {
3922+ "version": "1.0.0",
3923+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
3924+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
3925+ "dev": true
3926+ },
3927+ "pako": {
3928+ "version": "1.0.6",
3929+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
3930+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
3931+ "dev": true
3932+ },
3933+ "parallel-transform": {
3934+ "version": "1.1.0",
3935+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
3936+ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
3937+ "dev": true,
3938+ "requires": {
3939+ "cyclist": "~0.2.2",
3940+ "inherits": "^2.0.3",
3941+ "readable-stream": "^2.1.5"
3942+ }
3943+ },
3944+ "param-case": {
3945+ "version": "2.1.1",
3946+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
3947+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
3948+ "dev": true,
3949+ "requires": {
3950+ "no-case": "^2.2.0"
3951+ }
3952+ },
3953+ "parse-asn1": {
3954+ "version": "5.1.1",
3955+ "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
3956+ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
3957+ "dev": true,
3958+ "requires": {
3959+ "asn1.js": "^4.0.0",
3960+ "browserify-aes": "^1.0.0",
3961+ "create-hash": "^1.1.0",
3962+ "evp_bytestokey": "^1.0.0",
3963+ "pbkdf2": "^3.0.3"
3964+ }
3965+ },
3966+ "parseurl": {
3967+ "version": "1.3.2",
3968+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
3969+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
3970+ "dev": true
3971+ },
3972+ "pascalcase": {
3973+ "version": "0.1.1",
3974+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
3975+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
3976+ "dev": true
3977+ },
3978+ "path-browserify": {
3979+ "version": "0.0.0",
3980+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
3981+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
3982+ "dev": true
3983+ },
3984+ "path-dirname": {
3985+ "version": "1.0.2",
3986+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
3987+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
3988+ "dev": true
3989+ },
3990+ "path-exists": {
3991+ "version": "3.0.0",
3992+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
3993+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
3994+ "dev": true
3995+ },
3996+ "path-is-absolute": {
3997+ "version": "1.0.1",
3998+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3999+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4000+ "dev": true
4001+ },
4002+ "path-is-inside": {
4003+ "version": "1.0.2",
4004+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
4005+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
4006+ "dev": true
4007+ },
4008+ "path-key": {
4009+ "version": "2.0.1",
4010+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
4011+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
4012+ "dev": true
4013+ },
4014+ "path-to-regexp": {
4015+ "version": "0.1.7",
4016+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
4017+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
4018+ "dev": true
4019+ },
4020+ "pbkdf2": {
4021+ "version": "3.0.17",
4022+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
4023+ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
4024+ "dev": true,
4025+ "requires": {
4026+ "create-hash": "^1.1.2",
4027+ "create-hmac": "^1.1.4",
4028+ "ripemd160": "^2.0.1",
4029+ "safe-buffer": "^5.0.1",
4030+ "sha.js": "^2.4.8"
4031+ }
4032+ },
4033+ "pify": {
4034+ "version": "3.0.0",
4035+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4036+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4037+ "dev": true
4038+ },
4039+ "pinkie": {
4040+ "version": "2.0.4",
4041+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
4042+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
4043+ "dev": true
4044+ },
4045+ "pinkie-promise": {
4046+ "version": "2.0.1",
4047+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
4048+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
4049+ "dev": true,
4050+ "requires": {
4051+ "pinkie": "^2.0.0"
4052+ }
4053+ },
4054+ "pkg-dir": {
4055+ "version": "2.0.0",
4056+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
4057+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
4058+ "dev": true,
4059+ "requires": {
4060+ "find-up": "^2.1.0"
4061+ }
4062+ },
4063+ "portfinder": {
4064+ "version": "1.0.19",
4065+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz",
4066+ "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==",
4067+ "dev": true,
4068+ "requires": {
4069+ "async": "^1.5.2",
4070+ "debug": "^2.2.0",
4071+ "mkdirp": "0.5.x"
4072+ },
4073+ "dependencies": {
4074+ "debug": {
4075+ "version": "2.6.9",
4076+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4077+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4078+ "dev": true,
4079+ "requires": {
4080+ "ms": "2.0.0"
4081+ }
4082+ }
4083+ }
4084+ },
4085+ "posix-character-classes": {
4086+ "version": "0.1.1",
4087+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
4088+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
4089+ "dev": true
4090+ },
4091+ "pretty-error": {
4092+ "version": "2.1.1",
4093+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
4094+ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
4095+ "dev": true,
4096+ "requires": {
4097+ "renderkid": "^2.0.1",
4098+ "utila": "~0.4"
4099+ }
4100+ },
4101+ "process": {
4102+ "version": "0.11.10",
4103+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
4104+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
4105+ "dev": true
4106+ },
4107+ "process-nextick-args": {
4108+ "version": "2.0.0",
4109+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
4110+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
4111+ "dev": true
4112+ },
4113+ "promise-inflight": {
4114+ "version": "1.0.1",
4115+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
4116+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
4117+ "dev": true
4118+ },
4119+ "proxy-addr": {
4120+ "version": "2.0.4",
4121+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
4122+ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
4123+ "dev": true,
4124+ "requires": {
4125+ "forwarded": "~0.1.2",
4126+ "ipaddr.js": "1.8.0"
4127+ }
4128+ },
4129+ "prr": {
4130+ "version": "1.0.1",
4131+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
4132+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
4133+ "dev": true
4134+ },
4135+ "pseudomap": {
4136+ "version": "1.0.2",
4137+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
4138+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
4139+ "dev": true
4140+ },
4141+ "public-encrypt": {
4142+ "version": "4.0.3",
4143+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
4144+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
4145+ "dev": true,
4146+ "requires": {
4147+ "bn.js": "^4.1.0",
4148+ "browserify-rsa": "^4.0.0",
4149+ "create-hash": "^1.1.0",
4150+ "parse-asn1": "^5.0.0",
4151+ "randombytes": "^2.0.1",
4152+ "safe-buffer": "^5.1.2"
4153+ }
4154+ },
4155+ "pump": {
4156+ "version": "2.0.1",
4157+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
4158+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
4159+ "dev": true,
4160+ "requires": {
4161+ "end-of-stream": "^1.1.0",
4162+ "once": "^1.3.1"
4163+ }
4164+ },
4165+ "pumpify": {
4166+ "version": "1.5.1",
4167+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
4168+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
4169+ "dev": true,
4170+ "requires": {
4171+ "duplexify": "^3.6.0",
4172+ "inherits": "^2.0.3",
4173+ "pump": "^2.0.0"
4174+ }
4175+ },
4176+ "punycode": {
4177+ "version": "2.1.1",
4178+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
4179+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
4180+ "dev": true
4181+ },
4182+ "qs": {
4183+ "version": "6.5.2",
4184+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
4185+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
4186+ "dev": true
4187+ },
4188+ "querystring": {
4189+ "version": "0.2.0",
4190+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
4191+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
4192+ "dev": true
4193+ },
4194+ "querystring-es3": {
4195+ "version": "0.2.1",
4196+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
4197+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
4198+ "dev": true
4199+ },
4200+ "querystringify": {
4201+ "version": "2.1.0",
4202+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
4203+ "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
4204+ "dev": true
4205+ },
4206+ "randombytes": {
4207+ "version": "2.0.6",
4208+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
4209+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
4210+ "dev": true,
4211+ "requires": {
4212+ "safe-buffer": "^5.1.0"
4213+ }
4214+ },
4215+ "randomfill": {
4216+ "version": "1.0.4",
4217+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
4218+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
4219+ "dev": true,
4220+ "requires": {
4221+ "randombytes": "^2.0.5",
4222+ "safe-buffer": "^5.1.0"
4223+ }
4224+ },
4225+ "range-parser": {
4226+ "version": "1.2.0",
4227+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
4228+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
4229+ "dev": true
4230+ },
4231+ "raw-body": {
4232+ "version": "2.3.3",
4233+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
4234+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
4235+ "dev": true,
4236+ "requires": {
4237+ "bytes": "3.0.0",
4238+ "http-errors": "1.6.3",
4239+ "iconv-lite": "0.4.23",
4240+ "unpipe": "1.0.0"
4241+ }
4242+ },
4243+ "readable-stream": {
4244+ "version": "2.3.6",
4245+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4246+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4247+ "dev": true,
4248+ "requires": {
4249+ "core-util-is": "~1.0.0",
4250+ "inherits": "~2.0.3",
4251+ "isarray": "~1.0.0",
4252+ "process-nextick-args": "~2.0.0",
4253+ "safe-buffer": "~5.1.1",
4254+ "string_decoder": "~1.1.1",
4255+ "util-deprecate": "~1.0.1"
4256+ }
4257+ },
4258+ "readdirp": {
4259+ "version": "2.1.0",
4260+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
4261+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
4262+ "dev": true,
4263+ "requires": {
4264+ "graceful-fs": "^4.1.2",
4265+ "minimatch": "^3.0.2",
4266+ "readable-stream": "^2.0.2",
4267+ "set-immediate-shim": "^1.0.1"
4268+ },
4269+ "dependencies": {
4270+ "isarray": {
4271+ "version": "1.0.0",
4272+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4273+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
4274+ "dev": true
4275+ },
4276+ "readable-stream": {
4277+ "version": "2.3.6",
4278+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4279+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4280+ "dev": true,
4281+ "requires": {
4282+ "core-util-is": "~1.0.0",
4283+ "inherits": "~2.0.3",
4284+ "isarray": "~1.0.0",
4285+ "process-nextick-args": "~2.0.0",
4286+ "safe-buffer": "~5.1.1",
4287+ "string_decoder": "~1.1.1",
4288+ "util-deprecate": "~1.0.1"
4289+ }
4290+ },
4291+ "string_decoder": {
4292+ "version": "1.1.1",
4293+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4294+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4295+ "dev": true,
4296+ "requires": {
4297+ "safe-buffer": "~5.1.0"
4298+ }
4299+ }
4300+ }
4301+ },
4302+ "regex-not": {
4303+ "version": "1.0.2",
4304+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
4305+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
4306+ "dev": true,
4307+ "requires": {
4308+ "extend-shallow": "^3.0.2",
4309+ "safe-regex": "^1.1.0"
4310+ }
4311+ },
4312+ "relateurl": {
4313+ "version": "0.2.7",
4314+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
4315+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
4316+ "dev": true
4317+ },
4318+ "remove-trailing-separator": {
4319+ "version": "1.1.0",
4320+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
4321+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
4322+ "dev": true
4323+ },
4324+ "renderkid": {
4325+ "version": "2.0.1",
4326+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
4327+ "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
4328+ "dev": true,
4329+ "requires": {
4330+ "css-select": "^1.1.0",
4331+ "dom-converter": "~0.1",
4332+ "htmlparser2": "~3.3.0",
4333+ "strip-ansi": "^3.0.0",
4334+ "utila": "~0.3"
4335+ },
4336+ "dependencies": {
4337+ "utila": {
4338+ "version": "0.3.3",
4339+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
4340+ "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
4341+ "dev": true
4342+ }
4343+ }
4344+ },
4345+ "repeat-element": {
4346+ "version": "1.1.2",
4347+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
4348+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
4349+ "dev": true
4350+ },
4351+ "repeat-string": {
4352+ "version": "1.6.1",
4353+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
4354+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
4355+ "dev": true
4356+ },
4357+ "require-directory": {
4358+ "version": "2.1.1",
4359+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4360+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
4361+ "dev": true
4362+ },
4363+ "require-main-filename": {
4364+ "version": "1.0.1",
4365+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
4366+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
4367+ "dev": true
4368+ },
4369+ "requires-port": {
4370+ "version": "1.0.0",
4371+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
4372+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
4373+ "dev": true
4374+ },
4375+ "resolve-cwd": {
4376+ "version": "2.0.0",
4377+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
4378+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
4379+ "dev": true,
4380+ "requires": {
4381+ "resolve-from": "^3.0.0"
4382+ }
4383+ },
4384+ "resolve-from": {
4385+ "version": "3.0.0",
4386+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
4387+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
4388+ "dev": true
4389+ },
4390+ "resolve-url": {
4391+ "version": "0.2.1",
4392+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
4393+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
4394+ "dev": true
4395+ },
4396+ "ret": {
4397+ "version": "0.1.15",
4398+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
4399+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
4400+ "dev": true
4401+ },
4402+ "rimraf": {
4403+ "version": "2.6.2",
4404+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
4405+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
4406+ "dev": true,
4407+ "requires": {
4408+ "glob": "^7.0.5"
4409+ }
4410+ },
4411+ "ripemd160": {
4412+ "version": "2.0.2",
4413+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
4414+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
4415+ "dev": true,
4416+ "requires": {
4417+ "hash-base": "^3.0.0",
4418+ "inherits": "^2.0.1"
4419+ }
4420+ },
4421+ "run-queue": {
4422+ "version": "1.0.3",
4423+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
4424+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
4425+ "dev": true,
4426+ "requires": {
4427+ "aproba": "^1.1.1"
4428+ }
4429+ },
4430+ "safe-buffer": {
4431+ "version": "5.1.2",
4432+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
4433+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
4434+ "dev": true
4435+ },
4436+ "safe-regex": {
4437+ "version": "1.1.0",
4438+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
4439+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
4440+ "dev": true,
4441+ "requires": {
4442+ "ret": "~0.1.10"
4443+ }
4444+ },
4445+ "safer-buffer": {
4446+ "version": "2.1.2",
4447+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4448+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
4449+ "dev": true
4450+ },
4451+ "schema-utils": {
4452+ "version": "0.4.7",
4453+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
4454+ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
4455+ "dev": true,
4456+ "requires": {
4457+ "ajv": "^6.1.0",
4458+ "ajv-keywords": "^3.1.0"
4459+ }
4460+ },
4461+ "select-hose": {
4462+ "version": "2.0.0",
4463+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
4464+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
4465+ "dev": true
4466+ },
4467+ "selfsigned": {
4468+ "version": "1.10.4",
4469+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
4470+ "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
4471+ "dev": true,
4472+ "requires": {
4473+ "node-forge": "0.7.5"
4474+ }
4475+ },
4476+ "semver": {
4477+ "version": "5.5.0",
4478+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
4479+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
4480+ "dev": true
4481+ },
4482+ "send": {
4483+ "version": "0.16.2",
4484+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
4485+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
4486+ "dev": true,
4487+ "requires": {
4488+ "debug": "2.6.9",
4489+ "depd": "~1.1.2",
4490+ "destroy": "~1.0.4",
4491+ "encodeurl": "~1.0.2",
4492+ "escape-html": "~1.0.3",
4493+ "etag": "~1.8.1",
4494+ "fresh": "0.5.2",
4495+ "http-errors": "~1.6.2",
4496+ "mime": "1.4.1",
4497+ "ms": "2.0.0",
4498+ "on-finished": "~2.3.0",
4499+ "range-parser": "~1.2.0",
4500+ "statuses": "~1.4.0"
4501+ },
4502+ "dependencies": {
4503+ "debug": {
4504+ "version": "2.6.9",
4505+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4506+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4507+ "dev": true,
4508+ "requires": {
4509+ "ms": "2.0.0"
4510+ }
4511+ }
4512+ }
4513+ },
4514+ "serialize-javascript": {
4515+ "version": "1.5.0",
4516+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
4517+ "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
4518+ "dev": true
4519+ },
4520+ "serve-index": {
4521+ "version": "1.9.1",
4522+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
4523+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
4524+ "dev": true,
4525+ "requires": {
4526+ "accepts": "~1.3.4",
4527+ "batch": "0.6.1",
4528+ "debug": "2.6.9",
4529+ "escape-html": "~1.0.3",
4530+ "http-errors": "~1.6.2",
4531+ "mime-types": "~2.1.17",
4532+ "parseurl": "~1.3.2"
4533+ },
4534+ "dependencies": {
4535+ "debug": {
4536+ "version": "2.6.9",
4537+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4538+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4539+ "dev": true,
4540+ "requires": {
4541+ "ms": "2.0.0"
4542+ }
4543+ }
4544+ }
4545+ },
4546+ "serve-static": {
4547+ "version": "1.13.2",
4548+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
4549+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
4550+ "dev": true,
4551+ "requires": {
4552+ "encodeurl": "~1.0.2",
4553+ "escape-html": "~1.0.3",
4554+ "parseurl": "~1.3.2",
4555+ "send": "0.16.2"
4556+ }
4557+ },
4558+ "set-blocking": {
4559+ "version": "2.0.0",
4560+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4561+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
4562+ "dev": true
4563+ },
4564+ "set-immediate-shim": {
4565+ "version": "1.0.1",
4566+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
4567+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
4568+ "dev": true
4569+ },
4570+ "set-value": {
4571+ "version": "2.0.0",
4572+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
4573+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
4574+ "dev": true,
4575+ "requires": {
4576+ "extend-shallow": "^2.0.1",
4577+ "is-extendable": "^0.1.1",
4578+ "is-plain-object": "^2.0.3",
4579+ "split-string": "^3.0.1"
4580+ },
4581+ "dependencies": {
4582+ "extend-shallow": {
4583+ "version": "2.0.1",
4584+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4585+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4586+ "dev": true,
4587+ "requires": {
4588+ "is-extendable": "^0.1.0"
4589+ }
4590+ }
4591+ }
4592+ },
4593+ "setimmediate": {
4594+ "version": "1.0.5",
4595+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
4596+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
4597+ "dev": true
4598+ },
4599+ "setprototypeof": {
4600+ "version": "1.1.0",
4601+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
4602+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
4603+ "dev": true
4604+ },
4605+ "sha.js": {
4606+ "version": "2.4.11",
4607+ "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
4608+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
4609+ "dev": true,
4610+ "requires": {
4611+ "inherits": "^2.0.1",
4612+ "safe-buffer": "^5.0.1"
4613+ }
4614+ },
4615+ "shebang-command": {
4616+ "version": "1.2.0",
4617+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
4618+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
4619+ "dev": true,
4620+ "requires": {
4621+ "shebang-regex": "^1.0.0"
4622+ }
4623+ },
4624+ "shebang-regex": {
4625+ "version": "1.0.0",
4626+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
4627+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
4628+ "dev": true
4629+ },
4630+ "signal-exit": {
4631+ "version": "3.0.2",
4632+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
4633+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
4634+ "dev": true
4635+ },
4636+ "snapdragon": {
4637+ "version": "0.8.2",
4638+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
4639+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
4640+ "dev": true,
4641+ "requires": {
4642+ "base": "^0.11.1",
4643+ "debug": "^2.2.0",
4644+ "define-property": "^0.2.5",
4645+ "extend-shallow": "^2.0.1",
4646+ "map-cache": "^0.2.2",
4647+ "source-map": "^0.5.6",
4648+ "source-map-resolve": "^0.5.0",
4649+ "use": "^3.1.0"
4650+ },
4651+ "dependencies": {
4652+ "debug": {
4653+ "version": "2.6.9",
4654+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4655+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4656+ "dev": true,
4657+ "requires": {
4658+ "ms": "2.0.0"
4659+ }
4660+ },
4661+ "define-property": {
4662+ "version": "0.2.5",
4663+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4664+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4665+ "dev": true,
4666+ "requires": {
4667+ "is-descriptor": "^0.1.0"
4668+ }
4669+ },
4670+ "extend-shallow": {
4671+ "version": "2.0.1",
4672+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4673+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4674+ "dev": true,
4675+ "requires": {
4676+ "is-extendable": "^0.1.0"
4677+ }
4678+ }
4679+ }
4680+ },
4681+ "snapdragon-node": {
4682+ "version": "2.1.1",
4683+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
4684+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
4685+ "dev": true,
4686+ "requires": {
4687+ "define-property": "^1.0.0",
4688+ "isobject": "^3.0.0",
4689+ "snapdragon-util": "^3.0.1"
4690+ },
4691+ "dependencies": {
4692+ "define-property": {
4693+ "version": "1.0.0",
4694+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
4695+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
4696+ "dev": true,
4697+ "requires": {
4698+ "is-descriptor": "^1.0.0"
4699+ }
4700+ },
4701+ "is-accessor-descriptor": {
4702+ "version": "1.0.0",
4703+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
4704+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
4705+ "dev": true,
4706+ "requires": {
4707+ "kind-of": "^6.0.0"
4708+ }
4709+ },
4710+ "is-data-descriptor": {
4711+ "version": "1.0.0",
4712+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
4713+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
4714+ "dev": true,
4715+ "requires": {
4716+ "kind-of": "^6.0.0"
4717+ }
4718+ },
4719+ "is-descriptor": {
4720+ "version": "1.0.2",
4721+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
4722+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
4723+ "dev": true,
4724+ "requires": {
4725+ "is-accessor-descriptor": "^1.0.0",
4726+ "is-data-descriptor": "^1.0.0",
4727+ "kind-of": "^6.0.2"
4728+ }
4729+ }
4730+ }
4731+ },
4732+ "snapdragon-util": {
4733+ "version": "3.0.1",
4734+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
4735+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
4736+ "dev": true,
4737+ "requires": {
4738+ "kind-of": "^3.2.0"
4739+ },
4740+ "dependencies": {
4741+ "kind-of": {
4742+ "version": "3.2.2",
4743+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4744+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4745+ "dev": true,
4746+ "requires": {
4747+ "is-buffer": "^1.1.5"
4748+ }
4749+ }
4750+ }
4751+ },
4752+ "sockjs": {
4753+ "version": "0.3.19",
4754+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
4755+ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
4756+ "dev": true,
4757+ "requires": {
4758+ "faye-websocket": "^0.10.0",
4759+ "uuid": "^3.0.1"
4760+ }
4761+ },
4762+ "sockjs-client": {
4763+ "version": "1.3.0",
4764+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
4765+ "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
4766+ "dev": true,
4767+ "requires": {
4768+ "debug": "^3.2.5",
4769+ "eventsource": "^1.0.7",
4770+ "faye-websocket": "~0.11.1",
4771+ "inherits": "^2.0.3",
4772+ "json3": "^3.3.2",
4773+ "url-parse": "^1.4.3"
4774+ },
4775+ "dependencies": {
4776+ "faye-websocket": {
4777+ "version": "0.11.1",
4778+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
4779+ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
4780+ "dev": true,
4781+ "requires": {
4782+ "websocket-driver": ">=0.5.1"
4783+ }
4784+ }
4785+ }
4786+ },
4787+ "source-list-map": {
4788+ "version": "2.0.1",
4789+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
4790+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
4791+ "dev": true
4792+ },
4793+ "source-map": {
4794+ "version": "0.5.7",
4795+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4796+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4797+ "dev": true
4798+ },
4799+ "source-map-resolve": {
4800+ "version": "0.5.2",
4801+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
4802+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
4803+ "dev": true,
4804+ "requires": {
4805+ "atob": "^2.1.1",
4806+ "decode-uri-component": "^0.2.0",
4807+ "resolve-url": "^0.2.1",
4808+ "source-map-url": "^0.4.0",
4809+ "urix": "^0.1.0"
4810+ }
4811+ },
4812+ "source-map-url": {
4813+ "version": "0.4.0",
4814+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
4815+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
4816+ "dev": true
4817+ },
4818+ "spdy": {
4819+ "version": "3.4.7",
4820+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
4821+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
4822+ "dev": true,
4823+ "requires": {
4824+ "debug": "^2.6.8",
4825+ "handle-thing": "^1.2.5",
4826+ "http-deceiver": "^1.2.7",
4827+ "safe-buffer": "^5.0.1",
4828+ "select-hose": "^2.0.0",
4829+ "spdy-transport": "^2.0.18"
4830+ },
4831+ "dependencies": {
4832+ "debug": {
4833+ "version": "2.6.9",
4834+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4835+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4836+ "dev": true,
4837+ "requires": {
4838+ "ms": "2.0.0"
4839+ }
4840+ }
4841+ }
4842+ },
4843+ "spdy-transport": {
4844+ "version": "2.1.0",
4845+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
4846+ "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
4847+ "dev": true,
4848+ "requires": {
4849+ "debug": "^2.6.8",
4850+ "detect-node": "^2.0.3",
4851+ "hpack.js": "^2.1.6",
4852+ "obuf": "^1.1.1",
4853+ "readable-stream": "^2.2.9",
4854+ "safe-buffer": "^5.0.1",
4855+ "wbuf": "^1.7.2"
4856+ },
4857+ "dependencies": {
4858+ "debug": {
4859+ "version": "2.6.9",
4860+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4861+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4862+ "dev": true,
4863+ "requires": {
4864+ "ms": "2.0.0"
4865+ }
4866+ }
4867+ }
4868+ },
4869+ "split-string": {
4870+ "version": "3.1.0",
4871+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
4872+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
4873+ "dev": true,
4874+ "requires": {
4875+ "extend-shallow": "^3.0.0"
4876+ }
4877+ },
4878+ "ssri": {
4879+ "version": "5.3.0",
4880+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
4881+ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
4882+ "dev": true,
4883+ "requires": {
4884+ "safe-buffer": "^5.1.1"
4885+ }
4886+ },
4887+ "static-extend": {
4888+ "version": "0.1.2",
4889+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
4890+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
4891+ "dev": true,
4892+ "requires": {
4893+ "define-property": "^0.2.5",
4894+ "object-copy": "^0.1.0"
4895+ },
4896+ "dependencies": {
4897+ "define-property": {
4898+ "version": "0.2.5",
4899+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4900+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4901+ "dev": true,
4902+ "requires": {
4903+ "is-descriptor": "^0.1.0"
4904+ }
4905+ }
4906+ }
4907+ },
4908+ "statuses": {
4909+ "version": "1.4.0",
4910+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
4911+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
4912+ "dev": true
4913+ },
4914+ "stream-browserify": {
4915+ "version": "2.0.1",
4916+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
4917+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
4918+ "dev": true,
4919+ "requires": {
4920+ "inherits": "~2.0.1",
4921+ "readable-stream": "^2.0.2"
4922+ }
4923+ },
4924+ "stream-each": {
4925+ "version": "1.2.3",
4926+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
4927+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
4928+ "dev": true,
4929+ "requires": {
4930+ "end-of-stream": "^1.1.0",
4931+ "stream-shift": "^1.0.0"
4932+ }
4933+ },
4934+ "stream-http": {
4935+ "version": "2.8.3",
4936+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
4937+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
4938+ "dev": true,
4939+ "requires": {
4940+ "builtin-status-codes": "^3.0.0",
4941+ "inherits": "^2.0.1",
4942+ "readable-stream": "^2.3.6",
4943+ "to-arraybuffer": "^1.0.0",
4944+ "xtend": "^4.0.0"
4945+ }
4946+ },
4947+ "stream-shift": {
4948+ "version": "1.0.0",
4949+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
4950+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
4951+ "dev": true
4952+ },
4953+ "string-width": {
4954+ "version": "2.1.1",
4955+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4956+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4957+ "dev": true,
4958+ "requires": {
4959+ "is-fullwidth-code-point": "^2.0.0",
4960+ "strip-ansi": "^4.0.0"
4961+ },
4962+ "dependencies": {
4963+ "ansi-regex": {
4964+ "version": "3.0.0",
4965+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4966+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4967+ "dev": true
4968+ },
4969+ "strip-ansi": {
4970+ "version": "4.0.0",
4971+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4972+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4973+ "dev": true,
4974+ "requires": {
4975+ "ansi-regex": "^3.0.0"
4976+ }
4977+ }
4978+ }
4979+ },
4980+ "string_decoder": {
4981+ "version": "1.1.1",
4982+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4983+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4984+ "dev": true,
4985+ "requires": {
4986+ "safe-buffer": "~5.1.0"
4987+ }
4988+ },
4989+ "strip-ansi": {
4990+ "version": "3.0.1",
4991+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
4992+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
4993+ "dev": true,
4994+ "requires": {
4995+ "ansi-regex": "^2.0.0"
4996+ }
4997+ },
4998+ "strip-eof": {
4999+ "version": "1.0.0",
5000+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
5001+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
5002+ "dev": true
5003+ },
5004+ "supports-color": {
5005+ "version": "5.4.0",
5006+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
5007+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
5008+ "dev": true,
5009+ "requires": {
5010+ "has-flag": "^3.0.0"
5011+ }
5012+ },
5013+ "tapable": {
5014+ "version": "1.0.0",
5015+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
5016+ "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==",
5017+ "dev": true
5018+ },
5019+ "through2": {
5020+ "version": "2.0.3",
5021+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
5022+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
5023+ "dev": true,
5024+ "requires": {
5025+ "readable-stream": "^2.1.5",
5026+ "xtend": "~4.0.1"
5027+ }
5028+ },
5029+ "thunky": {
5030+ "version": "1.0.3",
5031+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
5032+ "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
5033+ "dev": true
5034+ },
5035+ "timers-browserify": {
5036+ "version": "2.0.10",
5037+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
5038+ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
5039+ "dev": true,
5040+ "requires": {
5041+ "setimmediate": "^1.0.4"
5042+ }
5043+ },
5044+ "to-arraybuffer": {
5045+ "version": "1.0.1",
5046+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
5047+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
5048+ "dev": true
5049+ },
5050+ "to-object-path": {
5051+ "version": "0.3.0",
5052+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
5053+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
5054+ "dev": true,
5055+ "requires": {
5056+ "kind-of": "^3.0.2"
5057+ },
5058+ "dependencies": {
5059+ "kind-of": {
5060+ "version": "3.2.2",
5061+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5062+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5063+ "dev": true,
5064+ "requires": {
5065+ "is-buffer": "^1.1.5"
5066+ }
5067+ }
5068+ }
5069+ },
5070+ "to-regex": {
5071+ "version": "3.0.2",
5072+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
5073+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
5074+ "dev": true,
5075+ "requires": {
5076+ "define-property": "^2.0.2",
5077+ "extend-shallow": "^3.0.2",
5078+ "regex-not": "^1.0.2",
5079+ "safe-regex": "^1.1.0"
5080+ }
5081+ },
5082+ "to-regex-range": {
5083+ "version": "2.1.1",
5084+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
5085+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
5086+ "dev": true,
5087+ "requires": {
5088+ "is-number": "^3.0.0",
5089+ "repeat-string": "^1.6.1"
5090+ }
5091+ },
5092+ "toposort": {
5093+ "version": "1.0.7",
5094+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
5095+ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
5096+ "dev": true
5097+ },
5098+ "tslib": {
5099+ "version": "1.9.3",
5100+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
5101+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
5102+ "dev": true
5103+ },
5104+ "tty-browserify": {
5105+ "version": "0.0.0",
5106+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
5107+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
5108+ "dev": true
5109+ },
5110+ "type-is": {
5111+ "version": "1.6.16",
5112+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
5113+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
5114+ "dev": true,
5115+ "requires": {
5116+ "media-typer": "0.3.0",
5117+ "mime-types": "~2.1.18"
5118+ }
5119+ },
5120+ "typedarray": {
5121+ "version": "0.0.6",
5122+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
5123+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
5124+ "dev": true
5125+ },
5126+ "uglify-es": {
5127+ "version": "3.3.9",
5128+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
5129+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
5130+ "dev": true,
5131+ "requires": {
5132+ "commander": "~2.13.0",
5133+ "source-map": "~0.6.1"
5134+ },
5135+ "dependencies": {
5136+ "source-map": {
5137+ "version": "0.6.1",
5138+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5139+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5140+ "dev": true
5141+ }
5142+ }
5143+ },
5144+ "uglifyjs-webpack-plugin": {
5145+ "version": "1.3.0",
5146+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
5147+ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
5148+ "dev": true,
5149+ "requires": {
5150+ "cacache": "^10.0.4",
5151+ "find-cache-dir": "^1.0.0",
5152+ "schema-utils": "^0.4.5",
5153+ "serialize-javascript": "^1.4.0",
5154+ "source-map": "^0.6.1",
5155+ "uglify-es": "^3.3.4",
5156+ "webpack-sources": "^1.1.0",
5157+ "worker-farm": "^1.5.2"
5158+ },
5159+ "dependencies": {
5160+ "source-map": {
5161+ "version": "0.6.1",
5162+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5163+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5164+ "dev": true
5165+ }
5166+ }
5167+ },
5168+ "union-value": {
5169+ "version": "1.0.0",
5170+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
5171+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
5172+ "dev": true,
5173+ "requires": {
5174+ "arr-union": "^3.1.0",
5175+ "get-value": "^2.0.6",
5176+ "is-extendable": "^0.1.1",
5177+ "set-value": "^0.4.3"
5178+ },
5179+ "dependencies": {
5180+ "extend-shallow": {
5181+ "version": "2.0.1",
5182+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5183+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5184+ "dev": true,
5185+ "requires": {
5186+ "is-extendable": "^0.1.0"
5187+ }
5188+ },
5189+ "set-value": {
5190+ "version": "0.4.3",
5191+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
5192+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
5193+ "dev": true,
5194+ "requires": {
5195+ "extend-shallow": "^2.0.1",
5196+ "is-extendable": "^0.1.1",
5197+ "is-plain-object": "^2.0.1",
5198+ "to-object-path": "^0.3.0"
5199+ }
5200+ }
5201+ }
5202+ },
5203+ "unique-filename": {
5204+ "version": "1.1.1",
5205+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
5206+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
5207+ "dev": true,
5208+ "requires": {
5209+ "unique-slug": "^2.0.0"
5210+ }
5211+ },
5212+ "unique-slug": {
5213+ "version": "2.0.1",
5214+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
5215+ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
5216+ "dev": true,
5217+ "requires": {
5218+ "imurmurhash": "^0.1.4"
5219+ }
5220+ },
5221+ "unpipe": {
5222+ "version": "1.0.0",
5223+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
5224+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
5225+ "dev": true
5226+ },
5227+ "unset-value": {
5228+ "version": "1.0.0",
5229+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
5230+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
5231+ "dev": true,
5232+ "requires": {
5233+ "has-value": "^0.3.1",
5234+ "isobject": "^3.0.0"
5235+ },
5236+ "dependencies": {
5237+ "has-value": {
5238+ "version": "0.3.1",
5239+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
5240+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
5241+ "dev": true,
5242+ "requires": {
5243+ "get-value": "^2.0.3",
5244+ "has-values": "^0.1.4",
5245+ "isobject": "^2.0.0"
5246+ },
5247+ "dependencies": {
5248+ "isobject": {
5249+ "version": "2.1.0",
5250+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
5251+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
5252+ "dev": true,
5253+ "requires": {
5254+ "isarray": "1.0.0"
5255+ }
5256+ }
5257+ }
5258+ },
5259+ "has-values": {
5260+ "version": "0.1.4",
5261+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
5262+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
5263+ "dev": true
5264+ },
5265+ "isarray": {
5266+ "version": "1.0.0",
5267+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5268+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
5269+ "dev": true
5270+ }
5271+ }
5272+ },
5273+ "upath": {
5274+ "version": "1.1.0",
5275+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
5276+ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
5277+ "dev": true
5278+ },
5279+ "upper-case": {
5280+ "version": "1.1.3",
5281+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
5282+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
5283+ "dev": true
5284+ },
5285+ "uri-js": {
5286+ "version": "4.2.2",
5287+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
5288+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
5289+ "dev": true,
5290+ "requires": {
5291+ "punycode": "^2.1.0"
5292+ }
5293+ },
5294+ "urix": {
5295+ "version": "0.1.0",
5296+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
5297+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
5298+ "dev": true
5299+ },
5300+ "url": {
5301+ "version": "0.11.0",
5302+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
5303+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
5304+ "dev": true,
5305+ "requires": {
5306+ "punycode": "1.3.2",
5307+ "querystring": "0.2.0"
5308+ },
5309+ "dependencies": {
5310+ "punycode": {
5311+ "version": "1.3.2",
5312+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
5313+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
5314+ "dev": true
5315+ }
5316+ }
5317+ },
5318+ "url-parse": {
5319+ "version": "1.4.3",
5320+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
5321+ "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
5322+ "dev": true,
5323+ "requires": {
5324+ "querystringify": "^2.0.0",
5325+ "requires-port": "^1.0.0"
5326+ }
5327+ },
5328+ "use": {
5329+ "version": "3.1.1",
5330+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
5331+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
5332+ "dev": true
5333+ },
5334+ "util": {
5335+ "version": "0.10.4",
5336+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
5337+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
5338+ "dev": true,
5339+ "requires": {
5340+ "inherits": "2.0.3"
5341+ }
5342+ },
5343+ "util-deprecate": {
5344+ "version": "1.0.2",
5345+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5346+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
5347+ "dev": true
5348+ },
5349+ "util.promisify": {
5350+ "version": "1.0.0",
5351+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
5352+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
5353+ "dev": true,
5354+ "requires": {
5355+ "define-properties": "^1.1.2",
5356+ "object.getownpropertydescriptors": "^2.0.3"
5357+ }
5358+ },
5359+ "utila": {
5360+ "version": "0.4.0",
5361+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
5362+ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
5363+ "dev": true
5364+ },
5365+ "utils-merge": {
5366+ "version": "1.0.1",
5367+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
5368+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
5369+ "dev": true
5370+ },
5371+ "uuid": {
5372+ "version": "3.3.2",
5373+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
5374+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
5375+ "dev": true
5376+ },
5377+ "v8-compile-cache": {
5378+ "version": "2.0.2",
5379+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
5380+ "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
5381+ "dev": true
5382+ },
5383+ "vary": {
5384+ "version": "1.1.2",
5385+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
5386+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
5387+ "dev": true
5388+ },
5389+ "vm-browserify": {
5390+ "version": "0.0.4",
5391+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
5392+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
5393+ "dev": true,
5394+ "requires": {
5395+ "indexof": "0.0.1"
5396+ }
5397+ },
5398+ "watchpack": {
5399+ "version": "1.6.0",
5400+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
5401+ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
5402+ "dev": true,
5403+ "requires": {
5404+ "chokidar": "^2.0.2",
5405+ "graceful-fs": "^4.1.2",
5406+ "neo-async": "^2.5.0"
5407+ }
5408+ },
5409+ "wbuf": {
5410+ "version": "1.7.3",
5411+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
5412+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
5413+ "dev": true,
5414+ "requires": {
5415+ "minimalistic-assert": "^1.0.0"
5416+ }
5417+ },
5418+ "webpack": {
5419+ "version": "4.25.1",
5420+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.25.1.tgz",
5421+ "integrity": "sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==",
5422+ "dev": true,
5423+ "requires": {
5424+ "@webassemblyjs/ast": "1.7.11",
5425+ "@webassemblyjs/helper-module-context": "1.7.11",
5426+ "@webassemblyjs/wasm-edit": "1.7.11",
5427+ "@webassemblyjs/wasm-parser": "1.7.11",
5428+ "acorn": "^5.6.2",
5429+ "acorn-dynamic-import": "^3.0.0",
5430+ "ajv": "^6.1.0",
5431+ "ajv-keywords": "^3.1.0",
5432+ "chrome-trace-event": "^1.0.0",
5433+ "enhanced-resolve": "^4.1.0",
5434+ "eslint-scope": "^4.0.0",
5435+ "json-parse-better-errors": "^1.0.2",
5436+ "loader-runner": "^2.3.0",
5437+ "loader-utils": "^1.1.0",
5438+ "memory-fs": "~0.4.1",
5439+ "micromatch": "^3.1.8",
5440+ "mkdirp": "~0.5.0",
5441+ "neo-async": "^2.5.0",
5442+ "node-libs-browser": "^2.0.0",
5443+ "schema-utils": "^0.4.4",
5444+ "tapable": "^1.1.0",
5445+ "uglifyjs-webpack-plugin": "^1.2.4",
5446+ "watchpack": "^1.5.0",
5447+ "webpack-sources": "^1.3.0"
5448+ },
5449+ "dependencies": {
5450+ "tapable": {
5451+ "version": "1.1.0",
5452+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
5453+ "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==",
5454+ "dev": true
5455+ }
5456+ }
5457+ },
5458+ "webpack-cli": {
5459+ "version": "3.1.2",
5460+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
5461+ "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
5462+ "dev": true,
5463+ "requires": {
5464+ "chalk": "^2.4.1",
5465+ "cross-spawn": "^6.0.5",
5466+ "enhanced-resolve": "^4.1.0",
5467+ "global-modules-path": "^2.3.0",
5468+ "import-local": "^2.0.0",
5469+ "interpret": "^1.1.0",
5470+ "loader-utils": "^1.1.0",
5471+ "supports-color": "^5.5.0",
5472+ "v8-compile-cache": "^2.0.2",
5473+ "yargs": "^12.0.2"
5474+ },
5475+ "dependencies": {
5476+ "supports-color": {
5477+ "version": "5.5.0",
5478+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5479+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
5480+ "dev": true,
5481+ "requires": {
5482+ "has-flag": "^3.0.0"
5483+ }
5484+ }
5485+ }
5486+ },
5487+ "webpack-dev-middleware": {
5488+ "version": "3.4.0",
5489+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
5490+ "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
5491+ "dev": true,
5492+ "requires": {
5493+ "memory-fs": "~0.4.1",
5494+ "mime": "^2.3.1",
5495+ "range-parser": "^1.0.3",
5496+ "webpack-log": "^2.0.0"
5497+ },
5498+ "dependencies": {
5499+ "mime": {
5500+ "version": "2.3.1",
5501+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
5502+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
5503+ "dev": true
5504+ }
5505+ }
5506+ },
5507+ "webpack-dev-server": {
5508+ "version": "3.1.10",
5509+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz",
5510+ "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==",
5511+ "dev": true,
5512+ "requires": {
5513+ "ansi-html": "0.0.7",
5514+ "bonjour": "^3.5.0",
5515+ "chokidar": "^2.0.0",
5516+ "compression": "^1.5.2",
5517+ "connect-history-api-fallback": "^1.3.0",
5518+ "debug": "^3.1.0",
5519+ "del": "^3.0.0",
5520+ "express": "^4.16.2",
5521+ "html-entities": "^1.2.0",
5522+ "http-proxy-middleware": "~0.18.0",
5523+ "import-local": "^2.0.0",
5524+ "internal-ip": "^3.0.1",
5525+ "ip": "^1.1.5",
5526+ "killable": "^1.0.0",
5527+ "loglevel": "^1.4.1",
5528+ "opn": "^5.1.0",
5529+ "portfinder": "^1.0.9",
5530+ "schema-utils": "^1.0.0",
5531+ "selfsigned": "^1.9.1",
5532+ "serve-index": "^1.7.2",
5533+ "sockjs": "0.3.19",
5534+ "sockjs-client": "1.3.0",
5535+ "spdy": "^3.4.1",
5536+ "strip-ansi": "^3.0.0",
5537+ "supports-color": "^5.1.0",
5538+ "webpack-dev-middleware": "3.4.0",
5539+ "webpack-log": "^2.0.0",
5540+ "yargs": "12.0.2"
5541+ },
5542+ "dependencies": {
5543+ "schema-utils": {
5544+ "version": "1.0.0",
5545+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
5546+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
5547+ "dev": true,
5548+ "requires": {
5549+ "ajv": "^6.1.0",
5550+ "ajv-errors": "^1.0.0",
5551+ "ajv-keywords": "^3.1.0"
5552+ }
5553+ }
5554+ }
5555+ },
5556+ "webpack-log": {
5557+ "version": "2.0.0",
5558+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
5559+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
5560+ "dev": true,
5561+ "requires": {
5562+ "ansi-colors": "^3.0.0",
5563+ "uuid": "^3.3.2"
5564+ }
5565+ },
5566+ "webpack-sources": {
5567+ "version": "1.3.0",
5568+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
5569+ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
5570+ "dev": true,
5571+ "requires": {
5572+ "source-list-map": "^2.0.0",
5573+ "source-map": "~0.6.1"
5574+ },
5575+ "dependencies": {
5576+ "source-map": {
5577+ "version": "0.6.1",
5578+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5579+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5580+ "dev": true
5581+ }
5582+ }
5583+ },
5584+ "websocket-driver": {
5585+ "version": "0.7.0",
5586+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
5587+ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
5588+ "dev": true,
5589+ "requires": {
5590+ "http-parser-js": ">=0.4.0",
5591+ "websocket-extensions": ">=0.1.1"
5592+ }
5593+ },
5594+ "websocket-extensions": {
5595+ "version": "0.1.3",
5596+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
5597+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
5598+ "dev": true
5599+ },
5600+ "which": {
5601+ "version": "1.3.1",
5602+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
5603+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
5604+ "dev": true,
5605+ "requires": {
5606+ "isexe": "^2.0.0"
5607+ }
5608+ },
5609+ "which-module": {
5610+ "version": "2.0.0",
5611+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
5612+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
5613+ "dev": true
5614+ },
5615+ "worker-farm": {
5616+ "version": "1.6.0",
5617+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
5618+ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
5619+ "dev": true,
5620+ "requires": {
5621+ "errno": "~0.1.7"
5622+ }
5623+ },
5624+ "wrap-ansi": {
5625+ "version": "2.1.0",
5626+ "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
5627+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
5628+ "dev": true,
5629+ "requires": {
5630+ "string-width": "^1.0.1",
5631+ "strip-ansi": "^3.0.1"
5632+ },
5633+ "dependencies": {
5634+ "is-fullwidth-code-point": {
5635+ "version": "1.0.0",
5636+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
5637+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
5638+ "dev": true,
5639+ "requires": {
5640+ "number-is-nan": "^1.0.0"
5641+ }
5642+ },
5643+ "string-width": {
5644+ "version": "1.0.2",
5645+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
5646+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
5647+ "dev": true,
5648+ "requires": {
5649+ "code-point-at": "^1.0.0",
5650+ "is-fullwidth-code-point": "^1.0.0",
5651+ "strip-ansi": "^3.0.0"
5652+ }
5653+ }
5654+ }
5655+ },
5656+ "wrappy": {
5657+ "version": "1.0.2",
5658+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5659+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5660+ "dev": true
5661+ },
5662+ "xregexp": {
5663+ "version": "4.0.0",
5664+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
5665+ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
5666+ "dev": true
5667+ },
5668+ "xtend": {
5669+ "version": "4.0.1",
5670+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
5671+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
5672+ "dev": true
5673+ },
5674+ "y18n": {
5675+ "version": "4.0.0",
5676+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
5677+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
5678+ "dev": true
5679+ },
5680+ "yallist": {
5681+ "version": "2.1.2",
5682+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
5683+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
5684+ "dev": true
5685+ },
5686+ "yargs": {
5687+ "version": "12.0.2",
5688+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
5689+ "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
5690+ "dev": true,
5691+ "requires": {
5692+ "cliui": "^4.0.0",
5693+ "decamelize": "^2.0.0",
5694+ "find-up": "^3.0.0",
5695+ "get-caller-file": "^1.0.1",
5696+ "os-locale": "^3.0.0",
5697+ "require-directory": "^2.1.1",
5698+ "require-main-filename": "^1.0.1",
5699+ "set-blocking": "^2.0.0",
5700+ "string-width": "^2.0.0",
5701+ "which-module": "^2.0.0",
5702+ "y18n": "^3.2.1 || ^4.0.0",
5703+ "yargs-parser": "^10.1.0"
5704+ },
5705+ "dependencies": {
5706+ "find-up": {
5707+ "version": "3.0.0",
5708+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
5709+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
5710+ "dev": true,
5711+ "requires": {
5712+ "locate-path": "^3.0.0"
5713+ }
5714+ },
5715+ "locate-path": {
5716+ "version": "3.0.0",
5717+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
5718+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
5719+ "dev": true,
5720+ "requires": {
5721+ "p-locate": "^3.0.0",
5722+ "path-exists": "^3.0.0"
5723+ }
5724+ },
5725+ "p-limit": {
5726+ "version": "2.0.0",
5727+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
5728+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
5729+ "dev": true,
5730+ "requires": {
5731+ "p-try": "^2.0.0"
5732+ }
5733+ },
5734+ "p-locate": {
5735+ "version": "3.0.0",
5736+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5737+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5738+ "dev": true,
5739+ "requires": {
5740+ "p-limit": "^2.0.0"
5741+ }
5742+ },
5743+ "p-try": {
5744+ "version": "2.0.0",
5745+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
5746+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
5747+ "dev": true
5748+ }
5749+ }
5750+ },
5751+ "yargs-parser": {
5752+ "version": "10.1.0",
5753+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
5754+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
5755+ "dev": true,
5756+ "requires": {
5757+ "camelcase": "^4.1.0"
5758+ }
5759+ }
5760+ }
5761+}
examples/counter/package.jsonnew file+18
@@ -0,0 +1,18 @@
1+{
2+ "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
3+ "name": "create-rust-webpack",
4+ "version": "0.1.5",
5+ "repository": "https://github.com/rustwasm/rust-webpack-template",
6+ "license": "Apache-2.0/MIT",
7+ "scripts": {
8+ "start": "webpack-dev-server -d",
9+ "build": "webpack"
10+ },
11+ "devDependencies": {
12+ "@wasm-tool/wasm-pack-plugin": "0.1.5",
13+ "html-webpack-plugin": "^3.2.0",
14+ "webpack": "^4.25.1",
15+ "webpack-cli": "^3.1.2",
16+ "webpack-dev-server": "^3.1.10"
17+ }
18+}
examples/counter/src/lib.rsdeleted−87
@@ -1,87 +0,0 @@
1−use dodrio::{bumpalo, Node, Render, RenderContext};
2−use log::*;
3−use wasm_bindgen::prelude::*;
4−
5−/// A counter that can be incremented and decremented!
6−struct Counter {
7− count: isize,
8−}
9−
10−impl Counter {
11− /// Construct a new, zeroed counter.
12− fn new() -> Counter {
13− Counter { count: 0 }
14− }
15−
16− /// Increment this counter's count.
17− fn increment(&mut self) {
18− self.count += 1;
19− }
20−
21− /// Decrement this counter's count.
22− fn decrement(&mut self) {
23− self.count -= 1;
24− }
25−}
26−
27−// The `Render` implementation for `Counter`s displays the current count and has
28−// buttons to increment and decrement the count.
29−impl<'a> Render<'a> for Counter {
30− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
31− use dodrio::builder::*;
32−
33− // Stringify the count as a bump-allocated string.
34− let count = bumpalo::format!(in cx.bump, "{}", self.count);
35−
36− div(&cx)
37− .children([
38− button(&cx)
39− .on("click", |root, vdom, _event| {
40− // Cast the root render component to a `Counter`, since
41− // we know that's what it is.
42− let counter = root.unwrap_mut::<Counter>();
43−
44− // Increment the counter.
45− counter.increment();
46−
47− // Since the count has updated, we should re-render the
48− // counter on the next animation frame.
49− vdom.schedule_render();
50− })
51− .children([text("+")])
52− .finish(),
53− text(count.into_bump_str()),
54− button(&cx)
55− .on("click", |root, vdom, _event| {
56− // Same as above, but decrementing instead of incrementing.
57− let counter = root.unwrap_mut::<Counter>();
58− counter.decrement();
59− vdom.schedule_render();
60− })
61− .children([text("-")])
62− .finish(),
63− ])
64− .finish()
65− }
66−}
67−
68−#[wasm_bindgen(start)]
69−pub fn run() {
70− // Initialize debug logging for if/when things go wrong.
71− console_error_panic_hook::set_once();
72− console_log::init_with_level(Level::Trace).expect("should initialize logging OK");
73−
74− // Get the document's `<body>`.
75− let window = web_sys::window().unwrap();
76− let document = window.document().unwrap();
77− let body = document.body().unwrap();
78−
79− // Construct a new counter component.
80− let counter = Counter::new();
81−
82− // Mount our counter component to the `<body>`.
83− let vdom = dodrio::Vdom::new(&body, counter);
84−
85− // Run the virtual DOM and its listeners forever.
86− vdom.forget();
87−}
examples/counter/webpack.config.jsnew file+25
@@ -0,0 +1,25 @@
1+const path = require("path");
2+const HtmlWebpackPlugin = require("html-webpack-plugin");
3+
4+const dist = path.resolve(__dirname, "dist");
5+const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
6+
7+module.exports = {
8+ entry: "./js/index.js",
9+ output: {
10+ path: dist,
11+ filename: "bundle.js"
12+ },
13+ devServer: {
14+ contentBase: dist,
15+ },
16+ plugins: [
17+ new HtmlWebpackPlugin({
18+ template: 'index.html'
19+ }),
20+
21+ new WasmPackPlugin({
22+ crateDirectory: path.resolve(__dirname, "crate")
23+ }),
24+ ]
25+};
examples/game-of-life/Cargo.tomldeleted−29
@@ -1,29 +0,0 @@
1−[package]
2−name = "dodrio-game-of-life"
3−version = "0.1.0"
4−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5−edition = "2018"
6−
7−[lib]
8−crate-type = ["cdylib"]
9−
10−[features]
11−
12−[dependencies]
13−dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.55"
15−console_error_panic_hook = "0.1.6"
16−js-sys = "0.3.32"
17−wasm-bindgen-futures = "0.4.5"
18−
19−[dependencies.web-sys]
20−version = "0.3.32"
21−features = [
22− "Document",
23− "HtmlElement",
24− "Node",
25− "Window",
26−]
27−
28−[dev-dependencies]
29−wasm-bindgen-test = "0.3.5"
examples/game-of-life/README.mddeleted−23
@@ -1,23 +0,0 @@
1−# Conway's Game of Life
2−
3−A port of the [Rust and WebAssembly tutorial's Game of Life
4−implementation](https://rustwasm.github.io/book/game-of-life/introduction.html)
5−to rendering to HTML with Dodrio instead of to a canvas via JavaScript.
6−
7−## Source
8−
9−See `src/lib.rs`.
10−
11−## Build
12−
13−```
14−wasm-pack build --target web
15−```
16−
17−## Serve
18−
19−Use any HTTP server, for example:
20−
21−```
22−python -m SimpleHTTPServer
23−```
examples/game-of-life/index.htmldeleted−44
@@ -1,44 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3− <head>
4− <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5− <title>Conway's Game of Life</title>
6− <style>
7− .cell {
8− display: inline-block;
9− width: 1vh;
10− height: 1vh;
11− border: 1px #cccccc solid;
12− margin: -1px;
13− padding: 0;
14− }
15−
16− .row {
17− height: 1vh;
18− margin: 0;
19− padding: 0;
20− }
21−
22− body {
23− width: 100vw;
24− height: 100vh;
25− display: flex;
26− align-items: center;
27− justify-content: center;
28− padding: 0;
29− margin: 0;
30− }
31−
32− html {
33− padding: 0;
34− margin: 0;
35− }
36− </style>
37− </head>
38− <body>
39− <script type="module">
40− import init from "./pkg/dodrio_game_of_life.js";
41− init("./pkg/dodrio_game_of_life_bg.wasm");
42− </script>
43− </body>
44−</html>
examples/game-of-life/src/lib.rsdeleted−218
@@ -1,218 +0,0 @@
1−use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
2−use std::cell::RefCell;
3−use std::rc::Rc;
4−use wasm_bindgen::{prelude::*, JsCast};
5−
6−#[repr(u8)]
7−#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8−pub enum Cell {
9− Dead = 0,
10− Alive = 1,
11−}
12−
13−/// The universe containing all of the cells for our Game of Life.
14−struct Universe {
15− width: u32,
16− height: u32,
17− cells: Vec<Cell>,
18−}
19−
20−impl Universe {
21− /// Construct a new universe.
22− pub fn new() -> Universe {
23− let width = 64;
24− let height = 64;
25−
26− let cells = (0..width * height)
27− .map(|i| {
28− if i % 2 == 0 || i % 7 == 0 {
29− Cell::Alive
30− } else {
31− Cell::Dead
32− }
33− })
34− .collect();
35−
36− Universe {
37− width,
38− height,
39− cells,
40− }
41− }
42−
43− /// Compute one tick of the universe.
44− pub fn tick(&mut self) {
45− let mut next = self.cells.clone();
46−
47− for row in 0..self.height {
48− for col in 0..self.width {
49− let idx = self.get_index(row, col);
50− let cell = self.cells[idx];
51− let live_neighbors = self.live_neighbor_count(row, col);
52−
53− let next_cell = match (cell, live_neighbors) {
54− // Rule 1: Any live cell with fewer than two live neighbours
55− // dies, as if caused by underpopulation.
56− (Cell::Alive, x) if x < 2 => Cell::Dead,
57− // Rule 2: Any live cell with two or three live neighbours
58− // lives on to the next generation.
59− (Cell::Alive, 2) | (Cell::Alive, 3) => Cell::Alive,
60− // Rule 3: Any live cell with more than three live
61− // neighbours dies, as if by overpopulation.
62− (Cell::Alive, x) if x > 3 => Cell::Dead,
63− // Rule 4: Any dead cell with exactly three live neighbours
64− // becomes a live cell, as if by reproduction.
65− (Cell::Dead, 3) => Cell::Alive,
66− // All other cells remain in the same state.
67− (otherwise, _) => otherwise,
68− };
69−
70− next[idx] = next_cell;
71− }
72− }
73−
74− self.cells = next;
75− }
76−
77− fn get_index(&self, row: u32, column: u32) -> usize {
78− (row * self.width + column) as usize
79− }
80−
81− fn live_neighbor_count(&self, row: u32, column: u32) -> u8 {
82− let mut count = 0;
83−
84− let north = if row == 0 { self.height - 1 } else { row - 1 };
85−
86− let south = if row == self.height - 1 { 0 } else { row + 1 };
87−
88− let west = if column == 0 {
89− self.width - 1
90− } else {
91− column - 1
92− };
93−
94− let east = if column == self.width - 1 {
95− 0
96− } else {
97− column + 1
98− };
99−
100− let nw = self.get_index(north, west);
101− count += self.cells[nw] as u8;
102−
103− let n = self.get_index(north, column);
104− count += self.cells[n] as u8;
105−
106− let ne = self.get_index(north, east);
107− count += self.cells[ne] as u8;
108−
109− let w = self.get_index(row, west);
110− count += self.cells[w] as u8;
111−
112− let e = self.get_index(row, east);
113− count += self.cells[e] as u8;
114−
115− let sw = self.get_index(south, west);
116− count += self.cells[sw] as u8;
117−
118− let s = self.get_index(south, column);
119− count += self.cells[s] as u8;
120−
121− let se = self.get_index(south, east);
122− count += self.cells[se] as u8;
123−
124− count
125− }
126−}
127−
128−/// The rendering implementation for our Game of Life.
129−impl<'a> Render<'a> for Universe {
130− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
131− use dodrio::builder::*;
132−
133− let mut rows = bumpalo::collections::Vec::with_capacity_in(self.height as usize, cx.bump);
134−
135− for row in self.cells.chunks(self.width as usize) {
136− let mut cells =
137− bumpalo::collections::Vec::with_capacity_in(self.width as usize, cx.bump);
138−
139− for cell in row {
140− cells.push(
141− span(&cx)
142− .attr("class", "cell")
143− .attr(
144− "style",
145− match cell {
146− Cell::Alive => "background-color: black",
147− Cell::Dead => "background-color: white",
148− },
149− )
150− .finish(),
151− );
152− }
153−
154− rows.push(div(&cx).attr("class", "row").children(cells).finish());
155− }
156−
157− div(&cx).attr("class", "universe").children(rows).finish()
158− }
159−}
160−
161−#[wasm_bindgen(start)]
162−pub fn run() {
163− // Set up the panic hook for debugging when things go wrong.
164− console_error_panic_hook::set_once();
165−
166− // Grab the document's `<body>`.
167− let window = web_sys::window().unwrap_throw();
168− let document = window.document().unwrap_throw();
169− let body = document.body().unwrap_throw();
170−
171− // Create a new Game of Life `Universe` render component.
172− let universe = Universe::new();
173−
174− // Create a virtual DOM and mount it and the `Universe` render component to the
175− // `<body>`.
176− let vdom = Vdom::new(body.as_ref(), universe);
177−
178− // Kick off a loop that keeps computing a tick of the universe and then
179− // re-rendering on every animation frame.
180− let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
181− let rc2 = rc.clone();
182− let window2 = window.clone();
183− let weak = vdom.weak();
184− let f = Closure::wrap(Box::new(move || {
185− weak.schedule_render();
186−
187− wasm_bindgen_futures::spawn_local({
188− let weak = weak.clone();
189− async move {
190− let fut = weak.with_component(|root| {
191− let universe = root.unwrap_mut::<Universe>();
192− universe.tick();
193− });
194−
195− if fut.await.is_err() {
196− wasm_bindgen::throw_str("impossible, we always keep the vdom alive");
197− }
198− }
199− });
200−
201− window
202− .request_animation_frame(
203− rc.borrow()
204− .as_ref()
205− .unwrap_throw()
206− .as_ref()
207− .unchecked_ref::<js_sys::Function>(),
208− )
209− .unwrap_throw();
210− }) as Box<dyn FnMut()>);
211− window2
212− .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
213− .unwrap_throw();
214− *rc2.borrow_mut() = Some(f);
215−
216− // Run the virtual DOM forever and don't unmount it.
217− vdom.forget();
218−}
examples/hello-world/.bin/create-rust-webpack.jsnew file+38
@@ -0,0 +1,38 @@
1+#!/usr/bin/env node
2+
3+const { spawn } = require("child_process");
4+const fs = require("fs");
5+
6+let folderName = '.';
7+
8+if (process.argv.length >= 3) {
9+ folderName = process.argv[2];
10+ if (!fs.existsSync(folderName)) {
11+ fs.mkdirSync(folderName);
12+ }
13+}
14+
15+const clone = spawn("git", ["clone", "https://github.com/rustwasm/rust-webpack-template.git", folderName]);
16+
17+clone.on("close", (code) => {
18+ if (code !== 0) {
19+ handleError("install", code);
20+ } else {
21+ console.log(" 🦀 Rust + 🕸 WebAssembly + Webpack = ❤️ ");
22+
23+ const install = spawn('npm', ['install'], { cwd: folderName });
24+ install.on("close", (code) => {
25+ if (code !== 0) {
26+ handleError("install", code);
27+ } else {
28+ console.log(" Installed dependencies ✅ ");
29+ }
30+ });
31+ }
32+});
33+
34+function handleError(type, errCode) {
35+ // TODO(sven): handle error here
36+ console.error()
37+ process.exit(errCode);
38+}
examples/hello-world/.gitignorenew file+7
@@ -0,0 +1,7 @@
1+dist
2+node_modules
3+crate/bin
4+crate/pkg
5+crate/target
6+crate/wasm-pack.log
7+crate/Cargo.lock
examples/hello-world/.travis.ymlnew file+11
@@ -0,0 +1,11 @@
1+language: rust
2+
3+install:
4+ - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
5+ - source ~/.nvm/nvm.sh
6+ - nvm install v10.5
7+ - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
8+
9+script:
10+ - npm install
11+ - npm run build
examples/hello-world/LICENSE-APACHEnew file+201
@@ -0,0 +1,201 @@
1+ Apache License
2+ Version 2.0, January 2004
3+ http://www.apache.org/licenses/
4+
5+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6+
7+1. Definitions.
8+
9+ "License" shall mean the terms and conditions for use, reproduction,
10+ and distribution as defined by Sections 1 through 9 of this document.
11+
12+ "Licensor" shall mean the copyright owner or entity authorized by
13+ the copyright owner that is granting the License.
14+
15+ "Legal Entity" shall mean the union of the acting entity and all
16+ other entities that control, are controlled by, or are under common
17+ control with that entity. For the purposes of this definition,
18+ "control" means (i) the power, direct or indirect, to cause the
19+ direction or management of such entity, whether by contract or
20+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21+ outstanding shares, or (iii) beneficial ownership of such entity.
22+
23+ "You" (or "Your") shall mean an individual or Legal Entity
24+ exercising permissions granted by this License.
25+
26+ "Source" form shall mean the preferred form for making modifications,
27+ including but not limited to software source code, documentation
28+ source, and configuration files.
29+
30+ "Object" form shall mean any form resulting from mechanical
31+ transformation or translation of a Source form, including but
32+ not limited to compiled object code, generated documentation,
33+ and conversions to other media types.
34+
35+ "Work" shall mean the work of authorship, whether in Source or
36+ Object form, made available under the License, as indicated by a
37+ copyright notice that is included in or attached to the work
38+ (an example is provided in the Appendix below).
39+
40+ "Derivative Works" shall mean any work, whether in Source or Object
41+ form, that is based on (or derived from) the Work and for which the
42+ editorial revisions, annotations, elaborations, or other modifications
43+ represent, as a whole, an original work of authorship. For the purposes
44+ of this License, Derivative Works shall not include works that remain
45+ separable from, or merely link (or bind by name) to the interfaces of,
46+ the Work and Derivative Works thereof.
47+
48+ "Contribution" shall mean any work of authorship, including
49+ the original version of the Work and any modifications or additions
50+ to that Work or Derivative Works thereof, that is intentionally
51+ submitted to Licensor for inclusion in the Work by the copyright owner
52+ or by an individual or Legal Entity authorized to submit on behalf of
53+ the copyright owner. For the purposes of this definition, "submitted"
54+ means any form of electronic, verbal, or written communication sent
55+ to the Licensor or its representatives, including but not limited to
56+ communication on electronic mailing lists, source code control systems,
57+ and issue tracking systems that are managed by, or on behalf of, the
58+ Licensor for the purpose of discussing and improving the Work, but
59+ excluding communication that is conspicuously marked or otherwise
60+ designated in writing by the copyright owner as "Not a Contribution."
61+
62+ "Contributor" shall mean Licensor and any individual or Legal Entity
63+ on behalf of whom a Contribution has been received by Licensor and
64+ subsequently incorporated within the Work.
65+
66+2. Grant of Copyright License. Subject to the terms and conditions of
67+ this License, each Contributor hereby grants to You a perpetual,
68+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69+ copyright license to reproduce, prepare Derivative Works of,
70+ publicly display, publicly perform, sublicense, and distribute the
71+ Work and such Derivative Works in Source or Object form.
72+
73+3. Grant of Patent License. Subject to the terms and conditions of
74+ this License, each Contributor hereby grants to You a perpetual,
75+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76+ (except as stated in this section) patent license to make, have made,
77+ use, offer to sell, sell, import, and otherwise transfer the Work,
78+ where such license applies only to those patent claims licensable
79+ by such Contributor that are necessarily infringed by their
80+ Contribution(s) alone or by combination of their Contribution(s)
81+ with the Work to which such Contribution(s) was submitted. If You
82+ institute patent litigation against any entity (including a
83+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84+ or a Contribution incorporated within the Work constitutes direct
85+ or contributory patent infringement, then any patent licenses
86+ granted to You under this License for that Work shall terminate
87+ as of the date such litigation is filed.
88+
89+4. Redistribution. You may reproduce and distribute copies of the
90+ Work or Derivative Works thereof in any medium, with or without
91+ modifications, and in Source or Object form, provided that You
92+ meet the following conditions:
93+
94+ (a) You must give any other recipients of the Work or
95+ Derivative Works a copy of this License; and
96+
97+ (b) You must cause any modified files to carry prominent notices
98+ stating that You changed the files; and
99+
100+ (c) You must retain, in the Source form of any Derivative Works
101+ that You distribute, all copyright, patent, trademark, and
102+ attribution notices from the Source form of the Work,
103+ excluding those notices that do not pertain to any part of
104+ the Derivative Works; and
105+
106+ (d) If the Work includes a "NOTICE" text file as part of its
107+ distribution, then any Derivative Works that You distribute must
108+ include a readable copy of the attribution notices contained
109+ within such NOTICE file, excluding those notices that do not
110+ pertain to any part of the Derivative Works, in at least one
111+ of the following places: within a NOTICE text file distributed
112+ as part of the Derivative Works; within the Source form or
113+ documentation, if provided along with the Derivative Works; or,
114+ within a display generated by the Derivative Works, if and
115+ wherever such third-party notices normally appear. The contents
116+ of the NOTICE file are for informational purposes only and
117+ do not modify the License. You may add Your own attribution
118+ notices within Derivative Works that You distribute, alongside
119+ or as an addendum to the NOTICE text from the Work, provided
120+ that such additional attribution notices cannot be construed
121+ as modifying the License.
122+
123+ You may add Your own copyright statement to Your modifications and
124+ may provide additional or different license terms and conditions
125+ for use, reproduction, or distribution of Your modifications, or
126+ for any such Derivative Works as a whole, provided Your use,
127+ reproduction, and distribution of the Work otherwise complies with
128+ the conditions stated in this License.
129+
130+5. Submission of Contributions. Unless You explicitly state otherwise,
131+ any Contribution intentionally submitted for inclusion in the Work
132+ by You to the Licensor shall be under the terms and conditions of
133+ this License, without any additional terms or conditions.
134+ Notwithstanding the above, nothing herein shall supersede or modify
135+ the terms of any separate license agreement you may have executed
136+ with Licensor regarding such Contributions.
137+
138+6. Trademarks. This License does not grant permission to use the trade
139+ names, trademarks, service marks, or product names of the Licensor,
140+ except as required for reasonable and customary use in describing the
141+ origin of the Work and reproducing the content of the NOTICE file.
142+
143+7. Disclaimer of Warranty. Unless required by applicable law or
144+ agreed to in writing, Licensor provides the Work (and each
145+ Contributor provides its Contributions) on an "AS IS" BASIS,
146+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147+ implied, including, without limitation, any warranties or conditions
148+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149+ PARTICULAR PURPOSE. You are solely responsible for determining the
150+ appropriateness of using or redistributing the Work and assume any
151+ risks associated with Your exercise of permissions under this License.
152+
153+8. Limitation of Liability. In no event and under no legal theory,
154+ whether in tort (including negligence), contract, or otherwise,
155+ unless required by applicable law (such as deliberate and grossly
156+ negligent acts) or agreed to in writing, shall any Contributor be
157+ liable to You for damages, including any direct, indirect, special,
158+ incidental, or consequential damages of any character arising as a
159+ result of this License or out of the use or inability to use the
160+ Work (including but not limited to damages for loss of goodwill,
161+ work stoppage, computer failure or malfunction, or any and all
162+ other commercial damages or losses), even if such Contributor
163+ has been advised of the possibility of such damages.
164+
165+9. Accepting Warranty or Additional Liability. While redistributing
166+ the Work or Derivative Works thereof, You may choose to offer,
167+ and charge a fee for, acceptance of support, warranty, indemnity,
168+ or other liability obligations and/or rights consistent with this
169+ License. However, in accepting such obligations, You may act only
170+ on Your own behalf and on Your sole responsibility, not on behalf
171+ of any other Contributor, and only if You agree to indemnify,
172+ defend, and hold each Contributor harmless for any liability
173+ incurred by, or claims asserted against, such Contributor by reason
174+ of your accepting any such warranty or additional liability.
175+
176+END OF TERMS AND CONDITIONS
177+
178+APPENDIX: How to apply the Apache License to your work.
179+
180+ To apply the Apache License to your work, attach the following
181+ boilerplate notice, with the fields enclosed by brackets "[]"
182+ replaced with your own identifying information. (Don't include
183+ the brackets!) The text should be enclosed in the appropriate
184+ comment syntax for the file format. We also recommend that a
185+ file or class name and description of purpose be included on the
186+ same "printed page" as the copyright notice for easier
187+ identification within third-party archives.
188+
189+Copyright [yyyy] [name of copyright owner]
190+
191+Licensed under the Apache License, Version 2.0 (the "License");
192+you may not use this file except in compliance with the License.
193+You may obtain a copy of the License at
194+
195+ http://www.apache.org/licenses/LICENSE-2.0
196+
197+Unless required by applicable law or agreed to in writing, software
198+distributed under the License is distributed on an "AS IS" BASIS,
199+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200+See the License for the specific language governing permissions and
201+limitations under the License.
examples/hello-world/LICENSE-MITnew file+25
@@ -0,0 +1,25 @@
1+Copyright (c) 2015 The Rust Project Developers
2+
3+Permission is hereby granted, free of charge, to any
4+person obtaining a copy of this software and associated
5+documentation files (the "Software"), to deal in the
6+Software without restriction, including without
7+limitation the rights to use, copy, modify, merge,
8+publish, distribute, sublicense, and/or sell copies of
9+the Software, and to permit persons to whom the Software
10+is furnished to do so, subject to the following
11+conditions:
12+
13+The above copyright notice and this permission notice
14+shall be included in all copies or substantial portions
15+of the Software.
16+
17+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25+DEALINGS IN THE SOFTWARE.
examples/hello-world/README.md+20−12
@@ -1,21 +1,29 @@
1−# Hello World
1+# 🦀🕸 `rust-webpack-template`
22
3−The most basic example!
3+> **Kickstart your Rust, WebAssembly, and Webpack project!**
44
5−## Source
5+This template is designed for creating monorepo-style Web applications with
6+Rust-generated WebAssembly and Webpack without publishing your wasm to NPM.
67
7−See `src/lib.rs`.
8+* Want to create and publish NPM packages with Rust and WebAssembly? [Check out
9+ `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)
810
9−## Build
11+## 🔋 Batteries Included
1012
11−```
12−wasm-pack build --target web
13−```
13+This template comes pre-configured with all the boilerplate for compiling Rust
14+to WebAssembly and hooking into a Webpack build pipeline.
1415
15−## Serve
16+* `npm run start` -- Serve the project locally for development at
17+ `http://localhost:8080`.
1618
17−Use any HTTP server, for example:
19+* `npm run build` -- Bundle the project (in production mode).
1820
19−```
20−python -m SimpleHTTPServer
21+## 🚴 Using This Template
22+
23+First, [install `wasm-pack`!](https://rustwasm.github.io/wasm-pack/installer/)
24+
25+Then, use `npm init` to clone this template:
26+
27+```sh
28+npm init rust-webpack my-app
2129```
examples/hello-world/Cargo.toml → examples/hello-world/crate/Cargo.tomlrenamed+7−6
@@ -5,17 +5,18 @@ authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
55edition = "2018"
66
77[lib]
8−crate-type = ["cdylib"]
8+crate-type = ["cdylib", "rlib"]
99
1010[features]
1111
1212[dependencies]
13−dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.55"
15−console_error_panic_hook = "0.1.6"
13+bumpalo = "1.0.2"
14+dodrio = { path = "../../.." }
15+wasm-bindgen = "0.2"
16+console_error_panic_hook = "0.1.1"
1617
1718[dependencies.web-sys]
18−version = "0.3.32"
19+version = "0.3.2"
1920features = [
2021 "Document",
2122 "HtmlElement",
@@ -24,4 +25,4 @@ features = [
2425]
2526
2627[dev-dependencies]
27−wasm-bindgen-test = "0.3.5"
28+wasm-bindgen-test = "0.2"
examples/hello-world/crate/src/lib.rsnew file+45
@@ -0,0 +1,45 @@
1+use bumpalo::Bump;
2+use dodrio::{Node, Render};
3+use wasm_bindgen::prelude::*;
4+
5+struct HelloWorld<'a>(&'a str);
6+
7+impl<'who> HelloWorld<'who> {
8+ fn new(who: &str) -> HelloWorld {
9+ HelloWorld(who)
10+ }
11+}
12+
13+impl<'who> Render for HelloWorld<'who> {
14+ fn render<'a, 'bump>(&'a self, bump: &'bump Bump) -> dodrio::node::NodeRef<'bump>
15+ where
16+ 'a: 'bump,
17+ {
18+ bump.alloc(Node::element(
19+ "p",
20+ [],
21+ [
22+ bump.alloc(Node::text("Hello, ")).into(),
23+ bump.alloc(Node::text(self.0)).into(),
24+ bump.alloc(Node::text("!")).into(),
25+ ],
26+ ))
27+ .into()
28+ }
29+}
30+
31+#[wasm_bindgen]
32+pub fn run() {
33+ console_error_panic_hook::set_once();
34+
35+ let window = web_sys::window().unwrap();
36+ let document = window.document().unwrap();
37+ let body = document.body().unwrap();
38+
39+ // Create a new dodrio vdom contained in the body, with an initial virtual
40+ // dom.
41+ let mut vdom = dodrio::Vdom::new(body.as_ref(), &HelloWorld::new("World"));
42+
43+ // Render a new node tree into the virtual dom.
44+ vdom.render(&HelloWorld::new("Dodrio"));
45+}
examples/hello-world/index.html−4
@@ -5,9 +5,5 @@
55 <title>Hello, World!</title>
66 </head>
77 <body>
8− <script type="module">
9− import init from "./pkg/dodrio_hello_world.js";
10− init("./pkg/dodrio_hello_world_bg.wasm");
11− </script>
128 </body>
139</html>
examples/hello-world/js/index.jsnew file+3
@@ -0,0 +1,3 @@
1+import("../crate/pkg").then(module => {
2+ module.run();
3+});
examples/hello-world/package-lock.jsonnew file+5761
@@ -0,0 +1,5761 @@
1+{
2+ "name": "create-rust-webpack",
3+ "version": "0.1.5",
4+ "lockfileVersion": 1,
5+ "requires": true,
6+ "dependencies": {
7+ "@wasm-tool/wasm-pack-plugin": {
8+ "version": "0.1.5",
9+ "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-0.1.5.tgz",
10+ "integrity": "sha512-c/M5A+7Y7UcyxxAa0WltyR3M4f1a//omC7IZ/EcVLRfQURnvCLs1QB+zaXvsuCDn6jJr3x4spps20FwQcSqZtw==",
11+ "dev": true,
12+ "requires": {
13+ "chalk": "^2.4.1",
14+ "command-exists": "^1.2.7",
15+ "glob": "^7.1.2",
16+ "watchpack": "^1.6.0"
17+ }
18+ },
19+ "@webassemblyjs/ast": {
20+ "version": "1.7.11",
21+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
22+ "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
23+ "dev": true,
24+ "requires": {
25+ "@webassemblyjs/helper-module-context": "1.7.11",
26+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
27+ "@webassemblyjs/wast-parser": "1.7.11"
28+ }
29+ },
30+ "@webassemblyjs/floating-point-hex-parser": {
31+ "version": "1.7.11",
32+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
33+ "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
34+ "dev": true
35+ },
36+ "@webassemblyjs/helper-api-error": {
37+ "version": "1.7.11",
38+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
39+ "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
40+ "dev": true
41+ },
42+ "@webassemblyjs/helper-buffer": {
43+ "version": "1.7.11",
44+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
45+ "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
46+ "dev": true
47+ },
48+ "@webassemblyjs/helper-code-frame": {
49+ "version": "1.7.11",
50+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
51+ "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
52+ "dev": true,
53+ "requires": {
54+ "@webassemblyjs/wast-printer": "1.7.11"
55+ }
56+ },
57+ "@webassemblyjs/helper-fsm": {
58+ "version": "1.7.11",
59+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
60+ "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
61+ "dev": true
62+ },
63+ "@webassemblyjs/helper-module-context": {
64+ "version": "1.7.11",
65+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
66+ "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
67+ "dev": true
68+ },
69+ "@webassemblyjs/helper-wasm-bytecode": {
70+ "version": "1.7.11",
71+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
72+ "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
73+ "dev": true
74+ },
75+ "@webassemblyjs/helper-wasm-section": {
76+ "version": "1.7.11",
77+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
78+ "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
79+ "dev": true,
80+ "requires": {
81+ "@webassemblyjs/ast": "1.7.11",
82+ "@webassemblyjs/helper-buffer": "1.7.11",
83+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
84+ "@webassemblyjs/wasm-gen": "1.7.11"
85+ }
86+ },
87+ "@webassemblyjs/ieee754": {
88+ "version": "1.7.11",
89+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
90+ "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
91+ "dev": true,
92+ "requires": {
93+ "@xtuc/ieee754": "^1.2.0"
94+ }
95+ },
96+ "@webassemblyjs/leb128": {
97+ "version": "1.7.11",
98+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
99+ "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
100+ "dev": true,
101+ "requires": {
102+ "@xtuc/long": "4.2.1"
103+ }
104+ },
105+ "@webassemblyjs/utf8": {
106+ "version": "1.7.11",
107+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
108+ "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
109+ "dev": true
110+ },
111+ "@webassemblyjs/wasm-edit": {
112+ "version": "1.7.11",
113+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
114+ "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
115+ "dev": true,
116+ "requires": {
117+ "@webassemblyjs/ast": "1.7.11",
118+ "@webassemblyjs/helper-buffer": "1.7.11",
119+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
120+ "@webassemblyjs/helper-wasm-section": "1.7.11",
121+ "@webassemblyjs/wasm-gen": "1.7.11",
122+ "@webassemblyjs/wasm-opt": "1.7.11",
123+ "@webassemblyjs/wasm-parser": "1.7.11",
124+ "@webassemblyjs/wast-printer": "1.7.11"
125+ }
126+ },
127+ "@webassemblyjs/wasm-gen": {
128+ "version": "1.7.11",
129+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
130+ "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
131+ "dev": true,
132+ "requires": {
133+ "@webassemblyjs/ast": "1.7.11",
134+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
135+ "@webassemblyjs/ieee754": "1.7.11",
136+ "@webassemblyjs/leb128": "1.7.11",
137+ "@webassemblyjs/utf8": "1.7.11"
138+ }
139+ },
140+ "@webassemblyjs/wasm-opt": {
141+ "version": "1.7.11",
142+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
143+ "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
144+ "dev": true,
145+ "requires": {
146+ "@webassemblyjs/ast": "1.7.11",
147+ "@webassemblyjs/helper-buffer": "1.7.11",
148+ "@webassemblyjs/wasm-gen": "1.7.11",
149+ "@webassemblyjs/wasm-parser": "1.7.11"
150+ }
151+ },
152+ "@webassemblyjs/wasm-parser": {
153+ "version": "1.7.11",
154+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
155+ "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
156+ "dev": true,
157+ "requires": {
158+ "@webassemblyjs/ast": "1.7.11",
159+ "@webassemblyjs/helper-api-error": "1.7.11",
160+ "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
161+ "@webassemblyjs/ieee754": "1.7.11",
162+ "@webassemblyjs/leb128": "1.7.11",
163+ "@webassemblyjs/utf8": "1.7.11"
164+ }
165+ },
166+ "@webassemblyjs/wast-parser": {
167+ "version": "1.7.11",
168+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
169+ "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
170+ "dev": true,
171+ "requires": {
172+ "@webassemblyjs/ast": "1.7.11",
173+ "@webassemblyjs/floating-point-hex-parser": "1.7.11",
174+ "@webassemblyjs/helper-api-error": "1.7.11",
175+ "@webassemblyjs/helper-code-frame": "1.7.11",
176+ "@webassemblyjs/helper-fsm": "1.7.11",
177+ "@xtuc/long": "4.2.1"
178+ }
179+ },
180+ "@webassemblyjs/wast-printer": {
181+ "version": "1.7.11",
182+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
183+ "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
184+ "dev": true,
185+ "requires": {
186+ "@webassemblyjs/ast": "1.7.11",
187+ "@webassemblyjs/wast-parser": "1.7.11",
188+ "@xtuc/long": "4.2.1"
189+ }
190+ },
191+ "@xtuc/ieee754": {
192+ "version": "1.2.0",
193+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
194+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
195+ "dev": true
196+ },
197+ "@xtuc/long": {
198+ "version": "4.2.1",
199+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
200+ "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
201+ "dev": true
202+ },
203+ "accepts": {
204+ "version": "1.3.5",
205+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
206+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
207+ "dev": true,
208+ "requires": {
209+ "mime-types": "~2.1.18",
210+ "negotiator": "0.6.1"
211+ }
212+ },
213+ "acorn": {
214+ "version": "5.7.3",
215+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
216+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
217+ "dev": true
218+ },
219+ "acorn-dynamic-import": {
220+ "version": "3.0.0",
221+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
222+ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
223+ "dev": true,
224+ "requires": {
225+ "acorn": "^5.0.0"
226+ }
227+ },
228+ "ajv": {
229+ "version": "6.5.3",
230+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
231+ "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
232+ "dev": true,
233+ "requires": {
234+ "fast-deep-equal": "^2.0.1",
235+ "fast-json-stable-stringify": "^2.0.0",
236+ "json-schema-traverse": "^0.4.1",
237+ "uri-js": "^4.2.2"
238+ }
239+ },
240+ "ajv-errors": {
241+ "version": "1.0.0",
242+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz",
243+ "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=",
244+ "dev": true
245+ },
246+ "ajv-keywords": {
247+ "version": "3.2.0",
248+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
249+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
250+ "dev": true
251+ },
252+ "ansi-colors": {
253+ "version": "3.2.1",
254+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz",
255+ "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==",
256+ "dev": true
257+ },
258+ "ansi-html": {
259+ "version": "0.0.7",
260+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
261+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
262+ "dev": true
263+ },
264+ "ansi-regex": {
265+ "version": "2.1.1",
266+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
267+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
268+ "dev": true
269+ },
270+ "ansi-styles": {
271+ "version": "3.2.1",
272+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
273+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
274+ "dev": true,
275+ "requires": {
276+ "color-convert": "^1.9.0"
277+ }
278+ },
279+ "anymatch": {
280+ "version": "2.0.0",
281+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
282+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
283+ "dev": true,
284+ "requires": {
285+ "micromatch": "^3.1.4",
286+ "normalize-path": "^2.1.1"
287+ }
288+ },
289+ "aproba": {
290+ "version": "1.2.0",
291+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
292+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
293+ "dev": true
294+ },
295+ "arr-diff": {
296+ "version": "4.0.0",
297+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
298+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
299+ "dev": true
300+ },
301+ "arr-flatten": {
302+ "version": "1.1.0",
303+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
304+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
305+ "dev": true
306+ },
307+ "arr-union": {
308+ "version": "3.1.0",
309+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
310+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
311+ "dev": true
312+ },
313+ "array-flatten": {
314+ "version": "2.1.1",
315+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
316+ "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
317+ "dev": true
318+ },
319+ "array-union": {
320+ "version": "1.0.2",
321+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
322+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
323+ "dev": true,
324+ "requires": {
325+ "array-uniq": "^1.0.1"
326+ }
327+ },
328+ "array-uniq": {
329+ "version": "1.0.3",
330+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
331+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
332+ "dev": true
333+ },
334+ "array-unique": {
335+ "version": "0.3.2",
336+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
337+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
338+ "dev": true
339+ },
340+ "asn1.js": {
341+ "version": "4.10.1",
342+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
343+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
344+ "dev": true,
345+ "requires": {
346+ "bn.js": "^4.0.0",
347+ "inherits": "^2.0.1",
348+ "minimalistic-assert": "^1.0.0"
349+ }
350+ },
351+ "assert": {
352+ "version": "1.4.1",
353+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
354+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
355+ "dev": true,
356+ "requires": {
357+ "util": "0.10.3"
358+ },
359+ "dependencies": {
360+ "inherits": {
361+ "version": "2.0.1",
362+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
363+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
364+ "dev": true
365+ },
366+ "util": {
367+ "version": "0.10.3",
368+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
369+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
370+ "dev": true,
371+ "requires": {
372+ "inherits": "2.0.1"
373+ }
374+ }
375+ }
376+ },
377+ "assign-symbols": {
378+ "version": "1.0.0",
379+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
380+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
381+ "dev": true
382+ },
383+ "async": {
384+ "version": "1.5.2",
385+ "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
386+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
387+ "dev": true
388+ },
389+ "async-each": {
390+ "version": "1.0.1",
391+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
392+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
393+ "dev": true
394+ },
395+ "atob": {
396+ "version": "2.1.1",
397+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
398+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
399+ "dev": true
400+ },
401+ "balanced-match": {
402+ "version": "1.0.0",
403+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
404+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
405+ "dev": true
406+ },
407+ "base": {
408+ "version": "0.11.2",
409+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
410+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
411+ "dev": true,
412+ "requires": {
413+ "cache-base": "^1.0.1",
414+ "class-utils": "^0.3.5",
415+ "component-emitter": "^1.2.1",
416+ "define-property": "^1.0.0",
417+ "isobject": "^3.0.1",
418+ "mixin-deep": "^1.2.0",
419+ "pascalcase": "^0.1.1"
420+ },
421+ "dependencies": {
422+ "define-property": {
423+ "version": "1.0.0",
424+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
425+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
426+ "dev": true,
427+ "requires": {
428+ "is-descriptor": "^1.0.0"
429+ }
430+ },
431+ "is-accessor-descriptor": {
432+ "version": "1.0.0",
433+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
434+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
435+ "dev": true,
436+ "requires": {
437+ "kind-of": "^6.0.0"
438+ }
439+ },
440+ "is-data-descriptor": {
441+ "version": "1.0.0",
442+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
443+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
444+ "dev": true,
445+ "requires": {
446+ "kind-of": "^6.0.0"
447+ }
448+ },
449+ "is-descriptor": {
450+ "version": "1.0.2",
451+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
452+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
453+ "dev": true,
454+ "requires": {
455+ "is-accessor-descriptor": "^1.0.0",
456+ "is-data-descriptor": "^1.0.0",
457+ "kind-of": "^6.0.2"
458+ }
459+ }
460+ }
461+ },
462+ "base64-js": {
463+ "version": "1.3.0",
464+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
465+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
466+ "dev": true
467+ },
468+ "batch": {
469+ "version": "0.6.1",
470+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
471+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
472+ "dev": true
473+ },
474+ "big.js": {
475+ "version": "3.2.0",
476+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
477+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
478+ "dev": true
479+ },
480+ "binary-extensions": {
481+ "version": "1.11.0",
482+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
483+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
484+ "dev": true
485+ },
486+ "bluebird": {
487+ "version": "3.5.2",
488+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
489+ "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
490+ "dev": true
491+ },
492+ "bn.js": {
493+ "version": "4.11.8",
494+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
495+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
496+ "dev": true
497+ },
498+ "body-parser": {
499+ "version": "1.18.3",
500+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
501+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
502+ "dev": true,
503+ "requires": {
504+ "bytes": "3.0.0",
505+ "content-type": "~1.0.4",
506+ "debug": "2.6.9",
507+ "depd": "~1.1.2",
508+ "http-errors": "~1.6.3",
509+ "iconv-lite": "0.4.23",
510+ "on-finished": "~2.3.0",
511+ "qs": "6.5.2",
512+ "raw-body": "2.3.3",
513+ "type-is": "~1.6.16"
514+ },
515+ "dependencies": {
516+ "debug": {
517+ "version": "2.6.9",
518+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
519+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
520+ "dev": true,
521+ "requires": {
522+ "ms": "2.0.0"
523+ }
524+ }
525+ }
526+ },
527+ "bonjour": {
528+ "version": "3.5.0",
529+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
530+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
531+ "dev": true,
532+ "requires": {
533+ "array-flatten": "^2.1.0",
534+ "deep-equal": "^1.0.1",
535+ "dns-equal": "^1.0.0",
536+ "dns-txt": "^2.0.2",
537+ "multicast-dns": "^6.0.1",
538+ "multicast-dns-service-types": "^1.1.0"
539+ }
540+ },
541+ "boolbase": {
542+ "version": "1.0.0",
543+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
544+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
545+ "dev": true
546+ },
547+ "brace-expansion": {
548+ "version": "1.1.11",
549+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
550+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
551+ "dev": true,
552+ "requires": {
553+ "balanced-match": "^1.0.0",
554+ "concat-map": "0.0.1"
555+ }
556+ },
557+ "braces": {
558+ "version": "2.3.2",
559+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
560+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
561+ "dev": true,
562+ "requires": {
563+ "arr-flatten": "^1.1.0",
564+ "array-unique": "^0.3.2",
565+ "extend-shallow": "^2.0.1",
566+ "fill-range": "^4.0.0",
567+ "isobject": "^3.0.1",
568+ "repeat-element": "^1.1.2",
569+ "snapdragon": "^0.8.1",
570+ "snapdragon-node": "^2.0.1",
571+ "split-string": "^3.0.2",
572+ "to-regex": "^3.0.1"
573+ },
574+ "dependencies": {
575+ "extend-shallow": {
576+ "version": "2.0.1",
577+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
578+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
579+ "dev": true,
580+ "requires": {
581+ "is-extendable": "^0.1.0"
582+ }
583+ }
584+ }
585+ },
586+ "brorand": {
587+ "version": "1.1.0",
588+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
589+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
590+ "dev": true
591+ },
592+ "browserify-aes": {
593+ "version": "1.2.0",
594+ "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
595+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
596+ "dev": true,
597+ "requires": {
598+ "buffer-xor": "^1.0.3",
599+ "cipher-base": "^1.0.0",
600+ "create-hash": "^1.1.0",
601+ "evp_bytestokey": "^1.0.3",
602+ "inherits": "^2.0.1",
603+ "safe-buffer": "^5.0.1"
604+ }
605+ },
606+ "browserify-cipher": {
607+ "version": "1.0.1",
608+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
609+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
610+ "dev": true,
611+ "requires": {
612+ "browserify-aes": "^1.0.4",
613+ "browserify-des": "^1.0.0",
614+ "evp_bytestokey": "^1.0.0"
615+ }
616+ },
617+ "browserify-des": {
618+ "version": "1.0.2",
619+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
620+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
621+ "dev": true,
622+ "requires": {
623+ "cipher-base": "^1.0.1",
624+ "des.js": "^1.0.0",
625+ "inherits": "^2.0.1",
626+ "safe-buffer": "^5.1.2"
627+ }
628+ },
629+ "browserify-rsa": {
630+ "version": "4.0.1",
631+ "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
632+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
633+ "dev": true,
634+ "requires": {
635+ "bn.js": "^4.1.0",
636+ "randombytes": "^2.0.1"
637+ }
638+ },
639+ "browserify-sign": {
640+ "version": "4.0.4",
641+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
642+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
643+ "dev": true,
644+ "requires": {
645+ "bn.js": "^4.1.1",
646+ "browserify-rsa": "^4.0.0",
647+ "create-hash": "^1.1.0",
648+ "create-hmac": "^1.1.2",
649+ "elliptic": "^6.0.0",
650+ "inherits": "^2.0.1",
651+ "parse-asn1": "^5.0.0"
652+ }
653+ },
654+ "browserify-zlib": {
655+ "version": "0.2.0",
656+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
657+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
658+ "dev": true,
659+ "requires": {
660+ "pako": "~1.0.5"
661+ }
662+ },
663+ "buffer": {
664+ "version": "4.9.1",
665+ "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
666+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
667+ "dev": true,
668+ "requires": {
669+ "base64-js": "^1.0.2",
670+ "ieee754": "^1.1.4",
671+ "isarray": "^1.0.0"
672+ }
673+ },
674+ "buffer-from": {
675+ "version": "1.1.1",
676+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
677+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
678+ "dev": true
679+ },
680+ "buffer-indexof": {
681+ "version": "1.1.1",
682+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
683+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
684+ "dev": true
685+ },
686+ "buffer-xor": {
687+ "version": "1.0.3",
688+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
689+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
690+ "dev": true
691+ },
692+ "builtin-status-codes": {
693+ "version": "3.0.0",
694+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
695+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
696+ "dev": true
697+ },
698+ "bytes": {
699+ "version": "3.0.0",
700+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
701+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
702+ "dev": true
703+ },
704+ "cacache": {
705+ "version": "10.0.4",
706+ "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
707+ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
708+ "dev": true,
709+ "requires": {
710+ "bluebird": "^3.5.1",
711+ "chownr": "^1.0.1",
712+ "glob": "^7.1.2",
713+ "graceful-fs": "^4.1.11",
714+ "lru-cache": "^4.1.1",
715+ "mississippi": "^2.0.0",
716+ "mkdirp": "^0.5.1",
717+ "move-concurrently": "^1.0.1",
718+ "promise-inflight": "^1.0.1",
719+ "rimraf": "^2.6.2",
720+ "ssri": "^5.2.4",
721+ "unique-filename": "^1.1.0",
722+ "y18n": "^4.0.0"
723+ }
724+ },
725+ "cache-base": {
726+ "version": "1.0.1",
727+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
728+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
729+ "dev": true,
730+ "requires": {
731+ "collection-visit": "^1.0.0",
732+ "component-emitter": "^1.2.1",
733+ "get-value": "^2.0.6",
734+ "has-value": "^1.0.0",
735+ "isobject": "^3.0.1",
736+ "set-value": "^2.0.0",
737+ "to-object-path": "^0.3.0",
738+ "union-value": "^1.0.0",
739+ "unset-value": "^1.0.0"
740+ }
741+ },
742+ "camel-case": {
743+ "version": "3.0.0",
744+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
745+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
746+ "dev": true,
747+ "requires": {
748+ "no-case": "^2.2.0",
749+ "upper-case": "^1.1.1"
750+ }
751+ },
752+ "camelcase": {
753+ "version": "4.1.0",
754+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
755+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
756+ "dev": true
757+ },
758+ "chalk": {
759+ "version": "2.4.1",
760+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
761+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
762+ "dev": true,
763+ "requires": {
764+ "ansi-styles": "^3.2.1",
765+ "escape-string-regexp": "^1.0.5",
766+ "supports-color": "^5.3.0"
767+ }
768+ },
769+ "chokidar": {
770+ "version": "2.0.4",
771+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
772+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
773+ "dev": true,
774+ "requires": {
775+ "anymatch": "^2.0.0",
776+ "async-each": "^1.0.0",
777+ "braces": "^2.3.0",
778+ "fsevents": "^1.2.2",
779+ "glob-parent": "^3.1.0",
780+ "inherits": "^2.0.1",
781+ "is-binary-path": "^1.0.0",
782+ "is-glob": "^4.0.0",
783+ "lodash.debounce": "^4.0.8",
784+ "normalize-path": "^2.1.1",
785+ "path-is-absolute": "^1.0.0",
786+ "readdirp": "^2.0.0",
787+ "upath": "^1.0.5"
788+ }
789+ },
790+ "chownr": {
791+ "version": "1.1.1",
792+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
793+ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
794+ "dev": true
795+ },
796+ "chrome-trace-event": {
797+ "version": "1.0.0",
798+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
799+ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
800+ "dev": true,
801+ "requires": {
802+ "tslib": "^1.9.0"
803+ }
804+ },
805+ "cipher-base": {
806+ "version": "1.0.4",
807+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
808+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
809+ "dev": true,
810+ "requires": {
811+ "inherits": "^2.0.1",
812+ "safe-buffer": "^5.0.1"
813+ }
814+ },
815+ "class-utils": {
816+ "version": "0.3.6",
817+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
818+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
819+ "dev": true,
820+ "requires": {
821+ "arr-union": "^3.1.0",
822+ "define-property": "^0.2.5",
823+ "isobject": "^3.0.0",
824+ "static-extend": "^0.1.1"
825+ },
826+ "dependencies": {
827+ "define-property": {
828+ "version": "0.2.5",
829+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
830+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
831+ "dev": true,
832+ "requires": {
833+ "is-descriptor": "^0.1.0"
834+ }
835+ }
836+ }
837+ },
838+ "clean-css": {
839+ "version": "4.1.11",
840+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
841+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
842+ "dev": true,
843+ "requires": {
844+ "source-map": "0.5.x"
845+ }
846+ },
847+ "cliui": {
848+ "version": "4.1.0",
849+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
850+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
851+ "dev": true,
852+ "requires": {
853+ "string-width": "^2.1.1",
854+ "strip-ansi": "^4.0.0",
855+ "wrap-ansi": "^2.0.0"
856+ },
857+ "dependencies": {
858+ "ansi-regex": {
859+ "version": "3.0.0",
860+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
861+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
862+ "dev": true
863+ },
864+ "strip-ansi": {
865+ "version": "4.0.0",
866+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
867+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
868+ "dev": true,
869+ "requires": {
870+ "ansi-regex": "^3.0.0"
871+ }
872+ }
873+ }
874+ },
875+ "code-point-at": {
876+ "version": "1.1.0",
877+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
878+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
879+ "dev": true
880+ },
881+ "collection-visit": {
882+ "version": "1.0.0",
883+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
884+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
885+ "dev": true,
886+ "requires": {
887+ "map-visit": "^1.0.0",
888+ "object-visit": "^1.0.0"
889+ }
890+ },
891+ "color-convert": {
892+ "version": "1.9.2",
893+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
894+ "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
895+ "dev": true,
896+ "requires": {
897+ "color-name": "1.1.1"
898+ }
899+ },
900+ "color-name": {
901+ "version": "1.1.1",
902+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
903+ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
904+ "dev": true
905+ },
906+ "command-exists": {
907+ "version": "1.2.8",
908+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
909+ "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==",
910+ "dev": true
911+ },
912+ "commander": {
913+ "version": "2.13.0",
914+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
915+ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
916+ "dev": true
917+ },
918+ "commondir": {
919+ "version": "1.0.1",
920+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
921+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
922+ "dev": true
923+ },
924+ "component-emitter": {
925+ "version": "1.2.1",
926+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
927+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
928+ "dev": true
929+ },
930+ "compressible": {
931+ "version": "2.0.15",
932+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
933+ "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
934+ "dev": true,
935+ "requires": {
936+ "mime-db": ">= 1.36.0 < 2"
937+ }
938+ },
939+ "compression": {
940+ "version": "1.7.3",
941+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
942+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
943+ "dev": true,
944+ "requires": {
945+ "accepts": "~1.3.5",
946+ "bytes": "3.0.0",
947+ "compressible": "~2.0.14",
948+ "debug": "2.6.9",
949+ "on-headers": "~1.0.1",
950+ "safe-buffer": "5.1.2",
951+ "vary": "~1.1.2"
952+ },
953+ "dependencies": {
954+ "debug": {
955+ "version": "2.6.9",
956+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
957+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
958+ "dev": true,
959+ "requires": {
960+ "ms": "2.0.0"
961+ }
962+ }
963+ }
964+ },
965+ "concat-map": {
966+ "version": "0.0.1",
967+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
968+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
969+ "dev": true
970+ },
971+ "concat-stream": {
972+ "version": "1.6.2",
973+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
974+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
975+ "dev": true,
976+ "requires": {
977+ "buffer-from": "^1.0.0",
978+ "inherits": "^2.0.3",
979+ "readable-stream": "^2.2.2",
980+ "typedarray": "^0.0.6"
981+ }
982+ },
983+ "connect-history-api-fallback": {
984+ "version": "1.5.0",
985+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
986+ "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
987+ "dev": true
988+ },
989+ "console-browserify": {
990+ "version": "1.1.0",
991+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
992+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
993+ "dev": true,
994+ "requires": {
995+ "date-now": "^0.1.4"
996+ }
997+ },
998+ "constants-browserify": {
999+ "version": "1.0.0",
1000+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1001+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
1002+ "dev": true
1003+ },
1004+ "content-disposition": {
1005+ "version": "0.5.2",
1006+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
1007+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
1008+ "dev": true
1009+ },
1010+ "content-type": {
1011+ "version": "1.0.4",
1012+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1013+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
1014+ "dev": true
1015+ },
1016+ "cookie": {
1017+ "version": "0.3.1",
1018+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
1019+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
1020+ "dev": true
1021+ },
1022+ "cookie-signature": {
1023+ "version": "1.0.6",
1024+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1025+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
1026+ "dev": true
1027+ },
1028+ "copy-concurrently": {
1029+ "version": "1.0.5",
1030+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
1031+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
1032+ "dev": true,
1033+ "requires": {
1034+ "aproba": "^1.1.1",
1035+ "fs-write-stream-atomic": "^1.0.8",
1036+ "iferr": "^0.1.5",
1037+ "mkdirp": "^0.5.1",
1038+ "rimraf": "^2.5.4",
1039+ "run-queue": "^1.0.0"
1040+ }
1041+ },
1042+ "copy-descriptor": {
1043+ "version": "0.1.1",
1044+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
1045+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
1046+ "dev": true
1047+ },
1048+ "core-util-is": {
1049+ "version": "1.0.2",
1050+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1051+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1052+ "dev": true
1053+ },
1054+ "create-ecdh": {
1055+ "version": "4.0.3",
1056+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
1057+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
1058+ "dev": true,
1059+ "requires": {
1060+ "bn.js": "^4.1.0",
1061+ "elliptic": "^6.0.0"
1062+ }
1063+ },
1064+ "create-hash": {
1065+ "version": "1.2.0",
1066+ "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1067+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1068+ "dev": true,
1069+ "requires": {
1070+ "cipher-base": "^1.0.1",
1071+ "inherits": "^2.0.1",
1072+ "md5.js": "^1.3.4",
1073+ "ripemd160": "^2.0.1",
1074+ "sha.js": "^2.4.0"
1075+ }
1076+ },
1077+ "create-hmac": {
1078+ "version": "1.1.7",
1079+ "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1080+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1081+ "dev": true,
1082+ "requires": {
1083+ "cipher-base": "^1.0.3",
1084+ "create-hash": "^1.1.0",
1085+ "inherits": "^2.0.1",
1086+ "ripemd160": "^2.0.0",
1087+ "safe-buffer": "^5.0.1",
1088+ "sha.js": "^2.4.8"
1089+ }
1090+ },
1091+ "cross-spawn": {
1092+ "version": "6.0.5",
1093+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1094+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1095+ "dev": true,
1096+ "requires": {
1097+ "nice-try": "^1.0.4",
1098+ "path-key": "^2.0.1",
1099+ "semver": "^5.5.0",
1100+ "shebang-command": "^1.2.0",
1101+ "which": "^1.2.9"
1102+ }
1103+ },
1104+ "crypto-browserify": {
1105+ "version": "3.12.0",
1106+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1107+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1108+ "dev": true,
1109+ "requires": {
1110+ "browserify-cipher": "^1.0.0",
1111+ "browserify-sign": "^4.0.0",
1112+ "create-ecdh": "^4.0.0",
1113+ "create-hash": "^1.1.0",
1114+ "create-hmac": "^1.1.0",
1115+ "diffie-hellman": "^5.0.0",
1116+ "inherits": "^2.0.1",
1117+ "pbkdf2": "^3.0.3",
1118+ "public-encrypt": "^4.0.0",
1119+ "randombytes": "^2.0.0",
1120+ "randomfill": "^1.0.3"
1121+ }
1122+ },
1123+ "css-select": {
1124+ "version": "1.2.0",
1125+ "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
1126+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
1127+ "dev": true,
1128+ "requires": {
1129+ "boolbase": "~1.0.0",
1130+ "css-what": "2.1",
1131+ "domutils": "1.5.1",
1132+ "nth-check": "~1.0.1"
1133+ }
1134+ },
1135+ "css-what": {
1136+ "version": "2.1.0",
1137+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
1138+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
1139+ "dev": true
1140+ },
1141+ "cyclist": {
1142+ "version": "0.2.2",
1143+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
1144+ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
1145+ "dev": true
1146+ },
1147+ "date-now": {
1148+ "version": "0.1.4",
1149+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
1150+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
1151+ "dev": true
1152+ },
1153+ "debug": {
1154+ "version": "3.2.6",
1155+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1156+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1157+ "dev": true,
1158+ "requires": {
1159+ "ms": "^2.1.1"
1160+ },
1161+ "dependencies": {
1162+ "ms": {
1163+ "version": "2.1.1",
1164+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1165+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1166+ "dev": true
1167+ }
1168+ }
1169+ },
1170+ "decamelize": {
1171+ "version": "2.0.0",
1172+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
1173+ "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
1174+ "dev": true,
1175+ "requires": {
1176+ "xregexp": "4.0.0"
1177+ }
1178+ },
1179+ "decode-uri-component": {
1180+ "version": "0.2.0",
1181+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1182+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1183+ "dev": true
1184+ },
1185+ "deep-equal": {
1186+ "version": "1.0.1",
1187+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
1188+ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
1189+ "dev": true
1190+ },
1191+ "default-gateway": {
1192+ "version": "2.7.2",
1193+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
1194+ "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
1195+ "dev": true,
1196+ "requires": {
1197+ "execa": "^0.10.0",
1198+ "ip-regex": "^2.1.0"
1199+ }
1200+ },
1201+ "define-properties": {
1202+ "version": "1.1.2",
1203+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
1204+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
1205+ "dev": true,
1206+ "requires": {
1207+ "foreach": "^2.0.5",
1208+ "object-keys": "^1.0.8"
1209+ }
1210+ },
1211+ "define-property": {
1212+ "version": "2.0.2",
1213+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1214+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1215+ "dev": true,
1216+ "requires": {
1217+ "is-descriptor": "^1.0.2",
1218+ "isobject": "^3.0.1"
1219+ },
1220+ "dependencies": {
1221+ "is-accessor-descriptor": {
1222+ "version": "1.0.0",
1223+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1224+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1225+ "dev": true,
1226+ "requires": {
1227+ "kind-of": "^6.0.0"
1228+ }
1229+ },
1230+ "is-data-descriptor": {
1231+ "version": "1.0.0",
1232+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1233+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1234+ "dev": true,
1235+ "requires": {
1236+ "kind-of": "^6.0.0"
1237+ }
1238+ },
1239+ "is-descriptor": {
1240+ "version": "1.0.2",
1241+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1242+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1243+ "dev": true,
1244+ "requires": {
1245+ "is-accessor-descriptor": "^1.0.0",
1246+ "is-data-descriptor": "^1.0.0",
1247+ "kind-of": "^6.0.2"
1248+ }
1249+ }
1250+ }
1251+ },
1252+ "del": {
1253+ "version": "3.0.0",
1254+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
1255+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
1256+ "dev": true,
1257+ "requires": {
1258+ "globby": "^6.1.0",
1259+ "is-path-cwd": "^1.0.0",
1260+ "is-path-in-cwd": "^1.0.0",
1261+ "p-map": "^1.1.1",
1262+ "pify": "^3.0.0",
1263+ "rimraf": "^2.2.8"
1264+ }
1265+ },
1266+ "depd": {
1267+ "version": "1.1.2",
1268+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1269+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
1270+ "dev": true
1271+ },
1272+ "des.js": {
1273+ "version": "1.0.0",
1274+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
1275+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
1276+ "dev": true,
1277+ "requires": {
1278+ "inherits": "^2.0.1",
1279+ "minimalistic-assert": "^1.0.0"
1280+ }
1281+ },
1282+ "destroy": {
1283+ "version": "1.0.4",
1284+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
1285+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
1286+ "dev": true
1287+ },
1288+ "detect-node": {
1289+ "version": "2.0.4",
1290+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
1291+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
1292+ "dev": true
1293+ },
1294+ "diffie-hellman": {
1295+ "version": "5.0.3",
1296+ "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1297+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1298+ "dev": true,
1299+ "requires": {
1300+ "bn.js": "^4.1.0",
1301+ "miller-rabin": "^4.0.0",
1302+ "randombytes": "^2.0.0"
1303+ }
1304+ },
1305+ "dns-equal": {
1306+ "version": "1.0.0",
1307+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
1308+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
1309+ "dev": true
1310+ },
1311+ "dns-packet": {
1312+ "version": "1.3.1",
1313+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
1314+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
1315+ "dev": true,
1316+ "requires": {
1317+ "ip": "^1.1.0",
1318+ "safe-buffer": "^5.0.1"
1319+ }
1320+ },
1321+ "dns-txt": {
1322+ "version": "2.0.2",
1323+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
1324+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
1325+ "dev": true,
1326+ "requires": {
1327+ "buffer-indexof": "^1.0.0"
1328+ }
1329+ },
1330+ "dom-converter": {
1331+ "version": "0.1.4",
1332+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
1333+ "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
1334+ "dev": true,
1335+ "requires": {
1336+ "utila": "~0.3"
1337+ },
1338+ "dependencies": {
1339+ "utila": {
1340+ "version": "0.3.3",
1341+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
1342+ "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
1343+ "dev": true
1344+ }
1345+ }
1346+ },
1347+ "dom-serializer": {
1348+ "version": "0.1.0",
1349+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
1350+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
1351+ "dev": true,
1352+ "requires": {
1353+ "domelementtype": "~1.1.1",
1354+ "entities": "~1.1.1"
1355+ },
1356+ "dependencies": {
1357+ "domelementtype": {
1358+ "version": "1.1.3",
1359+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1360+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1361+ "dev": true
1362+ }
1363+ }
1364+ },
1365+ "domain-browser": {
1366+ "version": "1.2.0",
1367+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1368+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1369+ "dev": true
1370+ },
1371+ "domelementtype": {
1372+ "version": "1.3.0",
1373+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
1374+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
1375+ "dev": true
1376+ },
1377+ "domhandler": {
1378+ "version": "2.1.0",
1379+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
1380+ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
1381+ "dev": true,
1382+ "requires": {
1383+ "domelementtype": "1"
1384+ }
1385+ },
1386+ "domutils": {
1387+ "version": "1.5.1",
1388+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
1389+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
1390+ "dev": true,
1391+ "requires": {
1392+ "dom-serializer": "0",
1393+ "domelementtype": "1"
1394+ }
1395+ },
1396+ "duplexify": {
1397+ "version": "3.6.1",
1398+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
1399+ "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
1400+ "dev": true,
1401+ "requires": {
1402+ "end-of-stream": "^1.0.0",
1403+ "inherits": "^2.0.1",
1404+ "readable-stream": "^2.0.0",
1405+ "stream-shift": "^1.0.0"
1406+ }
1407+ },
1408+ "ee-first": {
1409+ "version": "1.1.1",
1410+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1411+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
1412+ "dev": true
1413+ },
1414+ "elliptic": {
1415+ "version": "6.4.1",
1416+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
1417+ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
1418+ "dev": true,
1419+ "requires": {
1420+ "bn.js": "^4.4.0",
1421+ "brorand": "^1.0.1",
1422+ "hash.js": "^1.0.0",
1423+ "hmac-drbg": "^1.0.0",
1424+ "inherits": "^2.0.1",
1425+ "minimalistic-assert": "^1.0.0",
1426+ "minimalistic-crypto-utils": "^1.0.0"
1427+ }
1428+ },
1429+ "emojis-list": {
1430+ "version": "2.1.0",
1431+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
1432+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
1433+ "dev": true
1434+ },
1435+ "encodeurl": {
1436+ "version": "1.0.2",
1437+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1438+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
1439+ "dev": true
1440+ },
1441+ "end-of-stream": {
1442+ "version": "1.4.1",
1443+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1444+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1445+ "dev": true,
1446+ "requires": {
1447+ "once": "^1.4.0"
1448+ }
1449+ },
1450+ "enhanced-resolve": {
1451+ "version": "4.1.0",
1452+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
1453+ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
1454+ "dev": true,
1455+ "requires": {
1456+ "graceful-fs": "^4.1.2",
1457+ "memory-fs": "^0.4.0",
1458+ "tapable": "^1.0.0"
1459+ }
1460+ },
1461+ "entities": {
1462+ "version": "1.1.1",
1463+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
1464+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
1465+ "dev": true
1466+ },
1467+ "errno": {
1468+ "version": "0.1.7",
1469+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
1470+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
1471+ "dev": true,
1472+ "requires": {
1473+ "prr": "~1.0.1"
1474+ }
1475+ },
1476+ "es-abstract": {
1477+ "version": "1.12.0",
1478+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
1479+ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
1480+ "dev": true,
1481+ "requires": {
1482+ "es-to-primitive": "^1.1.1",
1483+ "function-bind": "^1.1.1",
1484+ "has": "^1.0.1",
1485+ "is-callable": "^1.1.3",
1486+ "is-regex": "^1.0.4"
1487+ }
1488+ },
1489+ "es-to-primitive": {
1490+ "version": "1.1.1",
1491+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
1492+ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
1493+ "dev": true,
1494+ "requires": {
1495+ "is-callable": "^1.1.1",
1496+ "is-date-object": "^1.0.1",
1497+ "is-symbol": "^1.0.1"
1498+ }
1499+ },
1500+ "escape-html": {
1501+ "version": "1.0.3",
1502+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1503+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
1504+ "dev": true
1505+ },
1506+ "escape-string-regexp": {
1507+ "version": "1.0.5",
1508+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1509+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1510+ "dev": true
1511+ },
1512+ "eslint-scope": {
1513+ "version": "4.0.0",
1514+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
1515+ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
1516+ "dev": true,
1517+ "requires": {
1518+ "esrecurse": "^4.1.0",
1519+ "estraverse": "^4.1.1"
1520+ }
1521+ },
1522+ "esrecurse": {
1523+ "version": "4.2.1",
1524+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1525+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1526+ "dev": true,
1527+ "requires": {
1528+ "estraverse": "^4.1.0"
1529+ }
1530+ },
1531+ "estraverse": {
1532+ "version": "4.2.0",
1533+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1534+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1535+ "dev": true
1536+ },
1537+ "etag": {
1538+ "version": "1.8.1",
1539+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1540+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
1541+ "dev": true
1542+ },
1543+ "eventemitter3": {
1544+ "version": "3.1.0",
1545+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
1546+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
1547+ "dev": true
1548+ },
1549+ "events": {
1550+ "version": "1.1.1",
1551+ "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
1552+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
1553+ "dev": true
1554+ },
1555+ "eventsource": {
1556+ "version": "1.0.7",
1557+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
1558+ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
1559+ "dev": true,
1560+ "requires": {
1561+ "original": "^1.0.0"
1562+ }
1563+ },
1564+ "evp_bytestokey": {
1565+ "version": "1.0.3",
1566+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1567+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1568+ "dev": true,
1569+ "requires": {
1570+ "md5.js": "^1.3.4",
1571+ "safe-buffer": "^5.1.1"
1572+ }
1573+ },
1574+ "execa": {
1575+ "version": "0.10.0",
1576+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
1577+ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
1578+ "dev": true,
1579+ "requires": {
1580+ "cross-spawn": "^6.0.0",
1581+ "get-stream": "^3.0.0",
1582+ "is-stream": "^1.1.0",
1583+ "npm-run-path": "^2.0.0",
1584+ "p-finally": "^1.0.0",
1585+ "signal-exit": "^3.0.0",
1586+ "strip-eof": "^1.0.0"
1587+ }
1588+ },
1589+ "expand-brackets": {
1590+ "version": "2.1.4",
1591+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
1592+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
1593+ "dev": true,
1594+ "requires": {
1595+ "debug": "^2.3.3",
1596+ "define-property": "^0.2.5",
1597+ "extend-shallow": "^2.0.1",
1598+ "posix-character-classes": "^0.1.0",
1599+ "regex-not": "^1.0.0",
1600+ "snapdragon": "^0.8.1",
1601+ "to-regex": "^3.0.1"
1602+ },
1603+ "dependencies": {
1604+ "debug": {
1605+ "version": "2.6.9",
1606+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1607+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1608+ "dev": true,
1609+ "requires": {
1610+ "ms": "2.0.0"
1611+ }
1612+ },
1613+ "define-property": {
1614+ "version": "0.2.5",
1615+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1616+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1617+ "dev": true,
1618+ "requires": {
1619+ "is-descriptor": "^0.1.0"
1620+ }
1621+ },
1622+ "extend-shallow": {
1623+ "version": "2.0.1",
1624+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1625+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1626+ "dev": true,
1627+ "requires": {
1628+ "is-extendable": "^0.1.0"
1629+ }
1630+ }
1631+ }
1632+ },
1633+ "express": {
1634+ "version": "4.16.4",
1635+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
1636+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
1637+ "dev": true,
1638+ "requires": {
1639+ "accepts": "~1.3.5",
1640+ "array-flatten": "1.1.1",
1641+ "body-parser": "1.18.3",
1642+ "content-disposition": "0.5.2",
1643+ "content-type": "~1.0.4",
1644+ "cookie": "0.3.1",
1645+ "cookie-signature": "1.0.6",
1646+ "debug": "2.6.9",
1647+ "depd": "~1.1.2",
1648+ "encodeurl": "~1.0.2",
1649+ "escape-html": "~1.0.3",
1650+ "etag": "~1.8.1",
1651+ "finalhandler": "1.1.1",
1652+ "fresh": "0.5.2",
1653+ "merge-descriptors": "1.0.1",
1654+ "methods": "~1.1.2",
1655+ "on-finished": "~2.3.0",
1656+ "parseurl": "~1.3.2",
1657+ "path-to-regexp": "0.1.7",
1658+ "proxy-addr": "~2.0.4",
1659+ "qs": "6.5.2",
1660+ "range-parser": "~1.2.0",
1661+ "safe-buffer": "5.1.2",
1662+ "send": "0.16.2",
1663+ "serve-static": "1.13.2",
1664+ "setprototypeof": "1.1.0",
1665+ "statuses": "~1.4.0",
1666+ "type-is": "~1.6.16",
1667+ "utils-merge": "1.0.1",
1668+ "vary": "~1.1.2"
1669+ },
1670+ "dependencies": {
1671+ "array-flatten": {
1672+ "version": "1.1.1",
1673+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1674+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
1675+ "dev": true
1676+ },
1677+ "debug": {
1678+ "version": "2.6.9",
1679+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1680+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1681+ "dev": true,
1682+ "requires": {
1683+ "ms": "2.0.0"
1684+ }
1685+ }
1686+ }
1687+ },
1688+ "extend-shallow": {
1689+ "version": "3.0.2",
1690+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1691+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1692+ "dev": true,
1693+ "requires": {
1694+ "assign-symbols": "^1.0.0",
1695+ "is-extendable": "^1.0.1"
1696+ },
1697+ "dependencies": {
1698+ "is-extendable": {
1699+ "version": "1.0.1",
1700+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1701+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1702+ "dev": true,
1703+ "requires": {
1704+ "is-plain-object": "^2.0.4"
1705+ }
1706+ }
1707+ }
1708+ },
1709+ "extglob": {
1710+ "version": "2.0.4",
1711+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
1712+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
1713+ "dev": true,
1714+ "requires": {
1715+ "array-unique": "^0.3.2",
1716+ "define-property": "^1.0.0",
1717+ "expand-brackets": "^2.1.4",
1718+ "extend-shallow": "^2.0.1",
1719+ "fragment-cache": "^0.2.1",
1720+ "regex-not": "^1.0.0",
1721+ "snapdragon": "^0.8.1",
1722+ "to-regex": "^3.0.1"
1723+ },
1724+ "dependencies": {
1725+ "define-property": {
1726+ "version": "1.0.0",
1727+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1728+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1729+ "dev": true,
1730+ "requires": {
1731+ "is-descriptor": "^1.0.0"
1732+ }
1733+ },
1734+ "extend-shallow": {
1735+ "version": "2.0.1",
1736+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1737+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1738+ "dev": true,
1739+ "requires": {
1740+ "is-extendable": "^0.1.0"
1741+ }
1742+ },
1743+ "is-accessor-descriptor": {
1744+ "version": "1.0.0",
1745+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1746+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1747+ "dev": true,
1748+ "requires": {
1749+ "kind-of": "^6.0.0"
1750+ }
1751+ },
1752+ "is-data-descriptor": {
1753+ "version": "1.0.0",
1754+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1755+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1756+ "dev": true,
1757+ "requires": {
1758+ "kind-of": "^6.0.0"
1759+ }
1760+ },
1761+ "is-descriptor": {
1762+ "version": "1.0.2",
1763+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1764+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1765+ "dev": true,
1766+ "requires": {
1767+ "is-accessor-descriptor": "^1.0.0",
1768+ "is-data-descriptor": "^1.0.0",
1769+ "kind-of": "^6.0.2"
1770+ }
1771+ }
1772+ }
1773+ },
1774+ "fast-deep-equal": {
1775+ "version": "2.0.1",
1776+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1777+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1778+ "dev": true
1779+ },
1780+ "fast-json-stable-stringify": {
1781+ "version": "2.0.0",
1782+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1783+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1784+ "dev": true
1785+ },
1786+ "faye-websocket": {
1787+ "version": "0.10.0",
1788+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
1789+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
1790+ "dev": true,
1791+ "requires": {
1792+ "websocket-driver": ">=0.5.1"
1793+ }
1794+ },
1795+ "fill-range": {
1796+ "version": "4.0.0",
1797+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
1798+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
1799+ "dev": true,
1800+ "requires": {
1801+ "extend-shallow": "^2.0.1",
1802+ "is-number": "^3.0.0",
1803+ "repeat-string": "^1.6.1",
1804+ "to-regex-range": "^2.1.0"
1805+ },
1806+ "dependencies": {
1807+ "extend-shallow": {
1808+ "version": "2.0.1",
1809+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1810+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1811+ "dev": true,
1812+ "requires": {
1813+ "is-extendable": "^0.1.0"
1814+ }
1815+ }
1816+ }
1817+ },
1818+ "finalhandler": {
1819+ "version": "1.1.1",
1820+ "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
1821+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
1822+ "dev": true,
1823+ "requires": {
1824+ "debug": "2.6.9",
1825+ "encodeurl": "~1.0.2",
1826+ "escape-html": "~1.0.3",
1827+ "on-finished": "~2.3.0",
1828+ "parseurl": "~1.3.2",
1829+ "statuses": "~1.4.0",
1830+ "unpipe": "~1.0.0"
1831+ },
1832+ "dependencies": {
1833+ "debug": {
1834+ "version": "2.6.9",
1835+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1836+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1837+ "dev": true,
1838+ "requires": {
1839+ "ms": "2.0.0"
1840+ }
1841+ }
1842+ }
1843+ },
1844+ "find-cache-dir": {
1845+ "version": "1.0.0",
1846+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
1847+ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
1848+ "dev": true,
1849+ "requires": {
1850+ "commondir": "^1.0.1",
1851+ "make-dir": "^1.0.0",
1852+ "pkg-dir": "^2.0.0"
1853+ }
1854+ },
1855+ "find-up": {
1856+ "version": "2.1.0",
1857+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1858+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1859+ "dev": true,
1860+ "requires": {
1861+ "locate-path": "^2.0.0"
1862+ }
1863+ },
1864+ "flush-write-stream": {
1865+ "version": "1.0.3",
1866+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
1867+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
1868+ "dev": true,
1869+ "requires": {
1870+ "inherits": "^2.0.1",
1871+ "readable-stream": "^2.0.4"
1872+ }
1873+ },
1874+ "follow-redirects": {
1875+ "version": "1.5.9",
1876+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz",
1877+ "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==",
1878+ "dev": true,
1879+ "requires": {
1880+ "debug": "=3.1.0"
1881+ },
1882+ "dependencies": {
1883+ "debug": {
1884+ "version": "3.1.0",
1885+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1886+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1887+ "dev": true,
1888+ "requires": {
1889+ "ms": "2.0.0"
1890+ }
1891+ }
1892+ }
1893+ },
1894+ "for-in": {
1895+ "version": "1.0.2",
1896+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1897+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1898+ "dev": true
1899+ },
1900+ "foreach": {
1901+ "version": "2.0.5",
1902+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1903+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1904+ "dev": true
1905+ },
1906+ "forwarded": {
1907+ "version": "0.1.2",
1908+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1909+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
1910+ "dev": true
1911+ },
1912+ "fragment-cache": {
1913+ "version": "0.2.1",
1914+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
1915+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
1916+ "dev": true,
1917+ "requires": {
1918+ "map-cache": "^0.2.2"
1919+ }
1920+ },
1921+ "fresh": {
1922+ "version": "0.5.2",
1923+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1924+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
1925+ "dev": true
1926+ },
1927+ "from2": {
1928+ "version": "2.3.0",
1929+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1930+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1931+ "dev": true,
1932+ "requires": {
1933+ "inherits": "^2.0.1",
1934+ "readable-stream": "^2.0.0"
1935+ }
1936+ },
1937+ "fs-write-stream-atomic": {
1938+ "version": "1.0.10",
1939+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
1940+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
1941+ "dev": true,
1942+ "requires": {
1943+ "graceful-fs": "^4.1.2",
1944+ "iferr": "^0.1.5",
1945+ "imurmurhash": "^0.1.4",
1946+ "readable-stream": "1 || 2"
1947+ }
1948+ },
1949+ "fs.realpath": {
1950+ "version": "1.0.0",
1951+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1952+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1953+ "dev": true
1954+ },
1955+ "fsevents": {
1956+ "version": "1.2.4",
1957+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
1958+ "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
1959+ "dev": true,
1960+ "optional": true,
1961+ "requires": {
1962+ "nan": "^2.9.2",
1963+ "node-pre-gyp": "^0.10.0"
1964+ },
1965+ "dependencies": {
1966+ "abbrev": {
1967+ "version": "1.1.1",
1968+ "bundled": true,
1969+ "dev": true,
1970+ "optional": true
1971+ },
1972+ "ansi-regex": {
1973+ "version": "2.1.1",
1974+ "bundled": true,
1975+ "dev": true
1976+ },
1977+ "aproba": {
1978+ "version": "1.2.0",
1979+ "bundled": true,
1980+ "dev": true,
1981+ "optional": true
1982+ },
1983+ "are-we-there-yet": {
1984+ "version": "1.1.4",
1985+ "bundled": true,
1986+ "dev": true,
1987+ "optional": true,
1988+ "requires": {
1989+ "delegates": "^1.0.0",
1990+ "readable-stream": "^2.0.6"
1991+ }
1992+ },
1993+ "balanced-match": {
1994+ "version": "1.0.0",
1995+ "bundled": true,
1996+ "dev": true
1997+ },
1998+ "brace-expansion": {
1999+ "version": "1.1.11",
2000+ "bundled": true,
2001+ "dev": true,
2002+ "requires": {
2003+ "balanced-match": "^1.0.0",
2004+ "concat-map": "0.0.1"
2005+ }
2006+ },
2007+ "chownr": {
2008+ "version": "1.0.1",
2009+ "bundled": true,
2010+ "dev": true,
2011+ "optional": true
2012+ },
2013+ "code-point-at": {
2014+ "version": "1.1.0",
2015+ "bundled": true,
2016+ "dev": true
2017+ },
2018+ "concat-map": {
2019+ "version": "0.0.1",
2020+ "bundled": true,
2021+ "dev": true
2022+ },
2023+ "console-control-strings": {
2024+ "version": "1.1.0",
2025+ "bundled": true,
2026+ "dev": true
2027+ },
2028+ "core-util-is": {
2029+ "version": "1.0.2",
2030+ "bundled": true,
2031+ "dev": true,
2032+ "optional": true
2033+ },
2034+ "debug": {
2035+ "version": "2.6.9",
2036+ "bundled": true,
2037+ "dev": true,
2038+ "optional": true,
2039+ "requires": {
2040+ "ms": "2.0.0"
2041+ }
2042+ },
2043+ "deep-extend": {
2044+ "version": "0.5.1",
2045+ "bundled": true,
2046+ "dev": true,
2047+ "optional": true
2048+ },
2049+ "delegates": {
2050+ "version": "1.0.0",
2051+ "bundled": true,
2052+ "dev": true,
2053+ "optional": true
2054+ },
2055+ "detect-libc": {
2056+ "version": "1.0.3",
2057+ "bundled": true,
2058+ "dev": true,
2059+ "optional": true
2060+ },
2061+ "fs-minipass": {
2062+ "version": "1.2.5",
2063+ "bundled": true,
2064+ "dev": true,
2065+ "optional": true,
2066+ "requires": {
2067+ "minipass": "^2.2.1"
2068+ }
2069+ },
2070+ "fs.realpath": {
2071+ "version": "1.0.0",
2072+ "bundled": true,
2073+ "dev": true,
2074+ "optional": true
2075+ },
2076+ "gauge": {
2077+ "version": "2.7.4",
2078+ "bundled": true,
2079+ "dev": true,
2080+ "optional": true,
2081+ "requires": {
2082+ "aproba": "^1.0.3",
2083+ "console-control-strings": "^1.0.0",
2084+ "has-unicode": "^2.0.0",
2085+ "object-assign": "^4.1.0",
2086+ "signal-exit": "^3.0.0",
2087+ "string-width": "^1.0.1",
2088+ "strip-ansi": "^3.0.1",
2089+ "wide-align": "^1.1.0"
2090+ }
2091+ },
2092+ "glob": {
2093+ "version": "7.1.2",
2094+ "bundled": true,
2095+ "dev": true,
2096+ "optional": true,
2097+ "requires": {
2098+ "fs.realpath": "^1.0.0",
2099+ "inflight": "^1.0.4",
2100+ "inherits": "2",
2101+ "minimatch": "^3.0.4",
2102+ "once": "^1.3.0",
2103+ "path-is-absolute": "^1.0.0"
2104+ }
2105+ },
2106+ "has-unicode": {
2107+ "version": "2.0.1",
2108+ "bundled": true,
2109+ "dev": true,
2110+ "optional": true
2111+ },
2112+ "iconv-lite": {
2113+ "version": "0.4.21",
2114+ "bundled": true,
2115+ "dev": true,
2116+ "optional": true,
2117+ "requires": {
2118+ "safer-buffer": "^2.1.0"
2119+ }
2120+ },
2121+ "ignore-walk": {
2122+ "version": "3.0.1",
2123+ "bundled": true,
2124+ "dev": true,
2125+ "optional": true,
2126+ "requires": {
2127+ "minimatch": "^3.0.4"
2128+ }
2129+ },
2130+ "inflight": {
2131+ "version": "1.0.6",
2132+ "bundled": true,
2133+ "dev": true,
2134+ "optional": true,
2135+ "requires": {
2136+ "once": "^1.3.0",
2137+ "wrappy": "1"
2138+ }
2139+ },
2140+ "inherits": {
2141+ "version": "2.0.3",
2142+ "bundled": true,
2143+ "dev": true
2144+ },
2145+ "ini": {
2146+ "version": "1.3.5",
2147+ "bundled": true,
2148+ "dev": true,
2149+ "optional": true
2150+ },
2151+ "is-fullwidth-code-point": {
2152+ "version": "1.0.0",
2153+ "bundled": true,
2154+ "dev": true,
2155+ "requires": {
2156+ "number-is-nan": "^1.0.0"
2157+ }
2158+ },
2159+ "isarray": {
2160+ "version": "1.0.0",
2161+ "bundled": true,
2162+ "dev": true,
2163+ "optional": true
2164+ },
2165+ "minimatch": {
2166+ "version": "3.0.4",
2167+ "bundled": true,
2168+ "dev": true,
2169+ "requires": {
2170+ "brace-expansion": "^1.1.7"
2171+ }
2172+ },
2173+ "minimist": {
2174+ "version": "0.0.8",
2175+ "bundled": true,
2176+ "dev": true
2177+ },
2178+ "minipass": {
2179+ "version": "2.2.4",
2180+ "bundled": true,
2181+ "dev": true,
2182+ "requires": {
2183+ "safe-buffer": "^5.1.1",
2184+ "yallist": "^3.0.0"
2185+ }
2186+ },
2187+ "minizlib": {
2188+ "version": "1.1.0",
2189+ "bundled": true,
2190+ "dev": true,
2191+ "optional": true,
2192+ "requires": {
2193+ "minipass": "^2.2.1"
2194+ }
2195+ },
2196+ "mkdirp": {
2197+ "version": "0.5.1",
2198+ "bundled": true,
2199+ "dev": true,
2200+ "requires": {
2201+ "minimist": "0.0.8"
2202+ }
2203+ },
2204+ "ms": {
2205+ "version": "2.0.0",
2206+ "bundled": true,
2207+ "dev": true,
2208+ "optional": true
2209+ },
2210+ "needle": {
2211+ "version": "2.2.0",
2212+ "bundled": true,
2213+ "dev": true,
2214+ "optional": true,
2215+ "requires": {
2216+ "debug": "^2.1.2",
2217+ "iconv-lite": "^0.4.4",
2218+ "sax": "^1.2.4"
2219+ }
2220+ },
2221+ "node-pre-gyp": {
2222+ "version": "0.10.0",
2223+ "bundled": true,
2224+ "dev": true,
2225+ "optional": true,
2226+ "requires": {
2227+ "detect-libc": "^1.0.2",
2228+ "mkdirp": "^0.5.1",
2229+ "needle": "^2.2.0",
2230+ "nopt": "^4.0.1",
2231+ "npm-packlist": "^1.1.6",
2232+ "npmlog": "^4.0.2",
2233+ "rc": "^1.1.7",
2234+ "rimraf": "^2.6.1",
2235+ "semver": "^5.3.0",
2236+ "tar": "^4"
2237+ }
2238+ },
2239+ "nopt": {
2240+ "version": "4.0.1",
2241+ "bundled": true,
2242+ "dev": true,
2243+ "optional": true,
2244+ "requires": {
2245+ "abbrev": "1",
2246+ "osenv": "^0.1.4"
2247+ }
2248+ },
2249+ "npm-bundled": {
2250+ "version": "1.0.3",
2251+ "bundled": true,
2252+ "dev": true,
2253+ "optional": true
2254+ },
2255+ "npm-packlist": {
2256+ "version": "1.1.10",
2257+ "bundled": true,
2258+ "dev": true,
2259+ "optional": true,
2260+ "requires": {
2261+ "ignore-walk": "^3.0.1",
2262+ "npm-bundled": "^1.0.1"
2263+ }
2264+ },
2265+ "npmlog": {
2266+ "version": "4.1.2",
2267+ "bundled": true,
2268+ "dev": true,
2269+ "optional": true,
2270+ "requires": {
2271+ "are-we-there-yet": "~1.1.2",
2272+ "console-control-strings": "~1.1.0",
2273+ "gauge": "~2.7.3",
2274+ "set-blocking": "~2.0.0"
2275+ }
2276+ },
2277+ "number-is-nan": {
2278+ "version": "1.0.1",
2279+ "bundled": true,
2280+ "dev": true
2281+ },
2282+ "object-assign": {
2283+ "version": "4.1.1",
2284+ "bundled": true,
2285+ "dev": true,
2286+ "optional": true
2287+ },
2288+ "once": {
2289+ "version": "1.4.0",
2290+ "bundled": true,
2291+ "dev": true,
2292+ "requires": {
2293+ "wrappy": "1"
2294+ }
2295+ },
2296+ "os-homedir": {
2297+ "version": "1.0.2",
2298+ "bundled": true,
2299+ "dev": true,
2300+ "optional": true
2301+ },
2302+ "os-tmpdir": {
2303+ "version": "1.0.2",
2304+ "bundled": true,
2305+ "dev": true,
2306+ "optional": true
2307+ },
2308+ "osenv": {
2309+ "version": "0.1.5",
2310+ "bundled": true,
2311+ "dev": true,
2312+ "optional": true,
2313+ "requires": {
2314+ "os-homedir": "^1.0.0",
2315+ "os-tmpdir": "^1.0.0"
2316+ }
2317+ },
2318+ "path-is-absolute": {
2319+ "version": "1.0.1",
2320+ "bundled": true,
2321+ "dev": true,
2322+ "optional": true
2323+ },
2324+ "process-nextick-args": {
2325+ "version": "2.0.0",
2326+ "bundled": true,
2327+ "dev": true,
2328+ "optional": true
2329+ },
2330+ "rc": {
2331+ "version": "1.2.7",
2332+ "bundled": true,
2333+ "dev": true,
2334+ "optional": true,
2335+ "requires": {
2336+ "deep-extend": "^0.5.1",
2337+ "ini": "~1.3.0",
2338+ "minimist": "^1.2.0",
2339+ "strip-json-comments": "~2.0.1"
2340+ },
2341+ "dependencies": {
2342+ "minimist": {
2343+ "version": "1.2.0",
2344+ "bundled": true,
2345+ "dev": true,
2346+ "optional": true
2347+ }
2348+ }
2349+ },
2350+ "readable-stream": {
2351+ "version": "2.3.6",
2352+ "bundled": true,
2353+ "dev": true,
2354+ "optional": true,
2355+ "requires": {
2356+ "core-util-is": "~1.0.0",
2357+ "inherits": "~2.0.3",
2358+ "isarray": "~1.0.0",
2359+ "process-nextick-args": "~2.0.0",
2360+ "safe-buffer": "~5.1.1",
2361+ "string_decoder": "~1.1.1",
2362+ "util-deprecate": "~1.0.1"
2363+ }
2364+ },
2365+ "rimraf": {
2366+ "version": "2.6.2",
2367+ "bundled": true,
2368+ "dev": true,
2369+ "optional": true,
2370+ "requires": {
2371+ "glob": "^7.0.5"
2372+ }
2373+ },
2374+ "safe-buffer": {
2375+ "version": "5.1.1",
2376+ "bundled": true,
2377+ "dev": true
2378+ },
2379+ "safer-buffer": {
2380+ "version": "2.1.2",
2381+ "bundled": true,
2382+ "dev": true,
2383+ "optional": true
2384+ },
2385+ "sax": {
2386+ "version": "1.2.4",
2387+ "bundled": true,
2388+ "dev": true,
2389+ "optional": true
2390+ },
2391+ "semver": {
2392+ "version": "5.5.0",
2393+ "bundled": true,
2394+ "dev": true,
2395+ "optional": true
2396+ },
2397+ "set-blocking": {
2398+ "version": "2.0.0",
2399+ "bundled": true,
2400+ "dev": true,
2401+ "optional": true
2402+ },
2403+ "signal-exit": {
2404+ "version": "3.0.2",
2405+ "bundled": true,
2406+ "dev": true,
2407+ "optional": true
2408+ },
2409+ "string-width": {
2410+ "version": "1.0.2",
2411+ "bundled": true,
2412+ "dev": true,
2413+ "requires": {
2414+ "code-point-at": "^1.0.0",
2415+ "is-fullwidth-code-point": "^1.0.0",
2416+ "strip-ansi": "^3.0.0"
2417+ }
2418+ },
2419+ "string_decoder": {
2420+ "version": "1.1.1",
2421+ "bundled": true,
2422+ "dev": true,
2423+ "optional": true,
2424+ "requires": {
2425+ "safe-buffer": "~5.1.0"
2426+ }
2427+ },
2428+ "strip-ansi": {
2429+ "version": "3.0.1",
2430+ "bundled": true,
2431+ "dev": true,
2432+ "requires": {
2433+ "ansi-regex": "^2.0.0"
2434+ }
2435+ },
2436+ "strip-json-comments": {
2437+ "version": "2.0.1",
2438+ "bundled": true,
2439+ "dev": true,
2440+ "optional": true
2441+ },
2442+ "tar": {
2443+ "version": "4.4.1",
2444+ "bundled": true,
2445+ "dev": true,
2446+ "optional": true,
2447+ "requires": {
2448+ "chownr": "^1.0.1",
2449+ "fs-minipass": "^1.2.5",
2450+ "minipass": "^2.2.4",
2451+ "minizlib": "^1.1.0",
2452+ "mkdirp": "^0.5.0",
2453+ "safe-buffer": "^5.1.1",
2454+ "yallist": "^3.0.2"
2455+ }
2456+ },
2457+ "util-deprecate": {
2458+ "version": "1.0.2",
2459+ "bundled": true,
2460+ "dev": true,
2461+ "optional": true
2462+ },
2463+ "wide-align": {
2464+ "version": "1.1.2",
2465+ "bundled": true,
2466+ "dev": true,
2467+ "optional": true,
2468+ "requires": {
2469+ "string-width": "^1.0.2"
2470+ }
2471+ },
2472+ "wrappy": {
2473+ "version": "1.0.2",
2474+ "bundled": true,
2475+ "dev": true
2476+ },
2477+ "yallist": {
2478+ "version": "3.0.2",
2479+ "bundled": true,
2480+ "dev": true
2481+ }
2482+ }
2483+ },
2484+ "function-bind": {
2485+ "version": "1.1.1",
2486+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2487+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2488+ "dev": true
2489+ },
2490+ "get-caller-file": {
2491+ "version": "1.0.3",
2492+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
2493+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
2494+ "dev": true
2495+ },
2496+ "get-stream": {
2497+ "version": "3.0.0",
2498+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2499+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2500+ "dev": true
2501+ },
2502+ "get-value": {
2503+ "version": "2.0.6",
2504+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
2505+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
2506+ "dev": true
2507+ },
2508+ "glob": {
2509+ "version": "7.1.2",
2510+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2511+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2512+ "dev": true,
2513+ "requires": {
2514+ "fs.realpath": "^1.0.0",
2515+ "inflight": "^1.0.4",
2516+ "inherits": "2",
2517+ "minimatch": "^3.0.4",
2518+ "once": "^1.3.0",
2519+ "path-is-absolute": "^1.0.0"
2520+ }
2521+ },
2522+ "glob-parent": {
2523+ "version": "3.1.0",
2524+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
2525+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
2526+ "dev": true,
2527+ "requires": {
2528+ "is-glob": "^3.1.0",
2529+ "path-dirname": "^1.0.0"
2530+ },
2531+ "dependencies": {
2532+ "is-glob": {
2533+ "version": "3.1.0",
2534+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
2535+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
2536+ "dev": true,
2537+ "requires": {
2538+ "is-extglob": "^2.1.0"
2539+ }
2540+ }
2541+ }
2542+ },
2543+ "global-modules-path": {
2544+ "version": "2.3.0",
2545+ "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
2546+ "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
2547+ "dev": true
2548+ },
2549+ "globby": {
2550+ "version": "6.1.0",
2551+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
2552+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
2553+ "dev": true,
2554+ "requires": {
2555+ "array-union": "^1.0.1",
2556+ "glob": "^7.0.3",
2557+ "object-assign": "^4.0.1",
2558+ "pify": "^2.0.0",
2559+ "pinkie-promise": "^2.0.0"
2560+ },
2561+ "dependencies": {
2562+ "pify": {
2563+ "version": "2.3.0",
2564+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2565+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2566+ "dev": true
2567+ }
2568+ }
2569+ },
2570+ "graceful-fs": {
2571+ "version": "4.1.11",
2572+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2573+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2574+ "dev": true
2575+ },
2576+ "handle-thing": {
2577+ "version": "1.2.5",
2578+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
2579+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
2580+ "dev": true
2581+ },
2582+ "has": {
2583+ "version": "1.0.3",
2584+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2585+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2586+ "dev": true,
2587+ "requires": {
2588+ "function-bind": "^1.1.1"
2589+ }
2590+ },
2591+ "has-flag": {
2592+ "version": "3.0.0",
2593+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2594+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2595+ "dev": true
2596+ },
2597+ "has-value": {
2598+ "version": "1.0.0",
2599+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
2600+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
2601+ "dev": true,
2602+ "requires": {
2603+ "get-value": "^2.0.6",
2604+ "has-values": "^1.0.0",
2605+ "isobject": "^3.0.0"
2606+ }
2607+ },
2608+ "has-values": {
2609+ "version": "1.0.0",
2610+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
2611+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
2612+ "dev": true,
2613+ "requires": {
2614+ "is-number": "^3.0.0",
2615+ "kind-of": "^4.0.0"
2616+ },
2617+ "dependencies": {
2618+ "kind-of": {
2619+ "version": "4.0.0",
2620+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2621+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2622+ "dev": true,
2623+ "requires": {
2624+ "is-buffer": "^1.1.5"
2625+ }
2626+ }
2627+ }
2628+ },
2629+ "hash-base": {
2630+ "version": "3.0.4",
2631+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
2632+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
2633+ "dev": true,
2634+ "requires": {
2635+ "inherits": "^2.0.1",
2636+ "safe-buffer": "^5.0.1"
2637+ }
2638+ },
2639+ "hash.js": {
2640+ "version": "1.1.5",
2641+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
2642+ "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
2643+ "dev": true,
2644+ "requires": {
2645+ "inherits": "^2.0.3",
2646+ "minimalistic-assert": "^1.0.1"
2647+ }
2648+ },
2649+ "he": {
2650+ "version": "1.1.1",
2651+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2652+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2653+ "dev": true
2654+ },
2655+ "hmac-drbg": {
2656+ "version": "1.0.1",
2657+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2658+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2659+ "dev": true,
2660+ "requires": {
2661+ "hash.js": "^1.0.3",
2662+ "minimalistic-assert": "^1.0.0",
2663+ "minimalistic-crypto-utils": "^1.0.1"
2664+ }
2665+ },
2666+ "hpack.js": {
2667+ "version": "2.1.6",
2668+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
2669+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
2670+ "dev": true,
2671+ "requires": {
2672+ "inherits": "^2.0.1",
2673+ "obuf": "^1.0.0",
2674+ "readable-stream": "^2.0.1",
2675+ "wbuf": "^1.1.0"
2676+ }
2677+ },
2678+ "html-entities": {
2679+ "version": "1.2.1",
2680+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
2681+ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
2682+ "dev": true
2683+ },
2684+ "html-minifier": {
2685+ "version": "3.5.19",
2686+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz",
2687+ "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==",
2688+ "dev": true,
2689+ "requires": {
2690+ "camel-case": "3.0.x",
2691+ "clean-css": "4.1.x",
2692+ "commander": "2.16.x",
2693+ "he": "1.1.x",
2694+ "param-case": "2.1.x",
2695+ "relateurl": "0.2.x",
2696+ "uglify-js": "3.4.x"
2697+ },
2698+ "dependencies": {
2699+ "commander": {
2700+ "version": "2.16.0",
2701+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
2702+ "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
2703+ "dev": true
2704+ },
2705+ "source-map": {
2706+ "version": "0.6.1",
2707+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2708+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2709+ "dev": true
2710+ },
2711+ "uglify-js": {
2712+ "version": "3.4.7",
2713+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz",
2714+ "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==",
2715+ "dev": true,
2716+ "requires": {
2717+ "commander": "~2.16.0",
2718+ "source-map": "~0.6.1"
2719+ }
2720+ }
2721+ }
2722+ },
2723+ "html-webpack-plugin": {
2724+ "version": "3.2.0",
2725+ "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
2726+ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
2727+ "dev": true,
2728+ "requires": {
2729+ "html-minifier": "^3.2.3",
2730+ "loader-utils": "^0.2.16",
2731+ "lodash": "^4.17.3",
2732+ "pretty-error": "^2.0.2",
2733+ "tapable": "^1.0.0",
2734+ "toposort": "^1.0.0",
2735+ "util.promisify": "1.0.0"
2736+ },
2737+ "dependencies": {
2738+ "loader-utils": {
2739+ "version": "0.2.17",
2740+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
2741+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
2742+ "dev": true,
2743+ "requires": {
2744+ "big.js": "^3.1.3",
2745+ "emojis-list": "^2.0.0",
2746+ "json5": "^0.5.0",
2747+ "object-assign": "^4.0.1"
2748+ }
2749+ }
2750+ }
2751+ },
2752+ "htmlparser2": {
2753+ "version": "3.3.0",
2754+ "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
2755+ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
2756+ "dev": true,
2757+ "requires": {
2758+ "domelementtype": "1",
2759+ "domhandler": "2.1",
2760+ "domutils": "1.1",
2761+ "readable-stream": "1.0"
2762+ },
2763+ "dependencies": {
2764+ "domutils": {
2765+ "version": "1.1.6",
2766+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
2767+ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
2768+ "dev": true,
2769+ "requires": {
2770+ "domelementtype": "1"
2771+ }
2772+ },
2773+ "isarray": {
2774+ "version": "0.0.1",
2775+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2776+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
2777+ "dev": true
2778+ },
2779+ "readable-stream": {
2780+ "version": "1.0.34",
2781+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2782+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2783+ "dev": true,
2784+ "requires": {
2785+ "core-util-is": "~1.0.0",
2786+ "inherits": "~2.0.1",
2787+ "isarray": "0.0.1",
2788+ "string_decoder": "~0.10.x"
2789+ }
2790+ },
2791+ "string_decoder": {
2792+ "version": "0.10.31",
2793+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2794+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
2795+ "dev": true
2796+ }
2797+ }
2798+ },
2799+ "http-deceiver": {
2800+ "version": "1.2.7",
2801+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
2802+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
2803+ "dev": true
2804+ },
2805+ "http-errors": {
2806+ "version": "1.6.3",
2807+ "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
2808+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
2809+ "dev": true,
2810+ "requires": {
2811+ "depd": "~1.1.2",
2812+ "inherits": "2.0.3",
2813+ "setprototypeof": "1.1.0",
2814+ "statuses": ">= 1.4.0 < 2"
2815+ }
2816+ },
2817+ "http-parser-js": {
2818+ "version": "0.5.0",
2819+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
2820+ "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
2821+ "dev": true
2822+ },
2823+ "http-proxy": {
2824+ "version": "1.17.0",
2825+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
2826+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
2827+ "dev": true,
2828+ "requires": {
2829+ "eventemitter3": "^3.0.0",
2830+ "follow-redirects": "^1.0.0",
2831+ "requires-port": "^1.0.0"
2832+ }
2833+ },
2834+ "http-proxy-middleware": {
2835+ "version": "0.18.0",
2836+ "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
2837+ "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
2838+ "dev": true,
2839+ "requires": {
2840+ "http-proxy": "^1.16.2",
2841+ "is-glob": "^4.0.0",
2842+ "lodash": "^4.17.5",
2843+ "micromatch": "^3.1.9"
2844+ }
2845+ },
2846+ "https-browserify": {
2847+ "version": "1.0.0",
2848+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2849+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2850+ "dev": true
2851+ },
2852+ "iconv-lite": {
2853+ "version": "0.4.23",
2854+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
2855+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
2856+ "dev": true,
2857+ "requires": {
2858+ "safer-buffer": ">= 2.1.2 < 3"
2859+ }
2860+ },
2861+ "ieee754": {
2862+ "version": "1.1.12",
2863+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
2864+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
2865+ "dev": true
2866+ },
2867+ "iferr": {
2868+ "version": "0.1.5",
2869+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
2870+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
2871+ "dev": true
2872+ },
2873+ "import-local": {
2874+ "version": "2.0.0",
2875+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
2876+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
2877+ "dev": true,
2878+ "requires": {
2879+ "pkg-dir": "^3.0.0",
2880+ "resolve-cwd": "^2.0.0"
2881+ },
2882+ "dependencies": {
2883+ "find-up": {
2884+ "version": "3.0.0",
2885+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2886+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2887+ "dev": true,
2888+ "requires": {
2889+ "locate-path": "^3.0.0"
2890+ }
2891+ },
2892+ "locate-path": {
2893+ "version": "3.0.0",
2894+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2895+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2896+ "dev": true,
2897+ "requires": {
2898+ "p-locate": "^3.0.0",
2899+ "path-exists": "^3.0.0"
2900+ }
2901+ },
2902+ "p-limit": {
2903+ "version": "2.0.0",
2904+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
2905+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
2906+ "dev": true,
2907+ "requires": {
2908+ "p-try": "^2.0.0"
2909+ }
2910+ },
2911+ "p-locate": {
2912+ "version": "3.0.0",
2913+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2914+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2915+ "dev": true,
2916+ "requires": {
2917+ "p-limit": "^2.0.0"
2918+ }
2919+ },
2920+ "p-try": {
2921+ "version": "2.0.0",
2922+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
2923+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
2924+ "dev": true
2925+ },
2926+ "pkg-dir": {
2927+ "version": "3.0.0",
2928+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
2929+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
2930+ "dev": true,
2931+ "requires": {
2932+ "find-up": "^3.0.0"
2933+ }
2934+ }
2935+ }
2936+ },
2937+ "imurmurhash": {
2938+ "version": "0.1.4",
2939+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2940+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2941+ "dev": true
2942+ },
2943+ "indexof": {
2944+ "version": "0.0.1",
2945+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2946+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2947+ "dev": true
2948+ },
2949+ "inflight": {
2950+ "version": "1.0.6",
2951+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2952+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2953+ "dev": true,
2954+ "requires": {
2955+ "once": "^1.3.0",
2956+ "wrappy": "1"
2957+ }
2958+ },
2959+ "inherits": {
2960+ "version": "2.0.3",
2961+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2962+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2963+ "dev": true
2964+ },
2965+ "internal-ip": {
2966+ "version": "3.0.1",
2967+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
2968+ "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
2969+ "dev": true,
2970+ "requires": {
2971+ "default-gateway": "^2.6.0",
2972+ "ipaddr.js": "^1.5.2"
2973+ }
2974+ },
2975+ "interpret": {
2976+ "version": "1.1.0",
2977+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2978+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2979+ "dev": true
2980+ },
2981+ "invert-kv": {
2982+ "version": "2.0.0",
2983+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
2984+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
2985+ "dev": true
2986+ },
2987+ "ip": {
2988+ "version": "1.1.5",
2989+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
2990+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
2991+ "dev": true
2992+ },
2993+ "ip-regex": {
2994+ "version": "2.1.0",
2995+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
2996+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
2997+ "dev": true
2998+ },
2999+ "ipaddr.js": {
3000+ "version": "1.8.0",
3001+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
3002+ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
3003+ "dev": true
3004+ },
3005+ "is-accessor-descriptor": {
3006+ "version": "0.1.6",
3007+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
3008+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
3009+ "dev": true,
3010+ "requires": {
3011+ "kind-of": "^3.0.2"
3012+ },
3013+ "dependencies": {
3014+ "kind-of": {
3015+ "version": "3.2.2",
3016+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3017+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3018+ "dev": true,
3019+ "requires": {
3020+ "is-buffer": "^1.1.5"
3021+ }
3022+ }
3023+ }
3024+ },
3025+ "is-binary-path": {
3026+ "version": "1.0.1",
3027+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
3028+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
3029+ "dev": true,
3030+ "requires": {
3031+ "binary-extensions": "^1.0.0"
3032+ }
3033+ },
3034+ "is-buffer": {
3035+ "version": "1.1.6",
3036+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3037+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3038+ "dev": true
3039+ },
3040+ "is-callable": {
3041+ "version": "1.1.4",
3042+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
3043+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
3044+ "dev": true
3045+ },
3046+ "is-data-descriptor": {
3047+ "version": "0.1.4",
3048+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
3049+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
3050+ "dev": true,
3051+ "requires": {
3052+ "kind-of": "^3.0.2"
3053+ },
3054+ "dependencies": {
3055+ "kind-of": {
3056+ "version": "3.2.2",
3057+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3058+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3059+ "dev": true,
3060+ "requires": {
3061+ "is-buffer": "^1.1.5"
3062+ }
3063+ }
3064+ }
3065+ },
3066+ "is-date-object": {
3067+ "version": "1.0.1",
3068+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
3069+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
3070+ "dev": true
3071+ },
3072+ "is-descriptor": {
3073+ "version": "0.1.6",
3074+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
3075+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
3076+ "dev": true,
3077+ "requires": {
3078+ "is-accessor-descriptor": "^0.1.6",
3079+ "is-data-descriptor": "^0.1.4",
3080+ "kind-of": "^5.0.0"
3081+ },
3082+ "dependencies": {
3083+ "kind-of": {
3084+ "version": "5.1.0",
3085+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
3086+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
3087+ "dev": true
3088+ }
3089+ }
3090+ },
3091+ "is-extendable": {
3092+ "version": "0.1.1",
3093+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3094+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3095+ "dev": true
3096+ },
3097+ "is-extglob": {
3098+ "version": "2.1.1",
3099+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3100+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
3101+ "dev": true
3102+ },
3103+ "is-fullwidth-code-point": {
3104+ "version": "2.0.0",
3105+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3106+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3107+ "dev": true
3108+ },
3109+ "is-glob": {
3110+ "version": "4.0.0",
3111+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
3112+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
3113+ "dev": true,
3114+ "requires": {
3115+ "is-extglob": "^2.1.1"
3116+ }
3117+ },
3118+ "is-number": {
3119+ "version": "3.0.0",
3120+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3121+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3122+ "dev": true,
3123+ "requires": {
3124+ "kind-of": "^3.0.2"
3125+ },
3126+ "dependencies": {
3127+ "kind-of": {
3128+ "version": "3.2.2",
3129+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3130+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3131+ "dev": true,
3132+ "requires": {
3133+ "is-buffer": "^1.1.5"
3134+ }
3135+ }
3136+ }
3137+ },
3138+ "is-path-cwd": {
3139+ "version": "1.0.0",
3140+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
3141+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
3142+ "dev": true
3143+ },
3144+ "is-path-in-cwd": {
3145+ "version": "1.0.1",
3146+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
3147+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
3148+ "dev": true,
3149+ "requires": {
3150+ "is-path-inside": "^1.0.0"
3151+ }
3152+ },
3153+ "is-path-inside": {
3154+ "version": "1.0.1",
3155+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
3156+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
3157+ "dev": true,
3158+ "requires": {
3159+ "path-is-inside": "^1.0.1"
3160+ }
3161+ },
3162+ "is-plain-object": {
3163+ "version": "2.0.4",
3164+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3165+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3166+ "dev": true,
3167+ "requires": {
3168+ "isobject": "^3.0.1"
3169+ }
3170+ },
3171+ "is-regex": {
3172+ "version": "1.0.4",
3173+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
3174+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
3175+ "dev": true,
3176+ "requires": {
3177+ "has": "^1.0.1"
3178+ }
3179+ },
3180+ "is-stream": {
3181+ "version": "1.1.0",
3182+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
3183+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
3184+ "dev": true
3185+ },
3186+ "is-symbol": {
3187+ "version": "1.0.1",
3188+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
3189+ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
3190+ "dev": true
3191+ },
3192+ "is-windows": {
3193+ "version": "1.0.2",
3194+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
3195+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
3196+ "dev": true
3197+ },
3198+ "is-wsl": {
3199+ "version": "1.1.0",
3200+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
3201+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
3202+ "dev": true
3203+ },
3204+ "isarray": {
3205+ "version": "1.0.0",
3206+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3207+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3208+ "dev": true
3209+ },
3210+ "isexe": {
3211+ "version": "2.0.0",
3212+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3213+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
3214+ "dev": true
3215+ },
3216+ "isobject": {
3217+ "version": "3.0.1",
3218+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3219+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
3220+ "dev": true
3221+ },
3222+ "json-parse-better-errors": {
3223+ "version": "1.0.2",
3224+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
3225+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
3226+ "dev": true
3227+ },
3228+ "json-schema-traverse": {
3229+ "version": "0.4.1",
3230+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
3231+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
3232+ "dev": true
3233+ },
3234+ "json3": {
3235+ "version": "3.3.2",
3236+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
3237+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
3238+ "dev": true
3239+ },
3240+ "json5": {
3241+ "version": "0.5.1",
3242+ "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
3243+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
3244+ "dev": true
3245+ },
3246+ "killable": {
3247+ "version": "1.0.1",
3248+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
3249+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
3250+ "dev": true
3251+ },
3252+ "kind-of": {
3253+ "version": "6.0.2",
3254+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
3255+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
3256+ "dev": true
3257+ },
3258+ "lcid": {
3259+ "version": "2.0.0",
3260+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
3261+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
3262+ "dev": true,
3263+ "requires": {
3264+ "invert-kv": "^2.0.0"
3265+ }
3266+ },
3267+ "loader-runner": {
3268+ "version": "2.3.1",
3269+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
3270+ "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
3271+ "dev": true
3272+ },
3273+ "loader-utils": {
3274+ "version": "1.1.0",
3275+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
3276+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
3277+ "dev": true,
3278+ "requires": {
3279+ "big.js": "^3.1.3",
3280+ "emojis-list": "^2.0.0",
3281+ "json5": "^0.5.0"
3282+ }
3283+ },
3284+ "locate-path": {
3285+ "version": "2.0.0",
3286+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
3287+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
3288+ "dev": true,
3289+ "requires": {
3290+ "p-locate": "^2.0.0",
3291+ "path-exists": "^3.0.0"
3292+ }
3293+ },
3294+ "lodash": {
3295+ "version": "4.17.10",
3296+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
3297+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
3298+ "dev": true
3299+ },
3300+ "lodash.debounce": {
3301+ "version": "4.0.8",
3302+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3303+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
3304+ "dev": true
3305+ },
3306+ "loglevel": {
3307+ "version": "1.6.1",
3308+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
3309+ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
3310+ "dev": true
3311+ },
3312+ "lower-case": {
3313+ "version": "1.1.4",
3314+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
3315+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
3316+ "dev": true
3317+ },
3318+ "lru-cache": {
3319+ "version": "4.1.3",
3320+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
3321+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
3322+ "dev": true,
3323+ "requires": {
3324+ "pseudomap": "^1.0.2",
3325+ "yallist": "^2.1.2"
3326+ }
3327+ },
3328+ "make-dir": {
3329+ "version": "1.3.0",
3330+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
3331+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
3332+ "dev": true,
3333+ "requires": {
3334+ "pify": "^3.0.0"
3335+ }
3336+ },
3337+ "map-age-cleaner": {
3338+ "version": "0.1.2",
3339+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
3340+ "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
3341+ "dev": true,
3342+ "requires": {
3343+ "p-defer": "^1.0.0"
3344+ }
3345+ },
3346+ "map-cache": {
3347+ "version": "0.2.2",
3348+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
3349+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
3350+ "dev": true
3351+ },
3352+ "map-visit": {
3353+ "version": "1.0.0",
3354+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
3355+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
3356+ "dev": true,
3357+ "requires": {
3358+ "object-visit": "^1.0.0"
3359+ }
3360+ },
3361+ "md5.js": {
3362+ "version": "1.3.5",
3363+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
3364+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
3365+ "dev": true,
3366+ "requires": {
3367+ "hash-base": "^3.0.0",
3368+ "inherits": "^2.0.1",
3369+ "safe-buffer": "^5.1.2"
3370+ }
3371+ },
3372+ "media-typer": {
3373+ "version": "0.3.0",
3374+ "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
3375+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
3376+ "dev": true
3377+ },
3378+ "mem": {
3379+ "version": "4.0.0",
3380+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
3381+ "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
3382+ "dev": true,
3383+ "requires": {
3384+ "map-age-cleaner": "^0.1.1",
3385+ "mimic-fn": "^1.0.0",
3386+ "p-is-promise": "^1.1.0"
3387+ }
3388+ },
3389+ "memory-fs": {
3390+ "version": "0.4.1",
3391+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
3392+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
3393+ "dev": true,
3394+ "requires": {
3395+ "errno": "^0.1.3",
3396+ "readable-stream": "^2.0.1"
3397+ },
3398+ "dependencies": {
3399+ "isarray": {
3400+ "version": "1.0.0",
3401+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3402+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
3403+ "dev": true
3404+ },
3405+ "readable-stream": {
3406+ "version": "2.3.6",
3407+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
3408+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
3409+ "dev": true,
3410+ "requires": {
3411+ "core-util-is": "~1.0.0",
3412+ "inherits": "~2.0.3",
3413+ "isarray": "~1.0.0",
3414+ "process-nextick-args": "~2.0.0",
3415+ "safe-buffer": "~5.1.1",
3416+ "string_decoder": "~1.1.1",
3417+ "util-deprecate": "~1.0.1"
3418+ }
3419+ },
3420+ "string_decoder": {
3421+ "version": "1.1.1",
3422+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3423+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3424+ "dev": true,
3425+ "requires": {
3426+ "safe-buffer": "~5.1.0"
3427+ }
3428+ }
3429+ }
3430+ },
3431+ "merge-descriptors": {
3432+ "version": "1.0.1",
3433+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
3434+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
3435+ "dev": true
3436+ },
3437+ "methods": {
3438+ "version": "1.1.2",
3439+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
3440+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
3441+ "dev": true
3442+ },
3443+ "micromatch": {
3444+ "version": "3.1.10",
3445+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
3446+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
3447+ "dev": true,
3448+ "requires": {
3449+ "arr-diff": "^4.0.0",
3450+ "array-unique": "^0.3.2",
3451+ "braces": "^2.3.1",
3452+ "define-property": "^2.0.2",
3453+ "extend-shallow": "^3.0.2",
3454+ "extglob": "^2.0.4",
3455+ "fragment-cache": "^0.2.1",
3456+ "kind-of": "^6.0.2",
3457+ "nanomatch": "^1.2.9",
3458+ "object.pick": "^1.3.0",
3459+ "regex-not": "^1.0.0",
3460+ "snapdragon": "^0.8.1",
3461+ "to-regex": "^3.0.2"
3462+ }
3463+ },
3464+ "miller-rabin": {
3465+ "version": "4.0.1",
3466+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
3467+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
3468+ "dev": true,
3469+ "requires": {
3470+ "bn.js": "^4.0.0",
3471+ "brorand": "^1.0.1"
3472+ }
3473+ },
3474+ "mime": {
3475+ "version": "1.4.1",
3476+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
3477+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
3478+ "dev": true
3479+ },
3480+ "mime-db": {
3481+ "version": "1.37.0",
3482+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
3483+ "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
3484+ "dev": true
3485+ },
3486+ "mime-types": {
3487+ "version": "2.1.21",
3488+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
3489+ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
3490+ "dev": true,
3491+ "requires": {
3492+ "mime-db": "~1.37.0"
3493+ }
3494+ },
3495+ "mimic-fn": {
3496+ "version": "1.2.0",
3497+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
3498+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
3499+ "dev": true
3500+ },
3501+ "minimalistic-assert": {
3502+ "version": "1.0.1",
3503+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
3504+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
3505+ "dev": true
3506+ },
3507+ "minimalistic-crypto-utils": {
3508+ "version": "1.0.1",
3509+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
3510+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
3511+ "dev": true
3512+ },
3513+ "minimatch": {
3514+ "version": "3.0.4",
3515+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3516+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3517+ "dev": true,
3518+ "requires": {
3519+ "brace-expansion": "^1.1.7"
3520+ }
3521+ },
3522+ "minimist": {
3523+ "version": "0.0.8",
3524+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3525+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3526+ "dev": true
3527+ },
3528+ "mississippi": {
3529+ "version": "2.0.0",
3530+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
3531+ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
3532+ "dev": true,
3533+ "requires": {
3534+ "concat-stream": "^1.5.0",
3535+ "duplexify": "^3.4.2",
3536+ "end-of-stream": "^1.1.0",
3537+ "flush-write-stream": "^1.0.0",
3538+ "from2": "^2.1.0",
3539+ "parallel-transform": "^1.1.0",
3540+ "pump": "^2.0.1",
3541+ "pumpify": "^1.3.3",
3542+ "stream-each": "^1.1.0",
3543+ "through2": "^2.0.0"
3544+ }
3545+ },
3546+ "mixin-deep": {
3547+ "version": "1.3.1",
3548+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
3549+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
3550+ "dev": true,
3551+ "requires": {
3552+ "for-in": "^1.0.2",
3553+ "is-extendable": "^1.0.1"
3554+ },
3555+ "dependencies": {
3556+ "is-extendable": {
3557+ "version": "1.0.1",
3558+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
3559+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
3560+ "dev": true,
3561+ "requires": {
3562+ "is-plain-object": "^2.0.4"
3563+ }
3564+ }
3565+ }
3566+ },
3567+ "mkdirp": {
3568+ "version": "0.5.1",
3569+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3570+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3571+ "dev": true,
3572+ "requires": {
3573+ "minimist": "0.0.8"
3574+ }
3575+ },
3576+ "move-concurrently": {
3577+ "version": "1.0.1",
3578+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
3579+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
3580+ "dev": true,
3581+ "requires": {
3582+ "aproba": "^1.1.1",
3583+ "copy-concurrently": "^1.0.0",
3584+ "fs-write-stream-atomic": "^1.0.8",
3585+ "mkdirp": "^0.5.1",
3586+ "rimraf": "^2.5.4",
3587+ "run-queue": "^1.0.3"
3588+ }
3589+ },
3590+ "ms": {
3591+ "version": "2.0.0",
3592+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3593+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3594+ "dev": true
3595+ },
3596+ "multicast-dns": {
3597+ "version": "6.2.3",
3598+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
3599+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
3600+ "dev": true,
3601+ "requires": {
3602+ "dns-packet": "^1.3.1",
3603+ "thunky": "^1.0.2"
3604+ }
3605+ },
3606+ "multicast-dns-service-types": {
3607+ "version": "1.1.0",
3608+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
3609+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
3610+ "dev": true
3611+ },
3612+ "nan": {
3613+ "version": "2.11.1",
3614+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
3615+ "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
3616+ "dev": true,
3617+ "optional": true
3618+ },
3619+ "nanomatch": {
3620+ "version": "1.2.13",
3621+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
3622+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
3623+ "dev": true,
3624+ "requires": {
3625+ "arr-diff": "^4.0.0",
3626+ "array-unique": "^0.3.2",
3627+ "define-property": "^2.0.2",
3628+ "extend-shallow": "^3.0.2",
3629+ "fragment-cache": "^0.2.1",
3630+ "is-windows": "^1.0.2",
3631+ "kind-of": "^6.0.2",
3632+ "object.pick": "^1.3.0",
3633+ "regex-not": "^1.0.0",
3634+ "snapdragon": "^0.8.1",
3635+ "to-regex": "^3.0.1"
3636+ }
3637+ },
3638+ "negotiator": {
3639+ "version": "0.6.1",
3640+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
3641+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
3642+ "dev": true
3643+ },
3644+ "neo-async": {
3645+ "version": "2.5.1",
3646+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
3647+ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
3648+ "dev": true
3649+ },
3650+ "nice-try": {
3651+ "version": "1.0.4",
3652+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
3653+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
3654+ "dev": true
3655+ },
3656+ "no-case": {
3657+ "version": "2.3.2",
3658+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
3659+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
3660+ "dev": true,
3661+ "requires": {
3662+ "lower-case": "^1.1.1"
3663+ }
3664+ },
3665+ "node-forge": {
3666+ "version": "0.7.5",
3667+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
3668+ "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
3669+ "dev": true
3670+ },
3671+ "node-libs-browser": {
3672+ "version": "2.1.0",
3673+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
3674+ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
3675+ "dev": true,
3676+ "requires": {
3677+ "assert": "^1.1.1",
3678+ "browserify-zlib": "^0.2.0",
3679+ "buffer": "^4.3.0",
3680+ "console-browserify": "^1.1.0",
3681+ "constants-browserify": "^1.0.0",
3682+ "crypto-browserify": "^3.11.0",
3683+ "domain-browser": "^1.1.1",
3684+ "events": "^1.0.0",
3685+ "https-browserify": "^1.0.0",
3686+ "os-browserify": "^0.3.0",
3687+ "path-browserify": "0.0.0",
3688+ "process": "^0.11.10",
3689+ "punycode": "^1.2.4",
3690+ "querystring-es3": "^0.2.0",
3691+ "readable-stream": "^2.3.3",
3692+ "stream-browserify": "^2.0.1",
3693+ "stream-http": "^2.7.2",
3694+ "string_decoder": "^1.0.0",
3695+ "timers-browserify": "^2.0.4",
3696+ "tty-browserify": "0.0.0",
3697+ "url": "^0.11.0",
3698+ "util": "^0.10.3",
3699+ "vm-browserify": "0.0.4"
3700+ },
3701+ "dependencies": {
3702+ "punycode": {
3703+ "version": "1.4.1",
3704+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
3705+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
3706+ "dev": true
3707+ }
3708+ }
3709+ },
3710+ "normalize-path": {
3711+ "version": "2.1.1",
3712+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3713+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3714+ "dev": true,
3715+ "requires": {
3716+ "remove-trailing-separator": "^1.0.1"
3717+ }
3718+ },
3719+ "npm-run-path": {
3720+ "version": "2.0.2",
3721+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3722+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3723+ "dev": true,
3724+ "requires": {
3725+ "path-key": "^2.0.0"
3726+ }
3727+ },
3728+ "nth-check": {
3729+ "version": "1.0.1",
3730+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
3731+ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
3732+ "dev": true,
3733+ "requires": {
3734+ "boolbase": "~1.0.0"
3735+ }
3736+ },
3737+ "number-is-nan": {
3738+ "version": "1.0.1",
3739+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3740+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3741+ "dev": true
3742+ },
3743+ "object-assign": {
3744+ "version": "4.1.1",
3745+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3746+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3747+ "dev": true
3748+ },
3749+ "object-copy": {
3750+ "version": "0.1.0",
3751+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
3752+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
3753+ "dev": true,
3754+ "requires": {
3755+ "copy-descriptor": "^0.1.0",
3756+ "define-property": "^0.2.5",
3757+ "kind-of": "^3.0.3"
3758+ },
3759+ "dependencies": {
3760+ "define-property": {
3761+ "version": "0.2.5",
3762+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3763+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3764+ "dev": true,
3765+ "requires": {
3766+ "is-descriptor": "^0.1.0"
3767+ }
3768+ },
3769+ "kind-of": {
3770+ "version": "3.2.2",
3771+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3772+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3773+ "dev": true,
3774+ "requires": {
3775+ "is-buffer": "^1.1.5"
3776+ }
3777+ }
3778+ }
3779+ },
3780+ "object-keys": {
3781+ "version": "1.0.12",
3782+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
3783+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
3784+ "dev": true
3785+ },
3786+ "object-visit": {
3787+ "version": "1.0.1",
3788+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
3789+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
3790+ "dev": true,
3791+ "requires": {
3792+ "isobject": "^3.0.0"
3793+ }
3794+ },
3795+ "object.getownpropertydescriptors": {
3796+ "version": "2.0.3",
3797+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
3798+ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
3799+ "dev": true,
3800+ "requires": {
3801+ "define-properties": "^1.1.2",
3802+ "es-abstract": "^1.5.1"
3803+ }
3804+ },
3805+ "object.pick": {
3806+ "version": "1.3.0",
3807+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
3808+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
3809+ "dev": true,
3810+ "requires": {
3811+ "isobject": "^3.0.1"
3812+ }
3813+ },
3814+ "obuf": {
3815+ "version": "1.1.2",
3816+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
3817+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
3818+ "dev": true
3819+ },
3820+ "on-finished": {
3821+ "version": "2.3.0",
3822+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
3823+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
3824+ "dev": true,
3825+ "requires": {
3826+ "ee-first": "1.1.1"
3827+ }
3828+ },
3829+ "on-headers": {
3830+ "version": "1.0.1",
3831+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
3832+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
3833+ "dev": true
3834+ },
3835+ "once": {
3836+ "version": "1.4.0",
3837+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3838+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3839+ "dev": true,
3840+ "requires": {
3841+ "wrappy": "1"
3842+ }
3843+ },
3844+ "opn": {
3845+ "version": "5.4.0",
3846+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
3847+ "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
3848+ "dev": true,
3849+ "requires": {
3850+ "is-wsl": "^1.1.0"
3851+ }
3852+ },
3853+ "original": {
3854+ "version": "1.0.2",
3855+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
3856+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
3857+ "dev": true,
3858+ "requires": {
3859+ "url-parse": "^1.4.3"
3860+ }
3861+ },
3862+ "os-browserify": {
3863+ "version": "0.3.0",
3864+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
3865+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
3866+ "dev": true
3867+ },
3868+ "os-locale": {
3869+ "version": "3.0.1",
3870+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
3871+ "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
3872+ "dev": true,
3873+ "requires": {
3874+ "execa": "^0.10.0",
3875+ "lcid": "^2.0.0",
3876+ "mem": "^4.0.0"
3877+ }
3878+ },
3879+ "p-defer": {
3880+ "version": "1.0.0",
3881+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
3882+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
3883+ "dev": true
3884+ },
3885+ "p-finally": {
3886+ "version": "1.0.0",
3887+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3888+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3889+ "dev": true
3890+ },
3891+ "p-is-promise": {
3892+ "version": "1.1.0",
3893+ "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
3894+ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
3895+ "dev": true
3896+ },
3897+ "p-limit": {
3898+ "version": "1.3.0",
3899+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
3900+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
3901+ "dev": true,
3902+ "requires": {
3903+ "p-try": "^1.0.0"
3904+ }
3905+ },
3906+ "p-locate": {
3907+ "version": "2.0.0",
3908+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3909+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3910+ "dev": true,
3911+ "requires": {
3912+ "p-limit": "^1.1.0"
3913+ }
3914+ },
3915+ "p-map": {
3916+ "version": "1.2.0",
3917+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
3918+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
3919+ "dev": true
3920+ },
3921+ "p-try": {
3922+ "version": "1.0.0",
3923+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
3924+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
3925+ "dev": true
3926+ },
3927+ "pako": {
3928+ "version": "1.0.6",
3929+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
3930+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
3931+ "dev": true
3932+ },
3933+ "parallel-transform": {
3934+ "version": "1.1.0",
3935+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
3936+ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
3937+ "dev": true,
3938+ "requires": {
3939+ "cyclist": "~0.2.2",
3940+ "inherits": "^2.0.3",
3941+ "readable-stream": "^2.1.5"
3942+ }
3943+ },
3944+ "param-case": {
3945+ "version": "2.1.1",
3946+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
3947+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
3948+ "dev": true,
3949+ "requires": {
3950+ "no-case": "^2.2.0"
3951+ }
3952+ },
3953+ "parse-asn1": {
3954+ "version": "5.1.1",
3955+ "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
3956+ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
3957+ "dev": true,
3958+ "requires": {
3959+ "asn1.js": "^4.0.0",
3960+ "browserify-aes": "^1.0.0",
3961+ "create-hash": "^1.1.0",
3962+ "evp_bytestokey": "^1.0.0",
3963+ "pbkdf2": "^3.0.3"
3964+ }
3965+ },
3966+ "parseurl": {
3967+ "version": "1.3.2",
3968+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
3969+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
3970+ "dev": true
3971+ },
3972+ "pascalcase": {
3973+ "version": "0.1.1",
3974+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
3975+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
3976+ "dev": true
3977+ },
3978+ "path-browserify": {
3979+ "version": "0.0.0",
3980+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
3981+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
3982+ "dev": true
3983+ },
3984+ "path-dirname": {
3985+ "version": "1.0.2",
3986+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
3987+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
3988+ "dev": true
3989+ },
3990+ "path-exists": {
3991+ "version": "3.0.0",
3992+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
3993+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
3994+ "dev": true
3995+ },
3996+ "path-is-absolute": {
3997+ "version": "1.0.1",
3998+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3999+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4000+ "dev": true
4001+ },
4002+ "path-is-inside": {
4003+ "version": "1.0.2",
4004+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
4005+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
4006+ "dev": true
4007+ },
4008+ "path-key": {
4009+ "version": "2.0.1",
4010+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
4011+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
4012+ "dev": true
4013+ },
4014+ "path-to-regexp": {
4015+ "version": "0.1.7",
4016+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
4017+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
4018+ "dev": true
4019+ },
4020+ "pbkdf2": {
4021+ "version": "3.0.17",
4022+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
4023+ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
4024+ "dev": true,
4025+ "requires": {
4026+ "create-hash": "^1.1.2",
4027+ "create-hmac": "^1.1.4",
4028+ "ripemd160": "^2.0.1",
4029+ "safe-buffer": "^5.0.1",
4030+ "sha.js": "^2.4.8"
4031+ }
4032+ },
4033+ "pify": {
4034+ "version": "3.0.0",
4035+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4036+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4037+ "dev": true
4038+ },
4039+ "pinkie": {
4040+ "version": "2.0.4",
4041+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
4042+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
4043+ "dev": true
4044+ },
4045+ "pinkie-promise": {
4046+ "version": "2.0.1",
4047+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
4048+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
4049+ "dev": true,
4050+ "requires": {
4051+ "pinkie": "^2.0.0"
4052+ }
4053+ },
4054+ "pkg-dir": {
4055+ "version": "2.0.0",
4056+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
4057+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
4058+ "dev": true,
4059+ "requires": {
4060+ "find-up": "^2.1.0"
4061+ }
4062+ },
4063+ "portfinder": {
4064+ "version": "1.0.19",
4065+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz",
4066+ "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==",
4067+ "dev": true,
4068+ "requires": {
4069+ "async": "^1.5.2",
4070+ "debug": "^2.2.0",
4071+ "mkdirp": "0.5.x"
4072+ },
4073+ "dependencies": {
4074+ "debug": {
4075+ "version": "2.6.9",
4076+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4077+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4078+ "dev": true,
4079+ "requires": {
4080+ "ms": "2.0.0"
4081+ }
4082+ }
4083+ }
4084+ },
4085+ "posix-character-classes": {
4086+ "version": "0.1.1",
4087+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
4088+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
4089+ "dev": true
4090+ },
4091+ "pretty-error": {
4092+ "version": "2.1.1",
4093+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
4094+ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
4095+ "dev": true,
4096+ "requires": {
4097+ "renderkid": "^2.0.1",
4098+ "utila": "~0.4"
4099+ }
4100+ },
4101+ "process": {
4102+ "version": "0.11.10",
4103+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
4104+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
4105+ "dev": true
4106+ },
4107+ "process-nextick-args": {
4108+ "version": "2.0.0",
4109+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
4110+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
4111+ "dev": true
4112+ },
4113+ "promise-inflight": {
4114+ "version": "1.0.1",
4115+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
4116+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
4117+ "dev": true
4118+ },
4119+ "proxy-addr": {
4120+ "version": "2.0.4",
4121+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
4122+ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
4123+ "dev": true,
4124+ "requires": {
4125+ "forwarded": "~0.1.2",
4126+ "ipaddr.js": "1.8.0"
4127+ }
4128+ },
4129+ "prr": {
4130+ "version": "1.0.1",
4131+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
4132+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
4133+ "dev": true
4134+ },
4135+ "pseudomap": {
4136+ "version": "1.0.2",
4137+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
4138+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
4139+ "dev": true
4140+ },
4141+ "public-encrypt": {
4142+ "version": "4.0.3",
4143+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
4144+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
4145+ "dev": true,
4146+ "requires": {
4147+ "bn.js": "^4.1.0",
4148+ "browserify-rsa": "^4.0.0",
4149+ "create-hash": "^1.1.0",
4150+ "parse-asn1": "^5.0.0",
4151+ "randombytes": "^2.0.1",
4152+ "safe-buffer": "^5.1.2"
4153+ }
4154+ },
4155+ "pump": {
4156+ "version": "2.0.1",
4157+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
4158+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
4159+ "dev": true,
4160+ "requires": {
4161+ "end-of-stream": "^1.1.0",
4162+ "once": "^1.3.1"
4163+ }
4164+ },
4165+ "pumpify": {
4166+ "version": "1.5.1",
4167+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
4168+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
4169+ "dev": true,
4170+ "requires": {
4171+ "duplexify": "^3.6.0",
4172+ "inherits": "^2.0.3",
4173+ "pump": "^2.0.0"
4174+ }
4175+ },
4176+ "punycode": {
4177+ "version": "2.1.1",
4178+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
4179+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
4180+ "dev": true
4181+ },
4182+ "qs": {
4183+ "version": "6.5.2",
4184+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
4185+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
4186+ "dev": true
4187+ },
4188+ "querystring": {
4189+ "version": "0.2.0",
4190+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
4191+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
4192+ "dev": true
4193+ },
4194+ "querystring-es3": {
4195+ "version": "0.2.1",
4196+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
4197+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
4198+ "dev": true
4199+ },
4200+ "querystringify": {
4201+ "version": "2.1.0",
4202+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
4203+ "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
4204+ "dev": true
4205+ },
4206+ "randombytes": {
4207+ "version": "2.0.6",
4208+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
4209+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
4210+ "dev": true,
4211+ "requires": {
4212+ "safe-buffer": "^5.1.0"
4213+ }
4214+ },
4215+ "randomfill": {
4216+ "version": "1.0.4",
4217+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
4218+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
4219+ "dev": true,
4220+ "requires": {
4221+ "randombytes": "^2.0.5",
4222+ "safe-buffer": "^5.1.0"
4223+ }
4224+ },
4225+ "range-parser": {
4226+ "version": "1.2.0",
4227+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
4228+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
4229+ "dev": true
4230+ },
4231+ "raw-body": {
4232+ "version": "2.3.3",
4233+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
4234+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
4235+ "dev": true,
4236+ "requires": {
4237+ "bytes": "3.0.0",
4238+ "http-errors": "1.6.3",
4239+ "iconv-lite": "0.4.23",
4240+ "unpipe": "1.0.0"
4241+ }
4242+ },
4243+ "readable-stream": {
4244+ "version": "2.3.6",
4245+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4246+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4247+ "dev": true,
4248+ "requires": {
4249+ "core-util-is": "~1.0.0",
4250+ "inherits": "~2.0.3",
4251+ "isarray": "~1.0.0",
4252+ "process-nextick-args": "~2.0.0",
4253+ "safe-buffer": "~5.1.1",
4254+ "string_decoder": "~1.1.1",
4255+ "util-deprecate": "~1.0.1"
4256+ }
4257+ },
4258+ "readdirp": {
4259+ "version": "2.1.0",
4260+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
4261+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
4262+ "dev": true,
4263+ "requires": {
4264+ "graceful-fs": "^4.1.2",
4265+ "minimatch": "^3.0.2",
4266+ "readable-stream": "^2.0.2",
4267+ "set-immediate-shim": "^1.0.1"
4268+ },
4269+ "dependencies": {
4270+ "isarray": {
4271+ "version": "1.0.0",
4272+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4273+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
4274+ "dev": true
4275+ },
4276+ "readable-stream": {
4277+ "version": "2.3.6",
4278+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
4279+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
4280+ "dev": true,
4281+ "requires": {
4282+ "core-util-is": "~1.0.0",
4283+ "inherits": "~2.0.3",
4284+ "isarray": "~1.0.0",
4285+ "process-nextick-args": "~2.0.0",
4286+ "safe-buffer": "~5.1.1",
4287+ "string_decoder": "~1.1.1",
4288+ "util-deprecate": "~1.0.1"
4289+ }
4290+ },
4291+ "string_decoder": {
4292+ "version": "1.1.1",
4293+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4294+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4295+ "dev": true,
4296+ "requires": {
4297+ "safe-buffer": "~5.1.0"
4298+ }
4299+ }
4300+ }
4301+ },
4302+ "regex-not": {
4303+ "version": "1.0.2",
4304+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
4305+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
4306+ "dev": true,
4307+ "requires": {
4308+ "extend-shallow": "^3.0.2",
4309+ "safe-regex": "^1.1.0"
4310+ }
4311+ },
4312+ "relateurl": {
4313+ "version": "0.2.7",
4314+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
4315+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
4316+ "dev": true
4317+ },
4318+ "remove-trailing-separator": {
4319+ "version": "1.1.0",
4320+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
4321+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
4322+ "dev": true
4323+ },
4324+ "renderkid": {
4325+ "version": "2.0.1",
4326+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
4327+ "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
4328+ "dev": true,
4329+ "requires": {
4330+ "css-select": "^1.1.0",
4331+ "dom-converter": "~0.1",
4332+ "htmlparser2": "~3.3.0",
4333+ "strip-ansi": "^3.0.0",
4334+ "utila": "~0.3"
4335+ },
4336+ "dependencies": {
4337+ "utila": {
4338+ "version": "0.3.3",
4339+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
4340+ "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
4341+ "dev": true
4342+ }
4343+ }
4344+ },
4345+ "repeat-element": {
4346+ "version": "1.1.2",
4347+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
4348+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
4349+ "dev": true
4350+ },
4351+ "repeat-string": {
4352+ "version": "1.6.1",
4353+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
4354+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
4355+ "dev": true
4356+ },
4357+ "require-directory": {
4358+ "version": "2.1.1",
4359+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4360+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
4361+ "dev": true
4362+ },
4363+ "require-main-filename": {
4364+ "version": "1.0.1",
4365+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
4366+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
4367+ "dev": true
4368+ },
4369+ "requires-port": {
4370+ "version": "1.0.0",
4371+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
4372+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
4373+ "dev": true
4374+ },
4375+ "resolve-cwd": {
4376+ "version": "2.0.0",
4377+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
4378+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
4379+ "dev": true,
4380+ "requires": {
4381+ "resolve-from": "^3.0.0"
4382+ }
4383+ },
4384+ "resolve-from": {
4385+ "version": "3.0.0",
4386+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
4387+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
4388+ "dev": true
4389+ },
4390+ "resolve-url": {
4391+ "version": "0.2.1",
4392+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
4393+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
4394+ "dev": true
4395+ },
4396+ "ret": {
4397+ "version": "0.1.15",
4398+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
4399+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
4400+ "dev": true
4401+ },
4402+ "rimraf": {
4403+ "version": "2.6.2",
4404+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
4405+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
4406+ "dev": true,
4407+ "requires": {
4408+ "glob": "^7.0.5"
4409+ }
4410+ },
4411+ "ripemd160": {
4412+ "version": "2.0.2",
4413+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
4414+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
4415+ "dev": true,
4416+ "requires": {
4417+ "hash-base": "^3.0.0",
4418+ "inherits": "^2.0.1"
4419+ }
4420+ },
4421+ "run-queue": {
4422+ "version": "1.0.3",
4423+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
4424+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
4425+ "dev": true,
4426+ "requires": {
4427+ "aproba": "^1.1.1"
4428+ }
4429+ },
4430+ "safe-buffer": {
4431+ "version": "5.1.2",
4432+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
4433+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
4434+ "dev": true
4435+ },
4436+ "safe-regex": {
4437+ "version": "1.1.0",
4438+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
4439+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
4440+ "dev": true,
4441+ "requires": {
4442+ "ret": "~0.1.10"
4443+ }
4444+ },
4445+ "safer-buffer": {
4446+ "version": "2.1.2",
4447+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4448+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
4449+ "dev": true
4450+ },
4451+ "schema-utils": {
4452+ "version": "0.4.7",
4453+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
4454+ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
4455+ "dev": true,
4456+ "requires": {
4457+ "ajv": "^6.1.0",
4458+ "ajv-keywords": "^3.1.0"
4459+ }
4460+ },
4461+ "select-hose": {
4462+ "version": "2.0.0",
4463+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
4464+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
4465+ "dev": true
4466+ },
4467+ "selfsigned": {
4468+ "version": "1.10.4",
4469+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
4470+ "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
4471+ "dev": true,
4472+ "requires": {
4473+ "node-forge": "0.7.5"
4474+ }
4475+ },
4476+ "semver": {
4477+ "version": "5.5.0",
4478+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
4479+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
4480+ "dev": true
4481+ },
4482+ "send": {
4483+ "version": "0.16.2",
4484+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
4485+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
4486+ "dev": true,
4487+ "requires": {
4488+ "debug": "2.6.9",
4489+ "depd": "~1.1.2",
4490+ "destroy": "~1.0.4",
4491+ "encodeurl": "~1.0.2",
4492+ "escape-html": "~1.0.3",
4493+ "etag": "~1.8.1",
4494+ "fresh": "0.5.2",
4495+ "http-errors": "~1.6.2",
4496+ "mime": "1.4.1",
4497+ "ms": "2.0.0",
4498+ "on-finished": "~2.3.0",
4499+ "range-parser": "~1.2.0",
4500+ "statuses": "~1.4.0"
4501+ },
4502+ "dependencies": {
4503+ "debug": {
4504+ "version": "2.6.9",
4505+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4506+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4507+ "dev": true,
4508+ "requires": {
4509+ "ms": "2.0.0"
4510+ }
4511+ }
4512+ }
4513+ },
4514+ "serialize-javascript": {
4515+ "version": "1.5.0",
4516+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
4517+ "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
4518+ "dev": true
4519+ },
4520+ "serve-index": {
4521+ "version": "1.9.1",
4522+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
4523+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
4524+ "dev": true,
4525+ "requires": {
4526+ "accepts": "~1.3.4",
4527+ "batch": "0.6.1",
4528+ "debug": "2.6.9",
4529+ "escape-html": "~1.0.3",
4530+ "http-errors": "~1.6.2",
4531+ "mime-types": "~2.1.17",
4532+ "parseurl": "~1.3.2"
4533+ },
4534+ "dependencies": {
4535+ "debug": {
4536+ "version": "2.6.9",
4537+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4538+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4539+ "dev": true,
4540+ "requires": {
4541+ "ms": "2.0.0"
4542+ }
4543+ }
4544+ }
4545+ },
4546+ "serve-static": {
4547+ "version": "1.13.2",
4548+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
4549+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
4550+ "dev": true,
4551+ "requires": {
4552+ "encodeurl": "~1.0.2",
4553+ "escape-html": "~1.0.3",
4554+ "parseurl": "~1.3.2",
4555+ "send": "0.16.2"
4556+ }
4557+ },
4558+ "set-blocking": {
4559+ "version": "2.0.0",
4560+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4561+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
4562+ "dev": true
4563+ },
4564+ "set-immediate-shim": {
4565+ "version": "1.0.1",
4566+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
4567+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
4568+ "dev": true
4569+ },
4570+ "set-value": {
4571+ "version": "2.0.0",
4572+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
4573+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
4574+ "dev": true,
4575+ "requires": {
4576+ "extend-shallow": "^2.0.1",
4577+ "is-extendable": "^0.1.1",
4578+ "is-plain-object": "^2.0.3",
4579+ "split-string": "^3.0.1"
4580+ },
4581+ "dependencies": {
4582+ "extend-shallow": {
4583+ "version": "2.0.1",
4584+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4585+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4586+ "dev": true,
4587+ "requires": {
4588+ "is-extendable": "^0.1.0"
4589+ }
4590+ }
4591+ }
4592+ },
4593+ "setimmediate": {
4594+ "version": "1.0.5",
4595+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
4596+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
4597+ "dev": true
4598+ },
4599+ "setprototypeof": {
4600+ "version": "1.1.0",
4601+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
4602+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
4603+ "dev": true
4604+ },
4605+ "sha.js": {
4606+ "version": "2.4.11",
4607+ "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
4608+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
4609+ "dev": true,
4610+ "requires": {
4611+ "inherits": "^2.0.1",
4612+ "safe-buffer": "^5.0.1"
4613+ }
4614+ },
4615+ "shebang-command": {
4616+ "version": "1.2.0",
4617+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
4618+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
4619+ "dev": true,
4620+ "requires": {
4621+ "shebang-regex": "^1.0.0"
4622+ }
4623+ },
4624+ "shebang-regex": {
4625+ "version": "1.0.0",
4626+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
4627+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
4628+ "dev": true
4629+ },
4630+ "signal-exit": {
4631+ "version": "3.0.2",
4632+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
4633+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
4634+ "dev": true
4635+ },
4636+ "snapdragon": {
4637+ "version": "0.8.2",
4638+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
4639+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
4640+ "dev": true,
4641+ "requires": {
4642+ "base": "^0.11.1",
4643+ "debug": "^2.2.0",
4644+ "define-property": "^0.2.5",
4645+ "extend-shallow": "^2.0.1",
4646+ "map-cache": "^0.2.2",
4647+ "source-map": "^0.5.6",
4648+ "source-map-resolve": "^0.5.0",
4649+ "use": "^3.1.0"
4650+ },
4651+ "dependencies": {
4652+ "debug": {
4653+ "version": "2.6.9",
4654+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4655+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4656+ "dev": true,
4657+ "requires": {
4658+ "ms": "2.0.0"
4659+ }
4660+ },
4661+ "define-property": {
4662+ "version": "0.2.5",
4663+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4664+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4665+ "dev": true,
4666+ "requires": {
4667+ "is-descriptor": "^0.1.0"
4668+ }
4669+ },
4670+ "extend-shallow": {
4671+ "version": "2.0.1",
4672+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4673+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4674+ "dev": true,
4675+ "requires": {
4676+ "is-extendable": "^0.1.0"
4677+ }
4678+ }
4679+ }
4680+ },
4681+ "snapdragon-node": {
4682+ "version": "2.1.1",
4683+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
4684+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
4685+ "dev": true,
4686+ "requires": {
4687+ "define-property": "^1.0.0",
4688+ "isobject": "^3.0.0",
4689+ "snapdragon-util": "^3.0.1"
4690+ },
4691+ "dependencies": {
4692+ "define-property": {
4693+ "version": "1.0.0",
4694+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
4695+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
4696+ "dev": true,
4697+ "requires": {
4698+ "is-descriptor": "^1.0.0"
4699+ }
4700+ },
4701+ "is-accessor-descriptor": {
4702+ "version": "1.0.0",
4703+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
4704+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
4705+ "dev": true,
4706+ "requires": {
4707+ "kind-of": "^6.0.0"
4708+ }
4709+ },
4710+ "is-data-descriptor": {
4711+ "version": "1.0.0",
4712+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
4713+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
4714+ "dev": true,
4715+ "requires": {
4716+ "kind-of": "^6.0.0"
4717+ }
4718+ },
4719+ "is-descriptor": {
4720+ "version": "1.0.2",
4721+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
4722+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
4723+ "dev": true,
4724+ "requires": {
4725+ "is-accessor-descriptor": "^1.0.0",
4726+ "is-data-descriptor": "^1.0.0",
4727+ "kind-of": "^6.0.2"
4728+ }
4729+ }
4730+ }
4731+ },
4732+ "snapdragon-util": {
4733+ "version": "3.0.1",
4734+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
4735+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
4736+ "dev": true,
4737+ "requires": {
4738+ "kind-of": "^3.2.0"
4739+ },
4740+ "dependencies": {
4741+ "kind-of": {
4742+ "version": "3.2.2",
4743+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4744+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4745+ "dev": true,
4746+ "requires": {
4747+ "is-buffer": "^1.1.5"
4748+ }
4749+ }
4750+ }
4751+ },
4752+ "sockjs": {
4753+ "version": "0.3.19",
4754+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
4755+ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
4756+ "dev": true,
4757+ "requires": {
4758+ "faye-websocket": "^0.10.0",
4759+ "uuid": "^3.0.1"
4760+ }
4761+ },
4762+ "sockjs-client": {
4763+ "version": "1.3.0",
4764+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
4765+ "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
4766+ "dev": true,
4767+ "requires": {
4768+ "debug": "^3.2.5",
4769+ "eventsource": "^1.0.7",
4770+ "faye-websocket": "~0.11.1",
4771+ "inherits": "^2.0.3",
4772+ "json3": "^3.3.2",
4773+ "url-parse": "^1.4.3"
4774+ },
4775+ "dependencies": {
4776+ "faye-websocket": {
4777+ "version": "0.11.1",
4778+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
4779+ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
4780+ "dev": true,
4781+ "requires": {
4782+ "websocket-driver": ">=0.5.1"
4783+ }
4784+ }
4785+ }
4786+ },
4787+ "source-list-map": {
4788+ "version": "2.0.1",
4789+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
4790+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
4791+ "dev": true
4792+ },
4793+ "source-map": {
4794+ "version": "0.5.7",
4795+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4796+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4797+ "dev": true
4798+ },
4799+ "source-map-resolve": {
4800+ "version": "0.5.2",
4801+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
4802+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
4803+ "dev": true,
4804+ "requires": {
4805+ "atob": "^2.1.1",
4806+ "decode-uri-component": "^0.2.0",
4807+ "resolve-url": "^0.2.1",
4808+ "source-map-url": "^0.4.0",
4809+ "urix": "^0.1.0"
4810+ }
4811+ },
4812+ "source-map-url": {
4813+ "version": "0.4.0",
4814+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
4815+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
4816+ "dev": true
4817+ },
4818+ "spdy": {
4819+ "version": "3.4.7",
4820+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
4821+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
4822+ "dev": true,
4823+ "requires": {
4824+ "debug": "^2.6.8",
4825+ "handle-thing": "^1.2.5",
4826+ "http-deceiver": "^1.2.7",
4827+ "safe-buffer": "^5.0.1",
4828+ "select-hose": "^2.0.0",
4829+ "spdy-transport": "^2.0.18"
4830+ },
4831+ "dependencies": {
4832+ "debug": {
4833+ "version": "2.6.9",
4834+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4835+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4836+ "dev": true,
4837+ "requires": {
4838+ "ms": "2.0.0"
4839+ }
4840+ }
4841+ }
4842+ },
4843+ "spdy-transport": {
4844+ "version": "2.1.0",
4845+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
4846+ "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
4847+ "dev": true,
4848+ "requires": {
4849+ "debug": "^2.6.8",
4850+ "detect-node": "^2.0.3",
4851+ "hpack.js": "^2.1.6",
4852+ "obuf": "^1.1.1",
4853+ "readable-stream": "^2.2.9",
4854+ "safe-buffer": "^5.0.1",
4855+ "wbuf": "^1.7.2"
4856+ },
4857+ "dependencies": {
4858+ "debug": {
4859+ "version": "2.6.9",
4860+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
4861+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
4862+ "dev": true,
4863+ "requires": {
4864+ "ms": "2.0.0"
4865+ }
4866+ }
4867+ }
4868+ },
4869+ "split-string": {
4870+ "version": "3.1.0",
4871+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
4872+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
4873+ "dev": true,
4874+ "requires": {
4875+ "extend-shallow": "^3.0.0"
4876+ }
4877+ },
4878+ "ssri": {
4879+ "version": "5.3.0",
4880+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
4881+ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
4882+ "dev": true,
4883+ "requires": {
4884+ "safe-buffer": "^5.1.1"
4885+ }
4886+ },
4887+ "static-extend": {
4888+ "version": "0.1.2",
4889+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
4890+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
4891+ "dev": true,
4892+ "requires": {
4893+ "define-property": "^0.2.5",
4894+ "object-copy": "^0.1.0"
4895+ },
4896+ "dependencies": {
4897+ "define-property": {
4898+ "version": "0.2.5",
4899+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
4900+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
4901+ "dev": true,
4902+ "requires": {
4903+ "is-descriptor": "^0.1.0"
4904+ }
4905+ }
4906+ }
4907+ },
4908+ "statuses": {
4909+ "version": "1.4.0",
4910+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
4911+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
4912+ "dev": true
4913+ },
4914+ "stream-browserify": {
4915+ "version": "2.0.1",
4916+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
4917+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
4918+ "dev": true,
4919+ "requires": {
4920+ "inherits": "~2.0.1",
4921+ "readable-stream": "^2.0.2"
4922+ }
4923+ },
4924+ "stream-each": {
4925+ "version": "1.2.3",
4926+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
4927+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
4928+ "dev": true,
4929+ "requires": {
4930+ "end-of-stream": "^1.1.0",
4931+ "stream-shift": "^1.0.0"
4932+ }
4933+ },
4934+ "stream-http": {
4935+ "version": "2.8.3",
4936+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
4937+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
4938+ "dev": true,
4939+ "requires": {
4940+ "builtin-status-codes": "^3.0.0",
4941+ "inherits": "^2.0.1",
4942+ "readable-stream": "^2.3.6",
4943+ "to-arraybuffer": "^1.0.0",
4944+ "xtend": "^4.0.0"
4945+ }
4946+ },
4947+ "stream-shift": {
4948+ "version": "1.0.0",
4949+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
4950+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
4951+ "dev": true
4952+ },
4953+ "string-width": {
4954+ "version": "2.1.1",
4955+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4956+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4957+ "dev": true,
4958+ "requires": {
4959+ "is-fullwidth-code-point": "^2.0.0",
4960+ "strip-ansi": "^4.0.0"
4961+ },
4962+ "dependencies": {
4963+ "ansi-regex": {
4964+ "version": "3.0.0",
4965+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4966+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4967+ "dev": true
4968+ },
4969+ "strip-ansi": {
4970+ "version": "4.0.0",
4971+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4972+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4973+ "dev": true,
4974+ "requires": {
4975+ "ansi-regex": "^3.0.0"
4976+ }
4977+ }
4978+ }
4979+ },
4980+ "string_decoder": {
4981+ "version": "1.1.1",
4982+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4983+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4984+ "dev": true,
4985+ "requires": {
4986+ "safe-buffer": "~5.1.0"
4987+ }
4988+ },
4989+ "strip-ansi": {
4990+ "version": "3.0.1",
4991+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
4992+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
4993+ "dev": true,
4994+ "requires": {
4995+ "ansi-regex": "^2.0.0"
4996+ }
4997+ },
4998+ "strip-eof": {
4999+ "version": "1.0.0",
5000+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
5001+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
5002+ "dev": true
5003+ },
5004+ "supports-color": {
5005+ "version": "5.4.0",
5006+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
5007+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
5008+ "dev": true,
5009+ "requires": {
5010+ "has-flag": "^3.0.0"
5011+ }
5012+ },
5013+ "tapable": {
5014+ "version": "1.0.0",
5015+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
5016+ "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==",
5017+ "dev": true
5018+ },
5019+ "through2": {
5020+ "version": "2.0.3",
5021+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
5022+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
5023+ "dev": true,
5024+ "requires": {
5025+ "readable-stream": "^2.1.5",
5026+ "xtend": "~4.0.1"
5027+ }
5028+ },
5029+ "thunky": {
5030+ "version": "1.0.3",
5031+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
5032+ "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
5033+ "dev": true
5034+ },
5035+ "timers-browserify": {
5036+ "version": "2.0.10",
5037+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
5038+ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
5039+ "dev": true,
5040+ "requires": {
5041+ "setimmediate": "^1.0.4"
5042+ }
5043+ },
5044+ "to-arraybuffer": {
5045+ "version": "1.0.1",
5046+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
5047+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
5048+ "dev": true
5049+ },
5050+ "to-object-path": {
5051+ "version": "0.3.0",
5052+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
5053+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
5054+ "dev": true,
5055+ "requires": {
5056+ "kind-of": "^3.0.2"
5057+ },
5058+ "dependencies": {
5059+ "kind-of": {
5060+ "version": "3.2.2",
5061+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5062+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5063+ "dev": true,
5064+ "requires": {
5065+ "is-buffer": "^1.1.5"
5066+ }
5067+ }
5068+ }
5069+ },
5070+ "to-regex": {
5071+ "version": "3.0.2",
5072+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
5073+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
5074+ "dev": true,
5075+ "requires": {
5076+ "define-property": "^2.0.2",
5077+ "extend-shallow": "^3.0.2",
5078+ "regex-not": "^1.0.2",
5079+ "safe-regex": "^1.1.0"
5080+ }
5081+ },
5082+ "to-regex-range": {
5083+ "version": "2.1.1",
5084+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
5085+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
5086+ "dev": true,
5087+ "requires": {
5088+ "is-number": "^3.0.0",
5089+ "repeat-string": "^1.6.1"
5090+ }
5091+ },
5092+ "toposort": {
5093+ "version": "1.0.7",
5094+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
5095+ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
5096+ "dev": true
5097+ },
5098+ "tslib": {
5099+ "version": "1.9.3",
5100+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
5101+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
5102+ "dev": true
5103+ },
5104+ "tty-browserify": {
5105+ "version": "0.0.0",
5106+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
5107+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
5108+ "dev": true
5109+ },
5110+ "type-is": {
5111+ "version": "1.6.16",
5112+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
5113+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
5114+ "dev": true,
5115+ "requires": {
5116+ "media-typer": "0.3.0",
5117+ "mime-types": "~2.1.18"
5118+ }
5119+ },
5120+ "typedarray": {
5121+ "version": "0.0.6",
5122+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
5123+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
5124+ "dev": true
5125+ },
5126+ "uglify-es": {
5127+ "version": "3.3.9",
5128+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
5129+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
5130+ "dev": true,
5131+ "requires": {
5132+ "commander": "~2.13.0",
5133+ "source-map": "~0.6.1"
5134+ },
5135+ "dependencies": {
5136+ "source-map": {
5137+ "version": "0.6.1",
5138+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5139+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5140+ "dev": true
5141+ }
5142+ }
5143+ },
5144+ "uglifyjs-webpack-plugin": {
5145+ "version": "1.3.0",
5146+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
5147+ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
5148+ "dev": true,
5149+ "requires": {
5150+ "cacache": "^10.0.4",
5151+ "find-cache-dir": "^1.0.0",
5152+ "schema-utils": "^0.4.5",
5153+ "serialize-javascript": "^1.4.0",
5154+ "source-map": "^0.6.1",
5155+ "uglify-es": "^3.3.4",
5156+ "webpack-sources": "^1.1.0",
5157+ "worker-farm": "^1.5.2"
5158+ },
5159+ "dependencies": {
5160+ "source-map": {
5161+ "version": "0.6.1",
5162+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5163+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5164+ "dev": true
5165+ }
5166+ }
5167+ },
5168+ "union-value": {
5169+ "version": "1.0.0",
5170+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
5171+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
5172+ "dev": true,
5173+ "requires": {
5174+ "arr-union": "^3.1.0",
5175+ "get-value": "^2.0.6",
5176+ "is-extendable": "^0.1.1",
5177+ "set-value": "^0.4.3"
5178+ },
5179+ "dependencies": {
5180+ "extend-shallow": {
5181+ "version": "2.0.1",
5182+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
5183+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
5184+ "dev": true,
5185+ "requires": {
5186+ "is-extendable": "^0.1.0"
5187+ }
5188+ },
5189+ "set-value": {
5190+ "version": "0.4.3",
5191+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
5192+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
5193+ "dev": true,
5194+ "requires": {
5195+ "extend-shallow": "^2.0.1",
5196+ "is-extendable": "^0.1.1",
5197+ "is-plain-object": "^2.0.1",
5198+ "to-object-path": "^0.3.0"
5199+ }
5200+ }
5201+ }
5202+ },
5203+ "unique-filename": {
5204+ "version": "1.1.1",
5205+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
5206+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
5207+ "dev": true,
5208+ "requires": {
5209+ "unique-slug": "^2.0.0"
5210+ }
5211+ },
5212+ "unique-slug": {
5213+ "version": "2.0.1",
5214+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
5215+ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
5216+ "dev": true,
5217+ "requires": {
5218+ "imurmurhash": "^0.1.4"
5219+ }
5220+ },
5221+ "unpipe": {
5222+ "version": "1.0.0",
5223+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
5224+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
5225+ "dev": true
5226+ },
5227+ "unset-value": {
5228+ "version": "1.0.0",
5229+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
5230+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
5231+ "dev": true,
5232+ "requires": {
5233+ "has-value": "^0.3.1",
5234+ "isobject": "^3.0.0"
5235+ },
5236+ "dependencies": {
5237+ "has-value": {
5238+ "version": "0.3.1",
5239+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
5240+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
5241+ "dev": true,
5242+ "requires": {
5243+ "get-value": "^2.0.3",
5244+ "has-values": "^0.1.4",
5245+ "isobject": "^2.0.0"
5246+ },
5247+ "dependencies": {
5248+ "isobject": {
5249+ "version": "2.1.0",
5250+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
5251+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
5252+ "dev": true,
5253+ "requires": {
5254+ "isarray": "1.0.0"
5255+ }
5256+ }
5257+ }
5258+ },
5259+ "has-values": {
5260+ "version": "0.1.4",
5261+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
5262+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
5263+ "dev": true
5264+ },
5265+ "isarray": {
5266+ "version": "1.0.0",
5267+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5268+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
5269+ "dev": true
5270+ }
5271+ }
5272+ },
5273+ "upath": {
5274+ "version": "1.1.0",
5275+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
5276+ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
5277+ "dev": true
5278+ },
5279+ "upper-case": {
5280+ "version": "1.1.3",
5281+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
5282+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
5283+ "dev": true
5284+ },
5285+ "uri-js": {
5286+ "version": "4.2.2",
5287+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
5288+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
5289+ "dev": true,
5290+ "requires": {
5291+ "punycode": "^2.1.0"
5292+ }
5293+ },
5294+ "urix": {
5295+ "version": "0.1.0",
5296+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
5297+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
5298+ "dev": true
5299+ },
5300+ "url": {
5301+ "version": "0.11.0",
5302+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
5303+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
5304+ "dev": true,
5305+ "requires": {
5306+ "punycode": "1.3.2",
5307+ "querystring": "0.2.0"
5308+ },
5309+ "dependencies": {
5310+ "punycode": {
5311+ "version": "1.3.2",
5312+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
5313+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
5314+ "dev": true
5315+ }
5316+ }
5317+ },
5318+ "url-parse": {
5319+ "version": "1.4.3",
5320+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
5321+ "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
5322+ "dev": true,
5323+ "requires": {
5324+ "querystringify": "^2.0.0",
5325+ "requires-port": "^1.0.0"
5326+ }
5327+ },
5328+ "use": {
5329+ "version": "3.1.1",
5330+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
5331+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
5332+ "dev": true
5333+ },
5334+ "util": {
5335+ "version": "0.10.4",
5336+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
5337+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
5338+ "dev": true,
5339+ "requires": {
5340+ "inherits": "2.0.3"
5341+ }
5342+ },
5343+ "util-deprecate": {
5344+ "version": "1.0.2",
5345+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5346+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
5347+ "dev": true
5348+ },
5349+ "util.promisify": {
5350+ "version": "1.0.0",
5351+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
5352+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
5353+ "dev": true,
5354+ "requires": {
5355+ "define-properties": "^1.1.2",
5356+ "object.getownpropertydescriptors": "^2.0.3"
5357+ }
5358+ },
5359+ "utila": {
5360+ "version": "0.4.0",
5361+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
5362+ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
5363+ "dev": true
5364+ },
5365+ "utils-merge": {
5366+ "version": "1.0.1",
5367+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
5368+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
5369+ "dev": true
5370+ },
5371+ "uuid": {
5372+ "version": "3.3.2",
5373+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
5374+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
5375+ "dev": true
5376+ },
5377+ "v8-compile-cache": {
5378+ "version": "2.0.2",
5379+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
5380+ "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
5381+ "dev": true
5382+ },
5383+ "vary": {
5384+ "version": "1.1.2",
5385+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
5386+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
5387+ "dev": true
5388+ },
5389+ "vm-browserify": {
5390+ "version": "0.0.4",
5391+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
5392+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
5393+ "dev": true,
5394+ "requires": {
5395+ "indexof": "0.0.1"
5396+ }
5397+ },
5398+ "watchpack": {
5399+ "version": "1.6.0",
5400+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
5401+ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
5402+ "dev": true,
5403+ "requires": {
5404+ "chokidar": "^2.0.2",
5405+ "graceful-fs": "^4.1.2",
5406+ "neo-async": "^2.5.0"
5407+ }
5408+ },
5409+ "wbuf": {
5410+ "version": "1.7.3",
5411+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
5412+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
5413+ "dev": true,
5414+ "requires": {
5415+ "minimalistic-assert": "^1.0.0"
5416+ }
5417+ },
5418+ "webpack": {
5419+ "version": "4.25.1",
5420+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.25.1.tgz",
5421+ "integrity": "sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==",
5422+ "dev": true,
5423+ "requires": {
5424+ "@webassemblyjs/ast": "1.7.11",
5425+ "@webassemblyjs/helper-module-context": "1.7.11",
5426+ "@webassemblyjs/wasm-edit": "1.7.11",
5427+ "@webassemblyjs/wasm-parser": "1.7.11",
5428+ "acorn": "^5.6.2",
5429+ "acorn-dynamic-import": "^3.0.0",
5430+ "ajv": "^6.1.0",
5431+ "ajv-keywords": "^3.1.0",
5432+ "chrome-trace-event": "^1.0.0",
5433+ "enhanced-resolve": "^4.1.0",
5434+ "eslint-scope": "^4.0.0",
5435+ "json-parse-better-errors": "^1.0.2",
5436+ "loader-runner": "^2.3.0",
5437+ "loader-utils": "^1.1.0",
5438+ "memory-fs": "~0.4.1",
5439+ "micromatch": "^3.1.8",
5440+ "mkdirp": "~0.5.0",
5441+ "neo-async": "^2.5.0",
5442+ "node-libs-browser": "^2.0.0",
5443+ "schema-utils": "^0.4.4",
5444+ "tapable": "^1.1.0",
5445+ "uglifyjs-webpack-plugin": "^1.2.4",
5446+ "watchpack": "^1.5.0",
5447+ "webpack-sources": "^1.3.0"
5448+ },
5449+ "dependencies": {
5450+ "tapable": {
5451+ "version": "1.1.0",
5452+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
5453+ "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==",
5454+ "dev": true
5455+ }
5456+ }
5457+ },
5458+ "webpack-cli": {
5459+ "version": "3.1.2",
5460+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
5461+ "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
5462+ "dev": true,
5463+ "requires": {
5464+ "chalk": "^2.4.1",
5465+ "cross-spawn": "^6.0.5",
5466+ "enhanced-resolve": "^4.1.0",
5467+ "global-modules-path": "^2.3.0",
5468+ "import-local": "^2.0.0",
5469+ "interpret": "^1.1.0",
5470+ "loader-utils": "^1.1.0",
5471+ "supports-color": "^5.5.0",
5472+ "v8-compile-cache": "^2.0.2",
5473+ "yargs": "^12.0.2"
5474+ },
5475+ "dependencies": {
5476+ "supports-color": {
5477+ "version": "5.5.0",
5478+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5479+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
5480+ "dev": true,
5481+ "requires": {
5482+ "has-flag": "^3.0.0"
5483+ }
5484+ }
5485+ }
5486+ },
5487+ "webpack-dev-middleware": {
5488+ "version": "3.4.0",
5489+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
5490+ "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
5491+ "dev": true,
5492+ "requires": {
5493+ "memory-fs": "~0.4.1",
5494+ "mime": "^2.3.1",
5495+ "range-parser": "^1.0.3",
5496+ "webpack-log": "^2.0.0"
5497+ },
5498+ "dependencies": {
5499+ "mime": {
5500+ "version": "2.3.1",
5501+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
5502+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
5503+ "dev": true
5504+ }
5505+ }
5506+ },
5507+ "webpack-dev-server": {
5508+ "version": "3.1.10",
5509+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz",
5510+ "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==",
5511+ "dev": true,
5512+ "requires": {
5513+ "ansi-html": "0.0.7",
5514+ "bonjour": "^3.5.0",
5515+ "chokidar": "^2.0.0",
5516+ "compression": "^1.5.2",
5517+ "connect-history-api-fallback": "^1.3.0",
5518+ "debug": "^3.1.0",
5519+ "del": "^3.0.0",
5520+ "express": "^4.16.2",
5521+ "html-entities": "^1.2.0",
5522+ "http-proxy-middleware": "~0.18.0",
5523+ "import-local": "^2.0.0",
5524+ "internal-ip": "^3.0.1",
5525+ "ip": "^1.1.5",
5526+ "killable": "^1.0.0",
5527+ "loglevel": "^1.4.1",
5528+ "opn": "^5.1.0",
5529+ "portfinder": "^1.0.9",
5530+ "schema-utils": "^1.0.0",
5531+ "selfsigned": "^1.9.1",
5532+ "serve-index": "^1.7.2",
5533+ "sockjs": "0.3.19",
5534+ "sockjs-client": "1.3.0",
5535+ "spdy": "^3.4.1",
5536+ "strip-ansi": "^3.0.0",
5537+ "supports-color": "^5.1.0",
5538+ "webpack-dev-middleware": "3.4.0",
5539+ "webpack-log": "^2.0.0",
5540+ "yargs": "12.0.2"
5541+ },
5542+ "dependencies": {
5543+ "schema-utils": {
5544+ "version": "1.0.0",
5545+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
5546+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
5547+ "dev": true,
5548+ "requires": {
5549+ "ajv": "^6.1.0",
5550+ "ajv-errors": "^1.0.0",
5551+ "ajv-keywords": "^3.1.0"
5552+ }
5553+ }
5554+ }
5555+ },
5556+ "webpack-log": {
5557+ "version": "2.0.0",
5558+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
5559+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
5560+ "dev": true,
5561+ "requires": {
5562+ "ansi-colors": "^3.0.0",
5563+ "uuid": "^3.3.2"
5564+ }
5565+ },
5566+ "webpack-sources": {
5567+ "version": "1.3.0",
5568+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
5569+ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
5570+ "dev": true,
5571+ "requires": {
5572+ "source-list-map": "^2.0.0",
5573+ "source-map": "~0.6.1"
5574+ },
5575+ "dependencies": {
5576+ "source-map": {
5577+ "version": "0.6.1",
5578+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5579+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5580+ "dev": true
5581+ }
5582+ }
5583+ },
5584+ "websocket-driver": {
5585+ "version": "0.7.0",
5586+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
5587+ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
5588+ "dev": true,
5589+ "requires": {
5590+ "http-parser-js": ">=0.4.0",
5591+ "websocket-extensions": ">=0.1.1"
5592+ }
5593+ },
5594+ "websocket-extensions": {
5595+ "version": "0.1.3",
5596+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
5597+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
5598+ "dev": true
5599+ },
5600+ "which": {
5601+ "version": "1.3.1",
5602+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
5603+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
5604+ "dev": true,
5605+ "requires": {
5606+ "isexe": "^2.0.0"
5607+ }
5608+ },
5609+ "which-module": {
5610+ "version": "2.0.0",
5611+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
5612+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
5613+ "dev": true
5614+ },
5615+ "worker-farm": {
5616+ "version": "1.6.0",
5617+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
5618+ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
5619+ "dev": true,
5620+ "requires": {
5621+ "errno": "~0.1.7"
5622+ }
5623+ },
5624+ "wrap-ansi": {
5625+ "version": "2.1.0",
5626+ "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
5627+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
5628+ "dev": true,
5629+ "requires": {
5630+ "string-width": "^1.0.1",
5631+ "strip-ansi": "^3.0.1"
5632+ },
5633+ "dependencies": {
5634+ "is-fullwidth-code-point": {
5635+ "version": "1.0.0",
5636+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
5637+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
5638+ "dev": true,
5639+ "requires": {
5640+ "number-is-nan": "^1.0.0"
5641+ }
5642+ },
5643+ "string-width": {
5644+ "version": "1.0.2",
5645+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
5646+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
5647+ "dev": true,
5648+ "requires": {
5649+ "code-point-at": "^1.0.0",
5650+ "is-fullwidth-code-point": "^1.0.0",
5651+ "strip-ansi": "^3.0.0"
5652+ }
5653+ }
5654+ }
5655+ },
5656+ "wrappy": {
5657+ "version": "1.0.2",
5658+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5659+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5660+ "dev": true
5661+ },
5662+ "xregexp": {
5663+ "version": "4.0.0",
5664+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
5665+ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
5666+ "dev": true
5667+ },
5668+ "xtend": {
5669+ "version": "4.0.1",
5670+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
5671+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
5672+ "dev": true
5673+ },
5674+ "y18n": {
5675+ "version": "4.0.0",
5676+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
5677+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
5678+ "dev": true
5679+ },
5680+ "yallist": {
5681+ "version": "2.1.2",
5682+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
5683+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
5684+ "dev": true
5685+ },
5686+ "yargs": {
5687+ "version": "12.0.2",
5688+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
5689+ "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
5690+ "dev": true,
5691+ "requires": {
5692+ "cliui": "^4.0.0",
5693+ "decamelize": "^2.0.0",
5694+ "find-up": "^3.0.0",
5695+ "get-caller-file": "^1.0.1",
5696+ "os-locale": "^3.0.0",
5697+ "require-directory": "^2.1.1",
5698+ "require-main-filename": "^1.0.1",
5699+ "set-blocking": "^2.0.0",
5700+ "string-width": "^2.0.0",
5701+ "which-module": "^2.0.0",
5702+ "y18n": "^3.2.1 || ^4.0.0",
5703+ "yargs-parser": "^10.1.0"
5704+ },
5705+ "dependencies": {
5706+ "find-up": {
5707+ "version": "3.0.0",
5708+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
5709+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
5710+ "dev": true,
5711+ "requires": {
5712+ "locate-path": "^3.0.0"
5713+ }
5714+ },
5715+ "locate-path": {
5716+ "version": "3.0.0",
5717+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
5718+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
5719+ "dev": true,
5720+ "requires": {
5721+ "p-locate": "^3.0.0",
5722+ "path-exists": "^3.0.0"
5723+ }
5724+ },
5725+ "p-limit": {
5726+ "version": "2.0.0",
5727+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
5728+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
5729+ "dev": true,
5730+ "requires": {
5731+ "p-try": "^2.0.0"
5732+ }
5733+ },
5734+ "p-locate": {
5735+ "version": "3.0.0",
5736+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5737+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5738+ "dev": true,
5739+ "requires": {
5740+ "p-limit": "^2.0.0"
5741+ }
5742+ },
5743+ "p-try": {
5744+ "version": "2.0.0",
5745+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
5746+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
5747+ "dev": true
5748+ }
5749+ }
5750+ },
5751+ "yargs-parser": {
5752+ "version": "10.1.0",
5753+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
5754+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
5755+ "dev": true,
5756+ "requires": {
5757+ "camelcase": "^4.1.0"
5758+ }
5759+ }
5760+ }
5761+}
examples/hello-world/package.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
3+ "name": "create-rust-webpack",
4+ "version": "0.1.5",
5+ "repository": "https://github.com/rustwasm/rust-webpack-template",
6+ "license": "Apache-2.0/MIT",
7+ "scripts": {
8+ "start": "webpack-dev-server -d",
9+ "build": "webpack"
10+ },
11+ "bin": {
12+ "create-rust-webpack": ".bin/create-rust-webpack.js"
13+ },
14+ "devDependencies": {
15+ "@wasm-tool/wasm-pack-plugin": "0.1.5",
16+ "html-webpack-plugin": "^3.2.0",
17+ "webpack": "^4.25.1",
18+ "webpack-cli": "^3.1.2",
19+ "webpack-dev-server": "^3.1.10"
20+ }
21+}
examples/hello-world/src/lib.rsdeleted−42
@@ -1,42 +0,0 @@
1−use dodrio::{builder::*, bumpalo};
2−use dodrio::{Node, Render, RenderContext, Vdom};
3−use wasm_bindgen::prelude::*;
4−
5−/// A rendering component that displays a greeting.
6−struct Hello {
7− /// Who to greet.
8− who: String,
9−}
10−
11−// The `Render` implementation describes how to render a `Hello` component into
12−// HTML.
13−impl<'a> Render<'a> for Hello {
14− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
15− let msg = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
16− let msg = msg.into_bump_str();
17− p(&cx).children([text(msg)]).finish()
18− }
19−}
20−
21−#[wasm_bindgen(start)]
22−pub fn run() {
23− // Set up the panic hook for debugging when things go wrong.
24− console_error_panic_hook::set_once();
25−
26− // Grab the document's `<body>`.
27− let window = web_sys::window().unwrap_throw();
28− let document = window.document().unwrap_throw();
29− let body = document.body().unwrap_throw();
30−
31− // Create a new `Hello` render component.
32− let component = Hello {
33− who: String::from("World"),
34− };
35−
36− // Create a virtual DOM and mount it and the `Hello` render component to the
37− // `<body>`.
38− let vdom = Vdom::new(body.as_ref(), component);
39−
40− // Run the virtual DOM forever and don't unmount it.
41− vdom.forget();
42−}
examples/hello-world/webpack.config.jsnew file+25
@@ -0,0 +1,25 @@
1+const path = require("path");
2+const HtmlWebpackPlugin = require("html-webpack-plugin");
3+
4+const dist = path.resolve(__dirname, "dist");
5+const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
6+
7+module.exports = {
8+ entry: "./js/index.js",
9+ output: {
10+ path: dist,
11+ filename: "bundle.js"
12+ },
13+ devServer: {
14+ contentBase: dist,
15+ },
16+ plugins: [
17+ new HtmlWebpackPlugin({
18+ template: 'index.html'
19+ }),
20+
21+ new WasmPackPlugin({
22+ crateDirectory: path.resolve(__dirname, "crate")
23+ }),
24+ ]
25+};
examples/input-form/Cargo.tomldeleted−32
@@ -1,32 +0,0 @@
1−[package]
2−name = "dodrio-input-form"
3−version = "0.1.0"
4−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5−edition = "2018"
6−
7−[lib]
8−crate-type = ["cdylib"]
9−
10−[features]
11−
12−[dependencies]
13−dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.55"
15−console_error_panic_hook = "0.1.6"
16−
17−[dependencies.web-sys]
18−version = "0.3.32"
19−features = [
20− "console",
21− "Document",
22− "Event",
23− "EventTarget",
24− "HtmlElement",
25− "HtmlInputElement",
26− "MouseEvent",
27− "Node",
28− "Window",
29−]
30−
31−[dev-dependencies]
32−wasm-bindgen-test = "0.3.5"
examples/input-form/README.mddeleted−22
@@ -1,22 +0,0 @@
1−# Input Forms
2−
3−Renders a greeting to a user-supplied person via an `<input>` value. The
4−greeting is live-updated with new inputs.
5−
6−## Source
7−
8−See `src/lib.rs`.
9−
10−## Build
11−
12−```
13−wasm-pack build --target web
14−```
15−
16−## Serve
17−
18−Use any HTTP server, for example:
19−
20−```
21−python -m SimpleHTTPServer
22−```
examples/input-form/index.htmldeleted−13
@@ -1,13 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3− <head>
4− <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5− <title>Input Form</title>
6− </head>
7− <body>
8− <script type="module">
9− import init from "./pkg/dodrio_input_form.js";
10− init("./pkg/dodrio_input_form_bg.wasm");
11− </script>
12− </body>
13−</html>
examples/input-form/src/lib.rsdeleted−81
@@ -1,81 +0,0 @@
1−use dodrio::{bumpalo, Node, Render, RenderContext};
2−use wasm_bindgen::prelude::*;
3−use wasm_bindgen::JsCast;
4−
5−/// Say hello to someone.
6−struct SayHelloTo {
7− /// Who to say hello to.
8− who: String,
9−}
10−
11−impl SayHelloTo {
12− /// Construct a new `SayHelloTo` component.
13− fn new<S: Into<String>>(who: S) -> SayHelloTo {
14− let who = who.into();
15− SayHelloTo { who }
16− }
17−
18− /// Update who to say hello to.
19− fn set_who(&mut self, who: String) {
20− self.who = who;
21− }
22−}
23−
24−// The `Render` implementation has a text `<input>` and a `<div>` that shows a
25−// greeting to the `<input>`'s value.
26−impl<'a> Render<'a> for SayHelloTo {
27− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
28− use dodrio::builder::*;
29−
30− div(&cx)
31− .children([
32− input(&cx)
33− .attr("type", "text")
34− .attr(
35− "value",
36− bumpalo::format!(in cx.bump, "{}", self.who).into_bump_str(),
37− )
38− .on("input", |root, vdom, event| {
39− // If the event's target is our input...
40− let input = match event
41− .target()
42− .and_then(|t| t.dyn_into::<web_sys::HtmlInputElement>().ok())
43− {
44− None => return,
45− Some(input) => input,
46− };
47−
48− // ...then get its value and update who we are greeting.
49− let value = input.value();
50− let hello = root.unwrap_mut::<SayHelloTo>();
51− hello.set_who(value);
52−
53− // Finally, re-render the component on the next animation frame.
54− vdom.schedule_render();
55− })
56− .finish(),
57− text(bumpalo::format!(in cx.bump, "Hello, {}!", self.who).into_bump_str()),
58− ])
59− .finish()
60− }
61−}
62−
63−#[wasm_bindgen(start)]
64−pub fn run() {
65− // Initialize debugging for when/if something goes wrong.
66− console_error_panic_hook::set_once();
67−
68− // Get the document's `<body>`.
69− let window = web_sys::window().unwrap();
70− let document = window.document().unwrap();
71− let body = document.body().unwrap();
72−
73− // Construct a new `SayHelloTo` rendering component.
74− let say_hello = SayHelloTo::new("World");
75−
76− // Mount the component to the `<body>`.
77− let vdom = dodrio::Vdom::new(&body, say_hello);
78−
79− // Run the component forever.
80− vdom.forget();
81−}
examples/js-component/Cargo.tomldeleted−26
@@ -1,26 +0,0 @@
1−[package]
2−name = "dodrio-js-component"
3−version = "0.1.0"
4−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5−edition = "2018"
6−
7−[lib]
8−crate-type = ["cdylib"]
9−
10−[features]
11−
12−[dependencies]
13−dodrio = { path = "../.." }
14−dodrio-js-api = { path = "../../crates/js-api" }
15−wasm-bindgen = "0.2.55"
16−console_error_panic_hook = "0.1.6"
17−js-sys = "0.3.32"
18−
19−[dependencies.web-sys]
20−version = "0.3.32"
21−features = [
22− "Document",
23− "HtmlElement",
24− "Node",
25− "Window",
26−]
examples/js-component/README.mddeleted−23
@@ -1,23 +0,0 @@
1−# Defining a Rendering Component in JavaScript
2−
3−Heterogeneous Rust and JavaScript rendering component trees!
4−
5−## Source
6−
7−See `greeting.js` for the JavaScript code.
8−
9−See `src/lib.rs` for the Rust code.
10−
11−## Build
12−
13−```
14−wasm-pack build --target web
15−```
16−
17−## Serve
18−
19−Use any HTTP server, for example:
20−
21−```
22−python -m SimpleHTTPServer
23−```
examples/js-component/greeting.jsdeleted−41
@@ -1,41 +0,0 @@
1−// A rendering component defined in JavaScript!
2−class Greeting {
3− constructor(who) {
4− this.who = who;
5− }
6−
7− render() {
8− return {
9− tagName: "p",
10− attributes: [
11− {
12− name: "class",
13− value: "greeting",
14− },
15− ],
16− listeners: [
17− {
18− on: "click",
19− callback: this.onClick.bind(this),
20− }
21− ],
22− children: [
23− "Hello, ",
24− {
25− tagName: "strong",
26− children: [this.who],
27− }
28− ],
29− };
30− }
31−
32− async onClick(vdom, event) {
33− // Be more excited!
34− this.who += "!";
35−
36− // Schedule a re-render.
37− await vdom.render();
38−
39− console.log("re-rendering finished!");
40− }
41−}
examples/js-component/index.htmldeleted−14
@@ -1,14 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3− <head>
4− <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5− <title>A JavaScript component!</title>
6− </head>
7− <body>
8− <script src="greeting.js"></script>
9− <script type="module">
10− import init from "./pkg/dodrio_js_component.js";
11− init("./pkg/dodrio_js_component_bg.wasm");
12− </script>
13− </body>
14−</html>
examples/js-component/src/lib.rsdeleted−63
@@ -1,63 +0,0 @@
1−use dodrio::{Node, Render, RenderContext, Vdom};
2−use dodrio_js_api::JsRender;
3−use js_sys::Object;
4−use wasm_bindgen::prelude::*;
5−
6−#[wasm_bindgen]
7−extern "C" {
8− // Import the JS `Greeting` class.
9− #[wasm_bindgen(extends = Object)]
10− #[derive(Clone, Debug)]
11− type Greeting;
12−
13− // And the `Greeting` class's constructor.
14− #[wasm_bindgen(constructor)]
15− fn new(who: &str) -> Greeting;
16−}
17−
18−/// This is our Rust rendering component that wraps the JS rendering component.
19−pub struct GreetingViaJs {
20− js: JsRender,
21−}
22−
23−impl GreetingViaJs {
24− /// Create a new `GreetingViaJs`, which will internally create a new JS
25− /// `Greeting`.
26− pub fn new(who: &str) -> GreetingViaJs {
27− let js = JsRender::new(Greeting::new(who));
28− GreetingViaJs { js }
29− }
30−}
31−
32−/// Here's the `Render` implementation! This adds a `<p>` element and some text
33−/// around whatever the inner JS `Greeting` component renders.
34−impl<'a> Render<'a> for GreetingViaJs {
35− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
36− use dodrio::builder::*;
37− p(&cx)
38− .children([text("JavaScript says: "), self.js.render(cx)])
39− .finish()
40− }
41−}
42−
43−/// Finally our main initialization function that kicks everything off!
44−#[wasm_bindgen(start)]
45−pub fn run() {
46− // Set up the panic hook for debugging when things go wrong.
47− console_error_panic_hook::set_once();
48−
49− // Grab the document's `<body>`.
50− let window = web_sys::window().unwrap_throw();
51− let document = window.document().unwrap_throw();
52− let body = document.body().unwrap_throw();
53−
54− // Create a new `GreetingViaJs` render component.
55− let component = GreetingViaJs::new("World");
56−
57− // Create a virtual DOM and mount it and the `GreetingViaJs` render component to the
58− // `<body>`.
59− let vdom = Vdom::new(body.as_ref(), component);
60−
61− // Run the virtual DOM forever and don't unmount it.
62− vdom.forget();
63−}
examples/moire/Cargo.tomldeleted−43
@@ -1,43 +0,0 @@
1−[package]
2−name = "dodrio-moire"
3−version = "0.1.0"
4−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
5−edition = "2018"
6−
7−[lib]
8−crate-type = ["cdylib"]
9−
10−[dependencies]
11−cfg-if = "0.1.10"
12−dodrio = { path = "../.." }
13−log = "0.4.11"
14−wasm-bindgen = "0.2.55"
15−wasm-bindgen-futures = "0.4.5"
16−
17−# Optional dependencies for logging.
18−console_error_panic_hook = { optional = true, version = "0.1.6" }
19−console_log = { optional = true, version = "0.2.0" }
20−js-sys = "0.3.32"
21−
22−[dependencies.web-sys]
23−version = "0.3.32"
24−features = [
25− "Document",
26− "Element",
27− "Event",
28− "EventTarget",
29− "HtmlElement",
30− "HtmlInputElement",
31− "Node",
32− "Performance",
33− "Window",
34−]
35−
36−[dev-dependencies]
37−wasm-bindgen-test = "0.3.5"
38−
39−[features]
40−logging = [
41− "console_log",
42− "console_error_panic_hook",
43−]
examples/moire/README.mddeleted−26
@@ -1,26 +0,0 @@
1−# Moiré Patterns!
2−
3−This was originally a demo meant to show off [WebRender][], and so the
4−performance bottleneck is painting, not DOM manipulation, but it looks cool
5−either way!
6−
7−[WebRender]: https://hacks.mozilla.org/2017/10/the-whole-web-at-maximum-fps-how-webrender-gets-rid-of-jank/
8−
9−## Source
10−
11−See `src/lib.rs` for the main bits, and `src/colors.rs` for HSV to RGB color
12−conversion and other color utilities.
13−
14−## Build
15−
16−```
17−wasm-pack build --target web
18−```
19−
20−## Serve
21−
22−Use any HTTP server, for example:
23−
24−```
25−python -m SimpleHTTPServer
26−```
examples/moire/index.htmldeleted−67
@@ -1,67 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3− <head>
4− <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5− <title>Moire patterns! Originally a WebRender demo</title>
6− <style>
7− main {
8− position: absolute;
9− top: 0;
10− left: 0;
11− right: 0;
12− bottom: 0;
13− overflow: hidden;
14− }
15− .circle {
16− border-radius: 50%;
17− position: absolute;
18− top: 50%;
19− left: 50%;
20− border-style: solid;
21− border-width: 3px;
22− }
23− .object {
24− position: absolute;
25− width: 100%;
26− height: 100%;
27− left: 0;
28− top: 0;
29− }
30− code {
31− position: relative;
32− font-size: 150%;
33− z-index: 10;
34− }
35− #circle-count {
36− position: absolute;
37− margin-top: 30px;
38− z-index: 2;
39− }
40− </style>
41− </head>
42− <body>
43− <code>FPS: <output id="fps"></code></code>
44− <div id="scene"></div>
45− <script type="module">
46− import init from "./pkg/dodrio_moire.js";
47− init("./pkg/dodrio_moire_bg.wasm");
48− </script>
49− <script>
50− let lastTime = 0
51− let frameCount = 0
52− const fps = document.getElementById('fps')
53− function updateFPS(time) {
54− frameCount++
55− if (lastTime + 1000.0 <= time) {
56− fps.textContent = frameCount
57− lastTime = time
58− frameCount = 0
59− }
60− }
61− requestAnimationFrame(function loop(now) {
62− updateFPS(now);
63− requestAnimationFrame(loop);
64− })
65− </script>
66− </body>
67−</html>
examples/moire/src/colors.rsdeleted−162
@@ -1,162 +0,0 @@
1−//! Color utility functions.
2−
3−use std::f64;
4−
5−/// An RGB color.
6−#[derive(Copy, Clone)]
7−pub struct Rgb {
8− pub r: u8,
9− pub g: u8,
10− pub b: u8,
11−}
12−
13−/// An HSV color.
14−#[derive(Copy, Clone)]
15−pub struct Hsv {
16− pub h: f64,
17− pub s: f64,
18− pub v: f64,
19−}
20−
21−/// Convert an RGB color into HSV.
22−impl From<Rgb> for Hsv {
23− fn from(Rgb { r, g, b }: Rgb) -> Hsv {
24− let r = r as f64 / 255.0;
25− let g = g as f64 / 255.0;
26− let b = b as f64 / 255.0;
27− let max = f64::max(f64::max(r, g), b);
28− let min = f64::min(f64::min(r, g), b);
29− let v = max;
30− let diff = v - min;
31− let mut h = 0.0;
32− let mut s = 0.0;
33− if diff != 0.0 {
34− s = diff / v;
35− let diffc = |c| (v - c) / 6.0 / diff + 1.0 / 2.0;
36− let rr = diffc(r);
37− let gg = diffc(g);
38− let bb = diffc(b);
39− if r == v {
40− h = bb - gg;
41− } else if g == v {
42− h = (1.0 / 3.0) + rr - bb;
43− } else if b == v {
44− h = (2.0 / 3.0) + gg - rr;
45− }
46− }
47− Hsv { h, s, v }
48− }
49−}
50−
51−/// Convert an HSV color into RGB.
52−impl From<Hsv> for Rgb {
53− fn from(Hsv { h, s, v }: Hsv) -> Rgb {
54− let i = (h * 6.0).floor();
55− let f = h * 6.0 - i;
56− let p = v * (1.0 - s);
57− let q = v * (1.0 - f * s);
58− let t = v * (1.0 - (1.0 - f) * s);
59− let r;
60− let g;
61− let b;
62− match i as u64 % 6 {
63− 0 => {
64− r = v;
65− g = t;
66− b = p;
67− }
68− 1 => {
69− r = q;
70− g = v;
71− b = p;
72− }
73− 2 => {
74− r = p;
75− g = v;
76− b = t;
77− }
78− 3 => {
79− r = p;
80− g = q;
81− b = v;
82− }
83− 4 => {
84− r = t;
85− g = p;
86− b = v;
87− }
88− 5 => {
89− r = v;
90− g = p;
91− b = q;
92− }
93− _ => wasm_bindgen::throw_str("impossible"),
94− }
95− let r = (r * 255.0).round() as u8;
96− let g = (g * 255.0).round() as u8;
97− let b = (b * 255.0).round() as u8;
98− Rgb { r, g, b }
99− }
100−}
101−
102−/// Linearly interpolate between two values.
103−fn lerp(a: f64, b: f64, t: f64) -> f64 {
104− a + (b - a) * t
105−}
106−
107−/// Clamp the `x` value to within the range `lo..hi`.
108−fn clamp(lo: f64, hi: f64, x: f64) -> f64 {
109− if x < lo {
110− lo
111− } else if x > hi {
112− hi
113− } else {
114− x
115− }
116−}
117−
118−/// Linearly interpolate two HSV colors and convert the result into RGB.
119−fn lerp_hsv_to_rgb(a: Hsv, b: Hsv, t: f64) -> Rgb {
120− let h = lerp(a.h, b.h, t);
121− let s = lerp(a.s, b.s, t);
122− let v = lerp(a.v, b.v, t);
123− let hsv = Hsv { h, s, v };
124− hsv.into()
125−}
126−
127−thread_local! {
128− static PALETTES: [(Hsv, Hsv); 3] = [
129− (
130− (Rgb { r: 0xfe, g: 0xf6, b: 0xdf }).into(),
131− (Rgb { r: 0x64, g: 0xc3, b: 0xc8 }).into(),
132− ),
133− (
134− (Rgb { r: 0xfc, g: 0xcf, b: 0x74 }).into(),
135− (Rgb { r: 0x41, g: 0x65, b: 0x7f }).into(),
136− ),
137− (
138− (Rgb { r: 0xd9, g: 0xe0, b: 0xe8 }).into(),
139− (Rgb { r: 0x94, g: 0x5d, b: 0x72 }).into(),
140− ),
141− ];
142−}
143−
144−/// Get a color from our color palette that is linearly interpolated based on
145−/// the `t` elapsed time value.
146−///
147−/// The `which` function allows callers to select whether they want the
148−/// foreground or background color.
149−pub fn get_interpolated_color<F>(mut which: F, t: f64) -> Rgb
150−where
151− F: FnMut((Hsv, Hsv)) -> Hsv,
152−{
153− PALETTES.with(|palettes| {
154− let t = t * (palettes.len() as f64);
155− let prev_index = t.floor() as usize % palettes.len();
156− let next_index = (prev_index + 1) % palettes.len();
157− let t = clamp(-0.5, 0.5, (t % 1.0 - 0.5) * 5.0) + 0.5;
158− let a = which(palettes[prev_index]);
159− let b = which(palettes[next_index]);
160− lerp_hsv_to_rgb(a, b, t)
161− })
162−}
examples/moire/src/lib.rsdeleted−259
@@ -1,259 +0,0 @@
1−mod colors;
2−
3−use cfg_if::cfg_if;
4−use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
5−use std::cell::RefCell;
6−use std::rc::Rc;
7−use std::str;
8−use wasm_bindgen::{prelude::*, JsCast};
9−
10−/// This is the main function that is automatically invoked when the wasm module
11−/// is loaded.
12−#[wasm_bindgen(start)]
13−pub fn run() {
14− // Set up the panic hook for debugging when things go wrong.
15− init_logging();
16−
17− // Grab the document's `<body>`.
18− let window = web_sys::window().unwrap_throw();
19− let document = window.document().unwrap_throw();
20− let scene = document.get_element_by_id("scene").unwrap_throw();
21−
22− // Create a new `Moire` render component.
23− let component = Moire::new();
24−
25− // Create a virtual DOM and mount it and the `Moire` render component to the
26− // scene.
27− let vdom = Vdom::new(&scene, component);
28−
29− // Kick off a loop that keeps re-rendering on every animation frame.
30− let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
31− let rc2 = rc.clone();
32− let window2 = window.clone();
33− let weak = vdom.weak();
34− let f = Closure::wrap(Box::new(move || {
35− weak.schedule_render();
36− window
37− .request_animation_frame(
38− rc.borrow()
39− .as_ref()
40− .unwrap_throw()
41− .as_ref()
42− .unchecked_ref::<js_sys::Function>(),
43− )
44− .unwrap_throw();
45− }) as Box<dyn FnMut()>);
46− window2
47− .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
48− .unwrap_throw();
49− *rc2.borrow_mut() = Some(f);
50−
51− // Run the virtual DOM forever and don't unmount it.
52− vdom.forget();
53−}
54−
55−cfg_if! {
56− if #[cfg(feature = "logging")] {
57− fn init_logging() {
58− console_error_panic_hook::set_once();
59− console_log::init_with_level(log::Level::Trace)
60− .expect_throw("should initialize logging OK");
61− }
62− } else {
63− fn init_logging() {
64− // Do nothing.
65− }
66− }
67−}
68−
69−/// A rendering component that renders two overlapping sets of concentric
70−/// circles that move around and form Moiré patterns.
71−///
72−/// https://en.wikipedia.org/wiki/Moir%C3%A9_pattern
73−pub struct Moire {
74− // How many circles to render in each of our sets. This is controlled by the
75− // `<input>` slider.
76− count: u32,
77−}
78−
79−impl Moire {
80− /// Construct a new `Moire` rendering component.
81− ///
82− /// Defaults to 200 circles.
83− pub fn new() -> Moire {
84− Moire { count: 200 }
85− }
86−
87− /// Callback for "change" events emitted on the `<input>` slider that
88− /// controls how many circles we render on each frame.
89− fn on_change(&mut self, event: web_sys::Event) {
90− // Get the `<input>` element.
91− let input = event
92− .target()
93− .unwrap_throw()
94− .unchecked_into::<web_sys::HtmlInputElement>();
95−
96− // Parse its new value.
97− let value = input.value();
98− let value: u32 = value
99− .parse()
100− .expect_throw("<input type=\"range\"> value should always be an integer");
101−
102− // And update our circle count!
103− self.count = value;
104− }
105−}
106−
107−impl<'a> Render<'a> for Moire {
108− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
109− use dodrio::builder::*;
110−
111− let elapsed = web_sys::window()
112− .unwrap_throw()
113− .performance()
114− .unwrap_throw()
115− .now();
116− let elapsed = elapsed / 1600.0;
117−
118− main(&cx)
119− .attr("style", self.moire_style(cx, elapsed))
120− .children([
121− // The `<input>` that lets users control how many circles to
122− // render.
123− input(&cx)
124− .attr("id", "circle-count")
125− .attr("type", "range")
126− .attr("min", "30")
127− .attr("max", "500")
128− .attr("value", {
129− let count = bumpalo::format!(in cx.bump, "{}", self.count);
130− count.into_bump_str()
131− })
132− .on("change", |root, _vdom, event| {
133− root.unwrap_mut::<Moire>().on_change(event);
134−
135− // Note: there is no need to manually schedule a
136− // re-render here, since we already started a
137− // `requestAnimationFrame` loop that automatically
138− // re-renders on every frame in the `run` function.
139− })
140− .finish(),
141− // And the actual concentric circles that form the Moire patterns.
142− self.orbiting_objects(cx, elapsed),
143− self.lemniscate_objects(cx, elapsed),
144− ])
145− .finish()
146− }
147−}
148−
149−/// Rendering helper methods.
150−impl Moire {
151− /// Generate the main Moire element's inline CSS styles.
152− fn moire_style<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> &'a str {
153− let elapsed = elapsed / 3.0;
154− let color = colors::get_interpolated_color(|(_, bg)| bg, elapsed % 1.0);
155− let style = bumpalo::format!(
156− in cx.bump,
157− "background-color: rgb({}, {}, {})",
158− color.r,
159− color.g,
160− color.b
161− );
162− style.into_bump_str()
163− }
164−
165− /// Generate the orbiting circle objects.
166− fn orbiting_objects<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> Node<'a> {
167− const D: f64 = 200.0;
168− let x = elapsed.sin() * D;
169− let y = elapsed.cos() * D;
170− self.moving_object(cx, elapsed, x, y)
171− }
172−
173− /// Generate the lemniscate circle objects that interact with the orbiting
174− /// circle objects to form Moire patterns.
175− fn lemniscate_objects<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> Node<'a> {
176− const A: f64 = 150.0;
177− let x = elapsed.sin() * A;
178− let y = elapsed.sin() * elapsed.cos() * A;
179− self.moving_object(cx, elapsed, x, y)
180− }
181−
182− fn moving_object<'a>(
183− &self,
184− cx: &mut RenderContext<'a>,
185− elapsed: f64,
186− x: f64,
187− y: f64,
188− ) -> Node<'a> {
189− use dodrio::builder::*;
190− div(&cx)
191− .attr("class", "object")
192− .attr("style", self.moving_object_style(cx, x, y))
193− .children([self.circle(cx, elapsed, self.count)])
194− .finish()
195− }
196−
197− /// Generate inline CSS styles for a moving object.
198− fn moving_object_style<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64) -> &'a str {
199− bumpalo::format!(in cx.bump, "left: {}px; top: {}px;", x, y).into_bump_str()
200− }
201−
202− /// Recursively generate `self.count` concentric circles.
203− fn circle<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64, n: u32) -> Node<'a> {
204− use dodrio::builder::*;
205−
206− let r = n * 16;
207−
208− let mut circle = div(&cx)
209− .attr("class", "circle")
210− .attr("data-radius", {
211− let r = bumpalo::format!(in cx.bump, "{}", r);
212− r.into_bump_str()
213− })
214− .attr("style", self.circle_style(cx, elapsed, n, r));
215−
216− if n > 0 {
217− circle = circle.child(self.circle(cx, elapsed, n - 1));
218− }
219−
220− circle.finish()
221− }
222−
223− /// Generate inline CSS styles for a circle.
224− fn circle_style<'a>(
225− &self,
226− cx: &mut RenderContext<'a>,
227− elapsed: f64,
228− n: u32,
229− r: u32,
230− ) -> &'a str {
231− let (border, alpha) = self.circle_color(elapsed, n);
232− let margin = r / 2 + 3;
233− let style = bumpalo::format!(
234− in cx.bump,
235− "border-color: rgba({}, {}, {}, {});\
236− margin-left: -{}px;\
237− margin-top: -{}px;\
238− width: {}px;\
239− height: {}px;",
240− border.r,
241− border.g,
242− border.b,
243− alpha,
244− margin,
245− margin,
246− r,
247− r
248− );
249− style.into_bump_str()
250− }
251−
252− /// Compute the color for a circle.
253− fn circle_color(&self, elapsed: f64, n: u32) -> (colors::Rgb, f64) {
254− let elapsed = elapsed / 3.0;
255− let base = colors::get_interpolated_color(|(fg, _)| fg, elapsed % 1.0);
256− let lightness = 1.0 - (n as f64) / (self.count as f64);
257− (base, lightness)
258− }
259−}
examples/sierpinski-triangle/Cargo.tomldeleted−28
@@ -1,28 +0,0 @@
1−[package]
2−name = "dodrio-sierpinski"
3−version = "0.1.0"
4−authors = ["Steven Seguin <steven.seguin@gmail.com>"]
5−edition = "2018"
6−
7−[lib]
8−crate-type = ["cdylib"]
9−
10−[dependencies]
11−dodrio = { path = "../.." }
12−wasm-bindgen = "0.2.55"
13−console_error_panic_hook = "0.1.6"
14−js-sys = "0.3.32"
15−wasm-bindgen-futures = "0.4.5"
16−
17−[dependencies.web-sys]
18−version = "0.3.32"
19−features = [
20− "Document",
21− "HtmlElement",
22− "Node",
23− "Performance",
24− "Window",
25−]
26−
27−[dev-dependencies]
28−wasm-bindgen-test = "0.3.5"
examples/sierpinski-triangle/README.mddeleted−24
@@ -1,24 +0,0 @@
1−# Sierpinski Triangle
2−
3−A Sierpinkski triangle that constantly shrinks and grows, and whose nodes have
4−a value that increments by one every second.
5−
6−Ported from the React Fiber example [here](https://github.com/claudiopro/react-fiber-vs-stack-demo).
7−
8−## Source
9−
10−See `src/lib.rs`.
11−
12−## Build
13−
14−```
15−wasm-pack build --target web
16−```
17−
18−## Serve
19−
20−Use any HTTP server, for example:
21−
22−```
23−python -m SimpleHTTPServer
24−```
examples/sierpinski-triangle/ferris.pngdeleted

Binary file not shown.

examples/sierpinski-triangle/index.htmldeleted−69
@@ -1,69 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3−
4−<head>
5− <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6− <title>Sierpinski Triangle</title>
7− <style>
8− .container {
9− position: absolute;
10− transform-origin: 0 0;
11− left: 50%;
12− top: 50%;
13− width: 10px;
14− height: 10px;
15− background: #eee;
16− }
17−
18− .dot {
19− position: absolute;
20− background: #61dafb;
21− font: normal 15px sans-serif;
22− text-align: center;
23− cursor: pointer;
24− }
25−
26− .dot:hover {
27− background: url("ferris.png") no-repeat center center;
28− z-index: 999;
29− }
30−
31− code {
32− position: relative;
33− font-size: 150%;
34− }
35− </style>
36−</head>
37−
38−<body>
39− <code>FPS: <output id="fps">...</output></code>
40− <div id="scene"></div>
41−
42− <script type="module">
43− import init from "./pkg/dodrio_sierpinski.js";
44− init("./pkg/dodrio_sierpinski_bg.wasm");
45− </script>
46−
47− <script>
48− let lastTime = 0;
49− let frameCount = 0;
50− const fps = document.getElementById('fps');
51−
52− function updateFPS(time) {
53− frameCount++;
54− if (lastTime + 1000.0 <= time) {
55− fps.textContent = frameCount;
56− lastTime = time;
57− frameCount = 0;
58− }
59− }
60−
61− requestAnimationFrame(function loop(now) {
62− updateFPS(now);
63− requestAnimationFrame(loop);
64− })
65−
66− </script>
67−</body>
68−
69−</html>
examples/sierpinski-triangle/src/lib.rsdeleted−157
@@ -1,157 +0,0 @@
1−use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
2−use std::cell::RefCell;
3−use std::rc::Rc;
4−use wasm_bindgen::{prelude::*, JsCast};
5−use web_sys::Window;
6−
7−// Triangle container defining target size.
8−struct Container {
9− size: f64,
10−}
11−
12−impl Container {
13− // Construct a new container.
14− pub fn new() -> Container {
15− Container { size: 25.0 }
16− }
17−
18− // Generate the container style to fluctuate triangle width.
19− fn container_transform<'a>(&self, cx: &mut RenderContext<'a>, elapsed: f64) -> &'a str {
20− let t = elapsed % 10.0;
21− let scale = 0.45 + (if t > 5.0 { 10.0 - t } else { t }) / 40.0;
22− let transform = bumpalo::format!(
23− in cx.bump,
24− "transform: scaleX({}) scaleY(0.7) translateZ(0.1px)",
25− scale
26− );
27− transform.into_bump_str()
28− }
29−
30− // Generate the dot's position on the grid.
31− fn dot_style<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64) -> &'a str {
32− let s = self.size * 1.3;
33− let radius = s / 2.0;
34− let styles = bumpalo::format!(
35− in cx.bump,
36− r#"
37− width: {}px;
38− height: {}px;
39− left: {}px;
40− top: {}px;
41− border-radius: {}px;
42− line-height: {}px;
43− "#,
44− s, s, x, y, radius, s
45− );
46− styles.into_bump_str()
47− }
48−
49− // Create a dot node.
50− fn dot<'a>(&self, cx: &mut RenderContext<'a>, x: f64, y: f64, content: u32) -> Node<'a> {
51− use dodrio::builder::{div, text};
52−
53− div(&cx)
54− .attr("class", "dot")
55− .attr("style", self.dot_style(cx, x, y))
56− .child(text(
57− bumpalo::format!(in cx.bump, "{}", content).into_bump_str(),
58− ))
59− .finish()
60− }
61−
62− // Create a flattened vector of dot nodes (arranged in recursive triangles)
63− fn triangle<'a>(
64− &self,
65− cx: &mut RenderContext<'a>,
66− x: f64,
67− y: f64,
68− s: f64,
69− content: u32,
70− children: &mut bumpalo::collections::Vec<Node<'a>>,
71− ) {
72− if s <= self.size {
73− children.push(self.dot(cx, x, y, content));
74− return;
75− }
76−
77− let s = s / 2.0;
78−
79− // Top of triangle
80− self.triangle(cx, x, y - (s / 2.0), s, content, children);
81− // Bottom-left of triangle
82− self.triangle(cx, x - s, y + (s / 2.0), s, content, children);
83− // Bottom-right of triangle
84− self.triangle(cx, x + s, y + (s / 2.0), s, content, children);
85− }
86−}
87−
88−impl<'a> Render<'a> for Container {
89− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90− use dodrio::builder::div;
91−
92− let elapsed = web_sys::window()
93− .unwrap_throw()
94− .performance()
95− .unwrap_throw()
96− .now()
97− / 1000.0;
98−
99− let modulus = elapsed as u32 % 10;
100−
101− let mut children = bumpalo::collections::Vec::new_in(cx.bump);
102− self.triangle(cx, 0.0, 0.0, 1000.0, modulus, &mut children);
103−
104− div(&cx)
105− .attr("class", "container")
106− .attr("style", self.container_transform(cx, elapsed))
107− .children(children)
108− .finish()
109− }
110−}
111−
112−// Kick off a loop that keeps re-rendering on every animation frame.
113−fn animate(window: Window, vdom: Vdom) {
114− let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
115− let rc2 = rc.clone();
116− let window2 = window.clone();
117− let weak = vdom.weak();
118− let f = Closure::wrap(Box::new(move || {
119− weak.schedule_render();
120− window
121− .request_animation_frame(
122− rc.borrow()
123− .as_ref()
124− .unwrap_throw()
125− .as_ref()
126− .unchecked_ref::<js_sys::Function>(),
127− )
128− .unwrap_throw();
129− }) as Box<dyn FnMut()>);
130− window2
131− .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
132− .unwrap_throw();
133− *rc2.borrow_mut() = Some(f);
134−
135− // Run the virtual DOM and its listeners forever.
136− vdom.forget();
137−}
138−
139−#[wasm_bindgen(start)]
140−pub fn run() {
141− // Set up the panic hook
142− console_error_panic_hook::set_once();
143−
144− // Get the scene element to render within
145− let window = web_sys::window().unwrap();
146− let document = window.document().unwrap();
147− let scene = document.get_element_by_id("scene").unwrap();
148−
149− // Construct a new Container component.
150− let container = Container::new();
151−
152− // Mount our container component to the scene div.
153− let vdom = Vdom::new(&scene, container);
154−
155− // Kick off animation loop
156− animate(window, vdom);
157−}
examples/todomvc/Cargo.tomldeleted−47
@@ -1,47 +0,0 @@
1−[package]
2−authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
3−edition = "2018"
4−name = "dodrio-todomvc"
5−version = "0.1.0"
6−
7−[dependencies]
8−cfg-if = "0.1.10"
9−dodrio = { path = "../..", features = ["serde"] }
10−js-sys = "0.3.32"
11−serde = { features = ["derive"], version = "1.0.114" }
12−serde_json = "1.0.57"
13−wasm-bindgen = "0.2.55"
14−wasm-bindgen-futures = "0.4.5"
15−
16−# Optional dependencies for logging.
17−console_error_panic_hook = { optional = true, version = "0.1.6" }
18−console_log = { optional = true, version = "0.2.0" }
19−log = { optional = true, version = "0.4.11" }
20−
21−[dependencies.web-sys]
22−version = "0.3.32"
23−features = [
24− "Document",
25− "Event",
26− "EventTarget",
27− "HtmlElement",
28− "HtmlInputElement",
29− "KeyboardEvent",
30− "Location",
31− "Storage",
32− "Node",
33− "Window",
34−]
35−
36−[dev-dependencies]
37−wasm-bindgen-test = "0.3.5"
38−
39−[features]
40−logging = [
41− "console_log",
42− "console_error_panic_hook",
43− "log",
44−]
45−
46−[lib]
47−crate-type = ["cdylib"]
examples/todomvc/README.mddeleted−33
@@ -1,33 +0,0 @@
1−# TodoMVC
2−
3−`dodrio` implementation of the popular [TodoMVC](http://todomvc.com/) app. It
4−correctly and completely fulfills [the
5−specification](https://github.com/tastejs/todomvc/blob/master/app-spec.md) to
6−the best of my knowledge.
7−
8−## Source
9−
10−There are a number of modules in this `dodrio` implementation of TodoMVC. The
11−most important are:
12−
13−* `src/lib.rs`: The entry point to the application.
14−* `src/todos.rs`: Definition of `Todos` model and its rendering.
15−* `src/todo.rs`: Definition of `Todo` model and its rendering.
16−* `src/controller.rs`: The controller handles UI interactions and translates
17− them into updates on the model. Finally, it triggers re-rendering after those
18− updates.
19−* `src/router.rs`: A simple URL hash-based router.
20−
21−## Build
22−
23−```
24−wasm-pack build --target web
25−```
26−
27−## Serve
28−
29−Use any HTTP server, for example:
30−
31−```
32−python -m SimpleHTTPServer
33−```
examples/todomvc/index.htmldeleted−21
@@ -1,21 +0,0 @@
1−<!doctype html>
2−<html lang="en">
3− <head>
4− <meta charset="utf-8">
5− <meta name="viewport" content="width=device-width, initial-scale=1">
6− <title>dodrio • TodoMVC</title>
7− <link rel="stylesheet" href="https://unpkg.com/todomvc-common@^1.0.0/base.css">
8− <link rel="stylesheet" href="https://unpkg.com/todomvc-app-css@^2.0.0/index.css">
9− </head>
10− <body>
11− <section class="todoapp">
12− </section>
13− <footer class="info">
14− <p>Double-click to edit a todo</p>
15− </footer>
16− <script type="module">
17− import init from "./pkg/dodrio_todomvc.js";
18− init("./pkg/dodrio_todomvc_bg.wasm");
19− </script>
20− </body>
21−</html>
examples/todomvc/src/controller.rsdeleted−140
@@ -1,140 +0,0 @@
1−//! The controller handles UI events, translates them into updates on the model,
2−//! and schedules re-renders.
3−
4−use crate::todo::{Todo, TodoActions};
5−use crate::todos::{Todos, TodosActions};
6−use crate::visibility::Visibility;
7−use dodrio::{RootRender, VdomWeak};
8−use serde::{Deserialize, Serialize};
9−use std::ops::{Deref, DerefMut};
10−
11−/// The controller for the TodoMVC app.
12−///
13−/// This `Controller` struct is never actually instantiated. It is only used for
14−/// its `*Actions` trait implementations, none of which take a `self` parameter.
15−///
16−/// One could imagine alternative controller implementations with `*Actions`
17−/// trait implementations for (e.g.) testing that will assert various expected
18−/// action methods are called after rendering todo items and sending DOM events.
19−#[derive(Default, Deserialize, Serialize)]
20−pub struct Controller;
21−
22−impl TodosActions for Controller {
23− fn toggle_all(root: &mut dyn RootRender, vdom: VdomWeak) {
24− let mut todos = AutoCommitTodos::new(root, vdom);
25− let all_complete = todos.todos().iter().all(|t| t.is_complete());
26− for t in todos.todos_mut() {
27− t.set_complete(!all_complete);
28− }
29− }
30−
31− fn update_draft(root: &mut dyn RootRender, vdom: VdomWeak, draft: String) {
32− let mut todos = AutoCommitTodos::new(root, vdom);
33− todos.set_draft(draft);
34− }
35−
36− fn finish_draft(root: &mut dyn RootRender, vdom: VdomWeak) {
37− let mut todos = AutoCommitTodos::new(root, vdom);
38− let title = todos.take_draft();
39− let title = title.trim();
40− if !title.is_empty() {
41− let id = todos.todos().len();
42− let new = Todo::new(id, title);
43− todos.add_todo(new);
44− }
45− }
46−
47− fn change_visibility(root: &mut dyn RootRender, vdom: VdomWeak, vis: Visibility) {
48− let mut todos = AutoCommitTodos::new(root, vdom);
49− todos.set_visibility(vis);
50− }
51−
52− fn delete_completed(root: &mut dyn RootRender, vdom: VdomWeak) {
53− let mut todos = AutoCommitTodos::new(root, vdom);
54− todos.delete_completed();
55− }
56−}
57−
58−impl TodoActions for Controller {
59− fn toggle_completed(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
60− let mut todos = AutoCommitTodos::new(root, vdom);
61− let t = &mut todos.todos_mut()[id];
62− let completed = t.is_complete();
63− t.set_complete(!completed);
64− }
65−
66− fn delete(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
67− let mut todos = AutoCommitTodos::new(root, vdom);
68− todos.delete_todo(id);
69− }
70−
71− fn begin_editing(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
72− let mut todos = AutoCommitTodos::new(root, vdom);
73− let t = &mut todos.todos_mut()[id];
74− let desc = t.title().to_string();
75− t.set_edits(Some(desc));
76− }
77−
78− fn update_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize, edits: String) {
79− let mut todos = AutoCommitTodos::new(root, vdom);
80− let t = &mut todos.todos_mut()[id];
81− t.set_edits(Some(edits));
82− }
83−
84− fn finish_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
85− let mut todos = AutoCommitTodos::new(root, vdom);
86− let t = &mut todos.todos_mut()[id];
87− if let Some(edits) = t.take_edits() {
88− let edits = edits.trim();
89− if edits.is_empty() {
90− todos.delete_todo(id);
91− } else {
92− t.set_title(edits);
93− }
94− }
95− }
96−
97− fn cancel_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize) {
98− let mut todos = AutoCommitTodos::new(root, vdom);
99− let t = &mut todos.todos_mut()[id];
100− let _ = t.take_edits();
101− }
102−}
103−
104−/// An RAII type that dereferences to a `Todos` and once it is dropped, saves
105−/// the (presumably just modified) todos to local storage, and schedules a new
106−/// `dodrio` render.
107−pub struct AutoCommitTodos<'a> {
108− todos: &'a mut Todos,
109− vdom: VdomWeak,
110−}
111−
112−impl AutoCommitTodos<'_> {
113− /// Construct a new `AutoCommitTodos` from the root rendering component and
114− /// `vdom` handle.
115− pub fn new(root: &mut dyn RootRender, vdom: VdomWeak) -> AutoCommitTodos {
116− let todos = root.unwrap_mut::<Todos>();
117− AutoCommitTodos { todos, vdom }
118− }
119−}
120−
121−impl Drop for AutoCommitTodos<'_> {
122− fn drop(&mut self) {
123− self.todos.save_to_local_storage();
124− self.vdom.schedule_render();
125− }
126−}
127−
128−impl Deref for AutoCommitTodos<'_> {
129− type Target = Todos;
130−
131− fn deref(&self) -> &Todos {
132− &self.todos
133− }
134−}
135−
136−impl DerefMut for AutoCommitTodos<'_> {
137− fn deref_mut(&mut self) -> &mut Todos {
138− &mut self.todos
139− }
140−}
examples/todomvc/src/keys.rsdeleted−7
@@ -1,7 +0,0 @@
1−//! Constants for `KeyboardEvent::key_code`.`
2−
3−/// The key code for the enter key.
4−pub const ENTER: u32 = 13;
5−
6−/// The key code for the escape key.
7−pub const ESCAPE: u32 = 27;
examples/todomvc/src/lib.rsdeleted−60
@@ -1,60 +0,0 @@
1−//! TodoMVC implemented in `dodrio`!
2−
3−#![deny(missing_docs)]
4−
5−pub mod controller;
6−pub mod keys;
7−pub mod router;
8−pub mod todo;
9−pub mod todos;
10−pub mod utils;
11−pub mod visibility;
12−
13−use crate::controller::Controller;
14−use crate::todos::Todos;
15−use dodrio::Vdom;
16−use wasm_bindgen::prelude::*;
17−
18−/// Run the TodoMVC app!
19−///
20−/// Since this is marked `#[wasm_bindgen(start)]` it is automatically invoked
21−/// once the wasm module instantiated on the Web page.
22−#[wasm_bindgen(start)]
23−pub fn run() -> Result<(), JsValue> {
24− // Set up the logging for debugging if/when things go wrong.
25− init_logging();
26−
27− // Grab the todo app container.
28− let document = utils::document();
29− let container = document
30− .query_selector(".todoapp")?
31− .ok_or_else(|| js_sys::Error::new("could not find `.todoapp` container"))?;
32−
33− // Create a new `Todos` render component.
34− let todos = Todos::<Controller>::new();
35−
36− // Create a virtual DOM and mount it and the `Todos` render component.
37− let vdom = Vdom::new(&container, todos);
38−
39− // Start the URL router.
40− router::start(vdom.weak());
41−
42− // Run the virtual DOM forever and don't unmount it.
43− vdom.forget();
44−
45− Ok(())
46−}
47−
48−cfg_if::cfg_if! {
49− if #[cfg(feature = "logging")] {
50− fn init_logging() {
51− console_error_panic_hook::set_once();
52− console_log::init_with_level(log::Level::Trace)
53− .expect_throw("should initialize logging OK");
54− }
55− } else {
56− fn init_logging() {
57− // Do nothing.
58− }
59− }
60−}
examples/todomvc/src/router.rsdeleted−68
@@ -1,68 +0,0 @@
1−//! A simple `#`-fragment router.
2−
3−use crate::todos::Todos;
4−use crate::utils;
5−use crate::visibility::Visibility;
6−use dodrio::VdomWeak;
7−use std::str::FromStr;
8−use wasm_bindgen::{prelude::*, JsCast};
9−
10−/// Start the router.
11−pub fn start(vdom: VdomWeak) {
12− // Callback fired whenever the URL's hash fragment changes. Keeps the root
13− // todos collection's visibility in sync with the `#` fragment.
14− let on_hash_change = move || {
15− let new_vis = utils::hash()
16− .and_then(|hash| {
17− if hash.starts_with("#/") {
18− Visibility::from_str(&hash[2..]).ok()
19− } else {
20− None
21− }
22− })
23− .unwrap_or_else(|| {
24− // If we couldn't parse a visibility, make sure we canonicalize
25− // it back to our default hash.
26− let v = Visibility::default();
27− utils::set_hash(&format!("#/{}", v));
28− v
29− });
30−
31− wasm_bindgen_futures::spawn_local({
32− let vdom = vdom.clone();
33− async move {
34− let _ = vdom
35− .with_component({
36− let vdom = vdom.clone();
37− move |root| {
38− let todos = root.unwrap_mut::<Todos>();
39− // If the todos' visibility already matches the event's
40− // visibility, then there is nothing to do (ha). If they
41− // don't match, then we need to update the todos' visibility
42− // and re-render.
43− if todos.visibility() != new_vis {
44− todos.set_visibility(new_vis);
45− vdom.schedule_render();
46− }
47− }
48− })
49− .await;
50− }
51− });
52− };
53−
54− // Call it once to handle the initial `#` fragment.
55− on_hash_change();
56−
57− // Now listen for hash changes forever.
58− //
59− // Note that if we ever intended to unmount our todos app, we would want to
60− // provide a method for removing this router's event listener and cleaning
61− // up after ourselves.
62− let on_hash_change = Closure::wrap(Box::new(on_hash_change) as Box<dyn FnMut()>);
63− let window = utils::window();
64− window
65− .add_event_listener_with_callback("hashchange", on_hash_change.as_ref().unchecked_ref())
66− .unwrap_throw();
67− on_hash_change.forget();
68−}
examples/todomvc/src/todo.rsdeleted−229
@@ -1,229 +0,0 @@
1−//! Type definition and `dodrio::Render` implementation for a single todo item.
2−
3−use crate::keys;
4−use dodrio::{Cached, Node, Render, RenderContext, RootRender, VdomWeak};
5−use serde::{Deserialize, Serialize};
6−use std::marker::PhantomData;
7−use wasm_bindgen::{prelude::*, JsCast};
8−
9−/// A single todo item.
10−#[derive(Default)]
11−pub struct Todo<C> {
12− inner: Cached<TodoInner<C>>,
13−}
14−
15−#[derive(Serialize, Deserialize)]
16−struct TodoInner<C> {
17− id: usize,
18− title: String,
19− completed: bool,
20−
21− #[serde(skip)]
22− edits: Option<String>,
23−
24− #[serde(skip)]
25− _controller: PhantomData<C>,
26−}
27−
28−/// Actions on a single todo item that can be triggered from the UI.
29−pub trait TodoActions {
30− /// Toggle the completion state of the todo item with the given id.
31− fn toggle_completed(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
32−
33− /// Delete the todo item with the given id.
34− fn delete(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
35−
36− /// Begin editing the todo item with the given id.
37− fn begin_editing(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
38−
39− /// Update the edits for the todo with the given id.
40− fn update_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize, edits: String);
41−
42− /// Finish editing the todo with the given id.
43− fn finish_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
44−
45− /// Cancel editing the todo with the given id.
46− fn cancel_edits(root: &mut dyn RootRender, vdom: VdomWeak, id: usize);
47−}
48−
49−impl<C> Todo<C> {
50− /// Construct a new `Todo` with the given identifier and title.
51− pub fn new<S: Into<String>>(id: usize, title: S) -> Self {
52− let title = title.into();
53− let completed = false;
54− let edits = None;
55− Todo {
56− inner: Cached::new(TodoInner {
57− id,
58− title,
59− completed,
60− edits,
61− _controller: PhantomData,
62− }),
63− }
64− }
65−
66− /// Set this todo item's id.
67− pub fn set_id(&mut self, id: usize) {
68− if id != self.inner.id {
69− Cached::invalidate(&self.inner);
70− }
71− self.inner.id = id;
72− }
73−
74− /// Is this `Todo` complete?
75− pub fn is_complete(&self) -> bool {
76− self.inner.completed
77− }
78−
79− /// Mark the `Todo` as complete or not.
80− pub fn set_complete(&mut self, to: bool) {
81− if to != self.inner.completed {
82− Cached::invalidate(&self.inner);
83− }
84− self.inner.completed = to;
85− }
86−
87− /// Get this todo's title.
88− pub fn title(&self) -> &str {
89− &self.inner.title
90− }
91−
92− /// Set this todo item's title.
93− pub fn set_title<S: Into<String>>(&mut self, title: S) {
94− let title = title.into();
95− if title != self.inner.title {
96− Cached::invalidate(&self.inner);
97− }
98− self.inner.title = title;
99− }
100−
101− /// Set the edits for this todo.
102− pub fn set_edits<S: Into<String>>(&mut self, edits: Option<S>) {
103− let edits = edits.map(Into::into);
104− if edits != self.inner.edits {
105− Cached::invalidate(&self.inner);
106− }
107− self.inner.edits = edits;
108− }
109−
110− /// Take this todo's edits, leaving `None` in their place.
111− pub fn take_edits(&mut self) -> Option<String> {
112− if self.inner.edits.is_some() {
113− Cached::invalidate(&self.inner);
114− }
115− self.inner.edits.take()
116− }
117−}
118−
119−impl<'a, C: TodoActions> Render<'a> for Todo<C> {
120− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
121− use dodrio::{
122− builder::*,
123− bumpalo::{self, collections::String},
124− };
125−
126− let id = self.inner.id;
127− let title = self.inner.edits.as_ref().unwrap_or(&self.inner.title);
128− let title = bumpalo::format!(in cx.bump, "{}", title).into_bump_str();
129−
130− li(&cx)
131− .attr("class", {
132− let mut class = String::new_in(cx.bump);
133− if self.inner.completed {
134− class.push_str("completed ");
135− }
136− if self.inner.edits.is_some() {
137− class.push_str("editing");
138− }
139− class.into_bump_str()
140− })
141− .children([
142− div(&cx)
143− .attr("class", "view")
144− .children([
145− input(&cx)
146− .attr("class", "toggle")
147− .attr("type", "checkbox")
148− .bool_attr("checked", self.inner.completed)
149− .on("click", move |root, vdom, _event| {
150− C::toggle_completed(root, vdom, id);
151− })
152− .finish(),
153− label(&cx)
154− .on("dblclick", move |root, vdom, _event| {
155− C::begin_editing(root, vdom, id);
156− })
157− .children([text(title)])
158− .finish(),
159− button(&cx)
160− .attr("class", "destroy")
161− .on("click", move |root, vdom, _event| {
162− C::delete(root, vdom, id);
163− })
164− .finish(),
165− ])
166− .finish(),
167− input(&cx)
168− .attr("class", "edit")
169− .attr("value", title)
170− .attr("name", "title")
171− .attr(
172− "id",
173− bumpalo::format!(in cx.bump, "todo-{}", id).into_bump_str(),
174− )
175− .on("input", move |root, vdom, event| {
176− let input = event
177− .target()
178− .unwrap_throw()
179− .unchecked_into::<web_sys::HtmlInputElement>();
180− C::update_edits(root, vdom, id, input.value());
181− })
182− .on("blur", move |root, vdom, _event| {
183− C::finish_edits(root, vdom, id);
184− })
185− .on("keydown", move |root, vdom, event| {
186− let event = event.unchecked_into::<web_sys::KeyboardEvent>();
187− match event.key_code() {
188− keys::ENTER => C::finish_edits(root, vdom, id),
189− keys::ESCAPE => C::cancel_edits(root, vdom, id),
190− _ => {}
191− }
192− })
193− .finish(),
194− ])
195− .finish()
196− }
197−}
198−
199−impl<C> Default for TodoInner<C> {
200− fn default() -> Self {
201− TodoInner {
202− id: Default::default(),
203− title: Default::default(),
204− completed: Default::default(),
205− edits: Default::default(),
206− _controller: PhantomData,
207− }
208− }
209−}
210−
211−impl<C> serde::Serialize for Todo<C> {
212− fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
213− where
214− S: serde::Serializer,
215− {
216− self.inner.serialize(serializer)
217− }
218−}
219−
220−impl<'de, C> Deserialize<'de> for Todo<C> {
221− fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
222− where
223− D: serde::Deserializer<'de>,
224− {
225− Ok(Todo {
226− inner: <Cached<TodoInner<C>>>::deserialize(deserializer)?,
227− })
228− }
229−}
examples/todomvc/src/todos.rsdeleted−300
@@ -1,300 +0,0 @@
1−//! Type definitions and `dodrio::Render` implementation for a collection of
2−//! todo items.
3−
4−use crate::controller::Controller;
5−use crate::todo::{Todo, TodoActions};
6−use crate::visibility::Visibility;
7−use crate::{keys, utils};
8−use dodrio::{bumpalo, Node, Render, RenderContext, RootRender, VdomWeak};
9−use serde::{Deserialize, Serialize};
10−use std::marker::PhantomData;
11−use std::mem;
12−use wasm_bindgen::{prelude::*, JsCast};
13−
14−/// A collection of todos.
15−#[derive(Default, Serialize, Deserialize)]
16−#[serde(rename = "todos-dodrio", bound = "")]
17−pub struct Todos<C = Controller> {
18− todos: Vec<Todo<C>>,
19−
20− #[serde(skip)]
21− draft: String,
22−
23− #[serde(skip)]
24− visibility: Visibility,
25−
26− #[serde(skip)]
27− _controller: PhantomData<C>,
28−}
29−
30−/// Actions for `Todos` that can be triggered by UI interactions.
31−pub trait TodosActions: 'static + TodoActions {
32− /// Toggle the completion state of all todo items.
33− fn toggle_all(root: &mut dyn RootRender, vdom: VdomWeak);
34−
35− /// Update the draft todo item's text.
36− fn update_draft(root: &mut dyn RootRender, vdom: VdomWeak, draft: String);
37−
38− /// Finish the current draft todo item and add it to the collection of
39− /// todos.
40− fn finish_draft(root: &mut dyn RootRender, vdom: VdomWeak);
41−
42− /// Change the todo item visibility filtering to the given `Visibility`.
43− fn change_visibility(root: &mut dyn RootRender, vdom: VdomWeak, vis: Visibility);
44−
45− /// Delete all completed todo items.
46− fn delete_completed(root: &mut dyn RootRender, vdom: VdomWeak);
47−}
48−
49−impl<C> Todos<C> {
50− /// Construct a new todos set.
51− ///
52− /// If an existing set is available in local storage, then use that,
53− /// otherwise create a new set.
54− pub fn new() -> Self
55− where
56− C: Default,
57− {
58− Self::from_local_storage().unwrap_or_default()
59− }
60−
61− /// Deserialize a set of todos from local storage.
62− pub fn from_local_storage() -> Option<Self> {
63− utils::local_storage()
64− .get("todomvc-dodrio")
65− .ok()
66− .and_then(|opt| opt)
67− .and_then(|json| serde_json::from_str(&json).ok())
68− }
69−
70− /// Serialize this set of todos to local storage.
71− pub fn save_to_local_storage(&self) {
72− let serialized = serde_json::to_string(self).unwrap_throw();
73− utils::local_storage()
74− .set("todomvc-dodrio", &serialized)
75− .unwrap_throw();
76− }
77−
78− /// Add a new todo item to this collection.
79− pub fn add_todo(&mut self, todo: Todo<C>) {
80− self.todos.push(todo);
81− }
82−
83− /// Delete the todo with the given id.
84− pub fn delete_todo(&mut self, id: usize) {
85− self.todos.remove(id);
86− self.fix_ids();
87− }
88−
89− /// Delete all completed todo items.
90− pub fn delete_completed(&mut self) {
91− self.todos.retain(|t| !t.is_complete());
92− self.fix_ids();
93− }
94−
95− // Fix all todo identifiers so that they match their index once again.
96− fn fix_ids(&mut self) {
97− for (id, todo) in self.todos.iter_mut().enumerate() {
98− todo.set_id(id);
99− }
100− }
101−
102− /// Get a shared slice of the underlying set of todo items.
103− pub fn todos(&self) -> &[Todo<C>] {
104− &self.todos
105− }
106−
107− /// Get an exclusive slice of the underlying set of todo items.
108− pub fn todos_mut(&mut self) -> &mut [Todo<C>] {
109− &mut self.todos
110− }
111−
112− /// Set the draft todo item text.
113− pub fn set_draft<S: Into<String>>(&mut self, draft: S) {
114− self.draft = draft.into();
115− }
116−
117− /// Take the current draft text and replace it with an empty string.
118− pub fn take_draft(&mut self) -> String {
119− mem::replace(&mut self.draft, String::new())
120− }
121−
122− /// Get the current visibility for these todos.
123− pub fn visibility(&self) -> Visibility {
124− self.visibility
125− }
126−
127− /// Set the visibility for these todoS.
128− pub fn set_visibility(&mut self, vis: Visibility) {
129− self.visibility = vis;
130− }
131−}
132−
133−/// Rendering helpers.
134−impl<C: TodosActions> Todos<C> {
135− fn header<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
136− use dodrio::builder::*;
137−
138− header(&cx)
139− .attr("class", "header")
140− .children([
141− h1(&cx).children([text("todos")]).finish(),
142− input(&cx)
143− .on("input", |root, vdom, event| {
144− let input = event
145− .target()
146− .unwrap_throw()
147− .unchecked_into::<web_sys::HtmlInputElement>();
148− C::update_draft(root, vdom, input.value());
149− })
150− .on("keydown", |root, vdom, event| {
151− let event = event.unchecked_into::<web_sys::KeyboardEvent>();
152− if event.key_code() == keys::ENTER {
153− C::finish_draft(root, vdom);
154− }
155− })
156− .attr("class", "new-todo")
157− .attr("placeholder", "What needs to be done?")
158− .attr("autofocus", "")
159− .attr(
160− "value",
161− bumpalo::format!(in cx.bump, "{}", self.draft).into_bump_str(),
162− )
163− .finish(),
164− ])
165− .finish()
166− }
167−
168− fn todos_list<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
169− use dodrio::{builder::*, bumpalo::collections::Vec};
170−
171− let mut todos = Vec::with_capacity_in(self.todos.len(), cx.bump);
172− todos.extend(
173− self.todos
174− .iter()
175− .filter(|t| match self.visibility {
176− Visibility::All => true,
177− Visibility::Active => !t.is_complete(),
178− Visibility::Completed => t.is_complete(),
179− })
180− .map(|t| t.render(cx)),
181− );
182−
183− section(&cx)
184− .attr("class", "main")
185− .attr(
186− "visibility",
187− if self.todos.is_empty() {
188− "hidden"
189− } else {
190− "visible"
191− },
192− )
193− .children([
194− input(&cx)
195− .attr("class", "toggle-all")
196− .attr("id", "toggle-all")
197− .attr("type", "checkbox")
198− .attr("name", "toggle")
199− .bool_attr("checked", self.todos.iter().all(|t| t.is_complete()))
200− .on("click", |root, vdom, _event| {
201− C::toggle_all(root, vdom);
202− })
203− .finish(),
204− label(&cx)
205− .attr("for", "toggle-all")
206− .children([text("Mark all as complete")])
207− .finish(),
208− ul(&cx).attr("class", "todo-list").children(todos).finish(),
209− ])
210− .finish()
211− }
212−
213− fn footer<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
214− use dodrio::builder::*;
215−
216− let completed_count = self.todos.iter().filter(|t| t.is_complete()).count();
217− let incomplete_count = self.todos.len() - completed_count;
218− let items_left = if incomplete_count == 1 {
219− " item left"
220− } else {
221− " items left"
222− };
223− let incomplete_count = bumpalo::format!(in cx.bump, "{}", incomplete_count);
224−
225− let clear_completed_text = bumpalo::format!(
226− in cx.bump,
227− "Clear completed ({})",
228− self.todos.iter().filter(|t| t.is_complete()).count()
229− );
230−
231− footer(&cx)
232− .attr("class", "footer")
233− .bool_attr("hidden", self.todos.is_empty())
234− .children([
235− span(&cx)
236− .attr("class", "todo-count")
237− .children([
238− strong(&cx)
239− .children([text(incomplete_count.into_bump_str())])
240− .finish(),
241− text(items_left),
242− ])
243− .finish(),
244− ul(&cx)
245− .attr("class", "filters")
246− .children([
247− self.visibility_swap(cx, "#/", Visibility::All),
248− self.visibility_swap(cx, "#/active", Visibility::Active),
249− self.visibility_swap(cx, "#/completed", Visibility::Completed),
250− ])
251− .finish(),
252− button(&cx)
253− .on("click", |root, vdom, _event| {
254− C::delete_completed(root, vdom);
255− })
256− .attr("class", "clear-completed")
257− .bool_attr("hidden", completed_count == 0)
258− .children([text(clear_completed_text.into_bump_str())])
259− .finish(),
260− ])
261− .finish()
262− }
263−
264− fn visibility_swap<'a>(
265− &self,
266− cx: &mut RenderContext<'a>,
267− url: &'static str,
268− target_vis: Visibility,
269− ) -> Node<'a> {
270− use dodrio::builder::*;
271−
272− li(&cx)
273− .on("click", move |root, vdom, _event| {
274− C::change_visibility(root, vdom, target_vis);
275− })
276− .children([a(&cx)
277− .attr("href", url)
278− .attr(
279− "class",
280− if self.visibility == target_vis {
281− "selected"
282− } else {
283− ""
284− },
285− )
286− .children([text(target_vis.label())])
287− .finish()])
288− .finish()
289− }
290−}
291−
292−impl<'a, C: TodosActions> Render<'a> for Todos<C> {
293− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
294− use dodrio::builder::*;
295−
296− div(&cx)
297− .children([self.header(cx), self.todos_list(cx), self.footer(cx)])
298− .finish()
299− }
300−}
examples/todomvc/src/utils.rsdeleted−32
@@ -1,32 +0,0 @@
1−//! Small utility functions.
2−
3−use wasm_bindgen::UnwrapThrowExt;
4−
5−/// Get the top-level window.
6−pub fn window() -> web_sys::Window {
7− web_sys::window().unwrap_throw()
8−}
9−
10−/// Get the current location hash, if any.
11−pub fn hash() -> Option<String> {
12− window()
13− .location()
14− .hash()
15− .ok()
16− .and_then(|h| if h.is_empty() { None } else { Some(h) })
17−}
18−
19−/// Set the current location hash.
20−pub fn set_hash(hash: &str) {
21− window().location().set_hash(hash).unwrap_throw();
22−}
23−
24−/// Get the top-level document.
25−pub fn document() -> web_sys::Document {
26− window().document().unwrap_throw()
27−}
28−
29−/// Get the top-level window's local storage.
30−pub fn local_storage() -> web_sys::Storage {
31− window().local_storage().unwrap_throw().unwrap_throw()
32−}
examples/todomvc/src/visibility.rsdeleted−51
@@ -1,51 +0,0 @@
1−//! Visibility filtering.
2−
3−use std::fmt;
4−use std::str::FromStr;
5−
6−/// The visibility filtering for todo items.
7−#[derive(Clone, Copy, Eq, PartialEq)]
8−pub enum Visibility {
9− /// Show all todos.
10− All,
11− /// Show only active, incomplete todos.
12− Active,
13− /// Show only inactive, completed todos.
14− Completed,
15−}
16−
17−impl Default for Visibility {
18− fn default() -> Visibility {
19− Visibility::All
20− }
21−}
22−
23−impl FromStr for Visibility {
24− type Err = ();
25−
26− fn from_str(s: &str) -> Result<Self, Self::Err> {
27− match s {
28− "all" => Ok(Visibility::All),
29− "active" => Ok(Visibility::Active),
30− "completed" => Ok(Visibility::Completed),
31− _ => Err(()),
32− }
33− }
34−}
35−
36−impl fmt::Display for Visibility {
37− fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
38− write!(f, "{}", self.label().to_lowercase())
39− }
40−}
41−
42−impl Visibility {
43− /// Get a string label for this visibility.
44− pub fn label(self) -> &'static str {
45− match self {
46− Visibility::All => "All",
47− Visibility::Active => "Active",
48− Visibility::Completed => "Completed",
49− }
50− }
51−}
js/change-list-interpreter.jsdeleted−377
@@ -1,377 +0,0 @@
1−const decoder = new TextDecoder();
2−
3−function top(stack) {
4− return stack[stack.length - 1];
5−}
6−
7−function string(mem, pointer, length) {
8− const buf = mem.subarray(pointer, pointer + length);
9− return decoder.decode(buf);
10−}
11−
12−const OP_TABLE = [
13− // 0
14− function setText(interpreter, mem8, mem32, i) {
15− const pointer = mem32[i++];
16− const length = mem32[i++];
17− const str = string(mem8, pointer, length);
18− top(interpreter.stack).textContent = str;
19− return i;
20− },
21−
22− // 1
23− function removeSelfAndNextSiblings(interpreter, mem8, mem32, i) {
24− const node = interpreter.stack.pop();
25− let sibling = node.nextSibling;
26− while (sibling) {
27− const temp = sibling.nextSibling;
28− sibling.remove();
29− sibling = temp;
30− }
31− node.remove();
32− return i;
33− },
34−
35− // 2
36− function replaceWith(interpreter, mem8, mem32, i) {
37− const newNode = interpreter.stack.pop();
38− const oldNode = interpreter.stack.pop();
39− oldNode.replaceWith(newNode);
40− interpreter.stack.push(newNode);
41− return i;
42− },
43−
44− // 3
45− function setAttribute(interpreter, mem8, mem32, i) {
46− const nameId = mem32[i++];
47− const valueId = mem32[i++];
48− const name = interpreter.getCachedString(nameId);
49− const value = interpreter.getCachedString(valueId);
50− const node = top(interpreter.stack);
51− node.setAttribute(name, value);
52−
53− // Some attributes are "volatile" and don't work through `setAttribute`.
54− if (name === "value") {
55− node.value = value;
56− }
57− if (name === "checked") {
58− node.checked = true;
59− }
60− if (name === "selected") {
61− node.selected = true;
62− }
63−
64− return i;
65− },
66−
67− // 4
68− function removeAttribute(interpreter, mem8, mem32, i) {
69− const nameId = mem32[i++];
70− const name = interpreter.getCachedString(nameId);
71− const node = top(interpreter.stack);
72− node.removeAttribute(name);
73−
74− // Some attributes are "volatile" and don't work through `removeAttribute`.
75− if (name === "value") {
76− node.value = null;
77− }
78− if (name === "checked") {
79− node.checked = false;
80− }
81− if (name === "selected") {
82− node.selected = false;
83− }
84−
85− return i;
86− },
87−
88− // 5
89− function pushReverseChild(interpreter, mem8, mem32, i) {
90− const n = mem32[i++];
91− const parent = top(interpreter.stack);
92− const children = parent.childNodes;
93− const child = children[children.length - n - 1];
94− interpreter.stack.push(child);
95− return i;
96− },
97−
98− // 6
99− function popPushChild(interpreter, mem8, mem32, i) {
100− const n = mem32[i++];
101− interpreter.stack.pop();
102− const parent = top(interpreter.stack);
103− const children = parent.childNodes;
104− const child = children[n];
105− interpreter.stack.push(child);
106− return i;
107− },
108−
109− // 7
110− function pop(interpreter, mem8, mem32, i) {
111− interpreter.stack.pop();
112− return i;
113− },
114−
115− // 8
116− function appendChild(interpreter, mem8, mem32, i) {
117− const child = interpreter.stack.pop();
118− top(interpreter.stack).appendChild(child);
119− return i;
120− },
121−
122− // 9
123− function createTextNode(interpreter, mem8, mem32, i) {
124− const pointer = mem32[i++];
125− const length = mem32[i++];
126− const text = string(mem8, pointer, length);
127− interpreter.stack.push(document.createTextNode(text));
128− return i;
129− },
130−
131− // 10
132− function createElement(interpreter, mem8, mem32, i) {
133− const tagNameId = mem32[i++];
134− const tagName = interpreter.getCachedString(tagNameId);
135− interpreter.stack.push(document.createElement(tagName));
136− return i;
137− },
138−
139− // 11
140− function newEventListener(interpreter, mem8, mem32, i) {
141− const eventId = mem32[i++];
142− const eventType = interpreter.getCachedString(eventId);
143− const a = mem32[i++];
144− const b = mem32[i++];
145− const el = top(interpreter.stack);
146− el.addEventListener(eventType, interpreter.eventHandler);
147− el[`dodrio-a-${eventType}`] = a;
148− el[`dodrio-b-${eventType}`] = b;
149− return i;
150− },
151−
152− // 12
153− function updateEventListener(interpreter, mem8, mem32, i) {
154− const eventId = mem32[i++];
155− const eventType = interpreter.getCachedString(eventId);
156− const el = top(interpreter.stack);
157− el[`dodrio-a-${eventType}`] = mem32[i++];
158− el[`dodrio-b-${eventType}`] = mem32[i++];
159− return i;
160− },
161−
162− // 13
163− function removeEventListener(interpreter, mem8, mem32, i) {
164− const eventId = mem32[i++];
165− const eventType = interpreter.getCachedString(eventId);
166− const el = top(interpreter.stack);
167− el.removeEventListener(eventType, interpreter.eventHandler);
168− return i;
169− },
170−
171− // 14
172− function addCachedString(interpreter, mem8, mem32, i) {
173− const pointer = mem32[i++];
174− const length = mem32[i++];
175− const id = mem32[i++];
176− const str = string(mem8, pointer, length);
177− interpreter.addCachedString(str, id);
178− return i;
179− },
180−
181− // 15
182− function dropCachedString(interpreter, mem8, mem32, i) {
183− const id = mem32[i++];
184− interpreter.dropCachedString(id);
185− return i;
186− },
187−
188− // 16
189− function createElementNS(interpreter, mem8, mem32, i) {
190− const tagNameId = mem32[i++];
191− const tagName = interpreter.getCachedString(tagNameId);
192− const nsId = mem32[i++];
193− const ns = interpreter.getCachedString(nsId);
194− interpreter.stack.push(document.createElementNS(ns, tagName));
195− return i;
196− },
197−
198− // 17
199− function saveChildrenToTemporaries(interpreter, mem8, mem32, i) {
200− let temp = mem32[i++];
201− const start = mem32[i++];
202− const end = mem32[i++];
203− const parent = top(interpreter.stack);
204− const children = parent.childNodes;
205− for (let i = start; i < end; i++) {
206− interpreter.temporaries[temp++] = children[i];
207− }
208− return i;
209− },
210−
211− // 18
212− function pushChild(interpreter, mem8, mem32, i) {
213− const parent = top(interpreter.stack);
214− const n = mem32[i++];
215− const child = parent.childNodes[n];
216− interpreter.stack.push(child);
217− return i;
218− },
219−
220− // 19
221− function pushTemporary(interpreter, mem8, mem32, i) {
222− const temp = mem32[i++];
223− interpreter.stack.push(interpreter.temporaries[temp]);
224− return i;
225− },
226−
227− // 20
228− function insertBefore(interpreter, mem8, mem32, i) {
229− const before = interpreter.stack.pop();
230− const after = interpreter.stack.pop();
231− after.parentNode.insertBefore(before, after);
232− interpreter.stack.push(before);
233− return i;
234− },
235−
236− // 21
237− function popPushReverseChild(interpreter, mem8, mem32, i) {
238− const n = mem32[i++];
239− interpreter.stack.pop();
240− const parent = top(interpreter.stack);
241− const children = parent.childNodes;
242− const child = children[children.length - n - 1];
243− interpreter.stack.push(child);
244− return i;
245− },
246−
247− // 22
248− function removeChild(interpreter, mem8, mem32, i) {
249− const n = mem32[i++];
250− const parent = top(interpreter.stack);
251− const child = parent.childNodes[n];
252− child.remove();
253− return i;
254− },
255−
256− // 23
257− function setClass(interpreter, mem8, mem32, i) {
258− const classId = mem32[i++];
259− const className = interpreter.getCachedString(classId);
260− top(interpreter.stack).className = className;
261− return i;
262− },
263−
264− // 24
265− function saveTemplate(interpreter, mem8, mem32, i) {
266− const id = mem32[i++];
267− const template = top(interpreter.stack);
268− interpreter.saveTemplate(id, template.cloneNode(true));
269− return i;
270− },
271−
272− // 25
273− function pushTemplate(interpreter, mem8, mem32, i) {
274− const id = mem32[i++];
275− const template = interpreter.getTemplate(id);
276− interpreter.stack.push(template.cloneNode(true));
277− return i;
278− }
279−];
280−
281−export class ChangeListInterpreter {
282− constructor(container) {
283− this.trampoline = null;
284− this.container = container;
285− this.ranges = [];
286− this.stack = [];
287− this.strings = new Map();
288− this.temporaries = [];
289− this.templates = new Map();
290− }
291−
292− unmount() {
293− this.trampoline.mounted = false;
294−
295− // Null out all of our properties just to ensure that if we mistakenly ever
296− // call a method on this instance again, it will throw.
297− this.trampoline = null;
298− this.container = null;
299− this.ranges = null;
300− this.stack = null;
301− this.strings = null;
302− this.temporaries = null;
303− this.templates = null;
304− }
305−
306− addChangeListRange(start, len) {
307− this.ranges.push(start);
308− this.ranges.push(len);
309− }
310−
311− applyChanges(memory) {
312− if (this.ranges.length == 0) {
313− return;
314− }
315−
316− this.stack.push(this.container.firstChild);
317− const mem8 = new Uint8Array(memory.buffer);
318− const mem32 = new Uint32Array(memory.buffer);
319−
320− for (let i = 0; i < this.ranges.length; i += 2) {
321− const start = this.ranges[i];
322− const len = this.ranges[i + 1];
323− this.applyChangeRange(mem8, mem32, start, len);
324− }
325−
326− this.ranges.length = 0;
327− this.stack.length = 0;
328− this.temporaries.length = 0;
329− }
330−
331− applyChangeRange(mem8, mem32, start, len) {
332− const end = (start + len) / 4;
333− for (let i = start / 4; i < end; ) {
334− const op = mem32[i++];
335− i = OP_TABLE[op](this, mem8, mem32, i);
336− }
337− }
338−
339− addCachedString(str, id) {
340− this.strings.set(id, str);
341− }
342−
343− dropCachedString(id) {
344− this.strings.delete(id);
345− }
346−
347− getCachedString(id) {
348− return this.strings.get(id);
349− }
350−
351− saveTemplate(id, template) {
352− this.templates.set(id, template);
353− }
354−
355− getTemplate(id) {
356− return this.templates.get(id);
357− }
358−
359− initEventsTrampoline(trampoline) {
360− this.trampoline = trampoline;
361− trampoline.mounted = true;
362− this.eventHandler = function(event) {
363− if (!trampoline.mounted) {
364− throw new Error("invocation of listener after VDOM has been unmounted");
365− }
366−
367− // `this` always refers to the element the handler was added to.
368− // Since we're adding the handler to all elements our content wants
369− // to listen for events on, this ensures that we always get the right
370− // values for `a` and `b`.
371− const type = event.type;
372− const a = this[`dodrio-a-${type}`];
373− const b = this[`dodrio-b-${type}`];
374− trampoline(event, a, b);
375− }
376− }
377−}
js/change-list.jsnew file+180
@@ -0,0 +1,180 @@
1+const decoder = new TextDecoder();
2+
3+function top(stack) {
4+ return stack[stack.length - 1];
5+}
6+
7+function string(mem, pointer, length) {
8+ const buf = mem.subarray(pointer, pointer + length);
9+ return decoder.decode(buf);
10+}
11+
12+const OP_TABLE = [
13+ // 0
14+ function setText(stack, mem8, mem32, i) {
15+ console.log("setText");
16+ const pointer = mem32[i++];
17+ const length = mem32[i++];
18+ const str = string(mem8, pointer, length);
19+ console.log(" str =", str);
20+ console.log(" top(stack) =", top(stack));
21+ top(stack).textContent = str;
22+ return i;
23+ },
24+
25+ // 1
26+ function removeSelfAndNextSiblings(stack, mem8, mem32, i) {
27+ console.log("removeSelfAndNextSiblings");
28+ const node = stack.pop();
29+ console.log(" top(stack) =", node);
30+ let sibling = node.nextSibling;
31+ while (sibling) {
32+ const temp = sibling.nextSibling;
33+ sibling.remove();
34+ sibling = temp;
35+ }
36+ node.remove();
37+ return i;
38+ },
39+
40+ // 2
41+ function replaceWith(stack, mem8, mem32, i) {
42+ console.log("replaceWith");
43+ const newNode = stack.pop();
44+ console.log(" newNode =", newNode);
45+ const oldNode = stack.pop();
46+ console.log(" oldNode =", oldNode);
47+ oldNode.replaceWith(newNode);
48+ stack.push(newNode);
49+ return i;
50+ },
51+
52+ // 3
53+ function setAttribute(stack, mem8, mem32, i) {
54+ console.log("setAttribute");
55+ const pointer1 = mem32[i++];
56+ const length1 = mem32[i++];
57+ const name = string(mem8, pointer1, length1);
58+ console.log(" name =", name);
59+ const pointer2 = mem32[i++];
60+ const length2 = mem32[i++];
61+ const value = string(mem8, pointer2, length2);
62+ console.log(" value =", value);
63+ console.log(" top(stack) =", top(stack));
64+ top(stack).setAttribute(name, value);
65+ return i;
66+ },
67+
68+ // 4
69+ function removeAttribute(stack, mem8, mem32, i) {
70+ console.log("removeAttribute");
71+ const pointer = mem32[i++];
72+ const length = mem32[i++];
73+ const name = string(mem8, pointer, length);
74+ console.log(" name =", name);
75+ top(stack).removeAttribute(name);
76+ return i;
77+ },
78+
79+ // 5
80+ function pushFirstChild(stack, mem8, mem32, i) {
81+ console.log("pushFirstChild");
82+ console.log(" top(stack) =", top(stack));
83+ stack.push(top(stack).firstChild);
84+ return i;
85+ },
86+
87+ // 6
88+ function popPushNextSibling(stack, mem8, mem32, i) {
89+ console.log("popPushNextSibling");
90+ console.log(" top(stack) =", top(stack));
91+ const node = stack.pop();
92+ stack.push(node.nextSibling);
93+ return i;
94+ },
95+
96+ // 7
97+ function pop(stack, mem8, mem32, i) {
98+ console.log("pop");
99+ console.log(" top(stack) =", top(stack));
100+ stack.pop();
101+ return i;
102+ },
103+
104+ // 8
105+ function appendChild(stack, mem8, mem32, i) {
106+ console.log("appendChild");
107+ console.log(" top(stack) =", top(stack));
108+ const child = stack.pop();
109+ top(stack).appendChild(child);
110+ return i;
111+ },
112+
113+ // 9
114+ function createTextNode(stack, mem8, mem32, i) {
115+ console.log("appendChild");
116+ const pointer = mem32[i++];
117+ const length = mem32[i++];
118+ const text = string(mem8, pointer, length);
119+ console.log(" text =", text);
120+ console.log(" top(stack) =", top(stack));
121+ stack.push(document.createTextNode(text));
122+ return i;
123+ },
124+
125+ // 10
126+ function createElement(stack, mem8, mem32, i) {
127+ console.log("createElement");
128+ const pointer = mem32[i++];
129+ const length = mem32[i++];
130+ const tagName = string(mem8, pointer, length);
131+ console.log(" tagName =", tagName);
132+ console.log(" top(stack) =", top(stack));
133+ stack.push(document.createElement(tagName));
134+ return i;
135+ }
136+];
137+
138+export class ChangeList {
139+ constructor(container) {
140+ this.container = container;
141+ this.ranges = [];
142+ this.stack = [];
143+ }
144+
145+ addChangeListRange(start, len) {
146+ this.ranges.push(start);
147+ this.ranges.push(len);
148+ }
149+
150+ applyChanges(memory) {
151+ console.log("======== ChangeList.prototype.applyChanges ==============================");
152+ if (this.ranges.length == 0) {
153+ return;
154+ }
155+
156+ this.stack.push(this.container.firstChild);
157+ const mem8 = new Uint8Array(memory.buffer);
158+ const mem32 = new Uint32Array(memory.buffer);
159+
160+ for (let i = 0; i < this.ranges.length; i += 2) {
161+ const start = this.ranges[i];
162+ const len = this.ranges[i + 1];
163+ this.applyChangeRange(mem8, mem32, start, len);
164+ }
165+
166+ this.ranges.length = 0;
167+ this.stack.length = 0;
168+ }
169+
170+ applyChangeRange(mem8, mem32, start, len) {
171+ const end = (start + len) / 4;
172+ for (let i = start / 4; i < end; ) {
173+ const op = mem32[i++];
174+ console.log();
175+ console.log(OP_TABLE[op].name);
176+ console.log(this.stack);
177+ i = OP_TABLE[op](this.stack, mem8, mem32, i);
178+ }
179+ }
180+}
js/package-lock.jsonnew file+5
@@ -0,0 +1,5 @@
1+{
2+ "name": "dodrio",
3+ "version": "0.1.0",
4+ "lockfileVersion": 1
5+}
js/package.jsonnew file+11
@@ -0,0 +1,11 @@
1+{
2+ "name": "dodrio",
3+ "version": "0.1.0",
4+ "description": "Dodrio",
5+ "main": "dodrio.js",
6+ "scripts": {
7+ "test": "echo \"Error: no test specified\" && exit 1"
8+ },
9+ "author": "Nick Fitzgerald <fitzgen@gmail.com>",
10+ "license": "MPL-2.0"
11+}
js/strace.jsdeleted−80
@@ -1,80 +0,0 @@
1−export function initStrace() {
2− instrumentAll(Element.prototype);
3− instrumentAll(Document.prototype);
4− instrumentAll(Node.prototype);
5− instrumentAll(EventTarget.prototype);
6−}
7−
8−const counts = new Map;
9−counts.total = 0;
10−
11−let timer = null;
12−
13−function log(ctorName, kind, key) {
14− counts.total += 1;
15−
16− const entry = `${kind} ${ctorName}#${key}`
17− const count = counts.get(entry);
18− if (count === undefined) {
19− counts.set(entry, 1);
20− } else {
21− counts.set(entry, count + 1);
22− }
23−
24− if (timer !== null) {
25− clearTimeout(timer);
26− }
27− timer = setTimeout(dumpAndReset, 100);
28−}
29−
30−function dumpAndReset() {
31− const data = [...counts]
32− .sort((a, b) => b[1] - a[1])
33− .map(a => ({ "DOM Method": a[0], "Count": a[1] }));
34−
35− data.push({ "DOM Method": "<total>", "Count": counts.total });
36−
37− console.table(data, ["DOM Method", "Count"]);
38−
39− counts.clear();
40− counts.total = 0;
41−}
42−
43−function instrument(proto, key, desc) {
44− const ctorName = proto.constructor.name;
45−
46− if (typeof desc.value == "function") {
47− const f = desc.value;
48− desc.value = function (...args) {
49− log(ctorName, "call", key);
50− return f.apply(this, args);
51− };
52− }
53−
54− if (typeof desc.get == "function") {
55− const get = desc.get;
56− desc.get = function (...args) {
57− log(ctorName, "get", key);
58− return get.apply(this, args);
59− };
60− }
61−
62− if (typeof desc.set == "function") {
63− const set = desc.set;
64− desc.set = function (...args) {
65− log(ctorName, "set", key);
66− return set.apply(this, args);
67− };
68− }
69−
70− Object.defineProperty(proto, key, desc);
71−}
72−
73−function instrumentAll(proto) {
74− for (const key of Object.keys(proto)) {
75− const desc = Object.getOwnPropertyDescriptor(proto, key);
76− if (desc.configurable) {
77− instrument(proto, key, desc);
78− }
79− }
80−}
publish.shdeleted−11
@@ -1,11 +0,0 @@
1−#!/usr/bin/env bash
2−
3−set -ex
4−
5−cd "$(dirname "$0")"
6−
7−cd crates/js-api
8−cargo publish --no-verify $PUBLISH_FLAGS
9−cd ../..
10−
11−cargo publish $PUBLISH_FLAGS
src/builder.rsdeleted−1075
@@ -1,1075 +0,0 @@
1−//! Helpers for building virtual DOM nodes.
2−
3−use crate::{node::NodeKey, Attribute, Listener, Node, RootRender, VdomWeak};
4−use bumpalo::Bump;
5−
6−/// A virtual DOM element builder.
7−///
8−/// Typically constructed with element-specific constructors, eg the `div`
9−/// function for building `<div>` elements or the `button` function for building
10−/// `<button>` elements.
11−#[derive(Clone, Debug)]
12−pub struct ElementBuilder<'a, Listeners, Attributes, Children>
13−where
14− Listeners: 'a + AsRef<[Listener<'a>]>,
15− Attributes: 'a + AsRef<[Attribute<'a>]>,
16− Children: 'a + AsRef<[Node<'a>]>,
17−{
18− bump: &'a Bump,
19− key: NodeKey,
20− tag_name: &'a str,
21− listeners: Listeners,
22− attributes: Attributes,
23− children: Children,
24− namespace: Option<&'a str>,
25−}
26−
27−impl<'a>
28− ElementBuilder<
29− 'a,
30− bumpalo::collections::Vec<'a, Listener<'a>>,
31− bumpalo::collections::Vec<'a, Attribute<'a>>,
32− bumpalo::collections::Vec<'a, Node<'a>>,
33− >
34−{
35− /// Create a new `ElementBuilder` for an element with the given tag name.
36− ///
37− /// In general, only use this constructor if the tag is dynamic (i.e. you
38− /// might build a `<div>` or you might build a `<span>` and you don't know
39− /// until runtime). Prefer using the tag-specific constructors instead:
40− /// `div(bump)` or `span(bump)`, etc.
41− ///
42− /// # Example
43− ///
44− /// ```
45− /// use dodrio::{builder::*, bumpalo::Bump};
46− ///
47− /// let b = Bump::new();
48− ///
49− /// let tag_name = if flip_coin() {
50− /// "div"
51− /// } else {
52− /// "span"
53− /// };
54− ///
55− /// let my_element_builder = ElementBuilder::new(&b, tag_name);
56− /// # fn flip_coin() -> bool { true }
57− /// ```
58− pub fn new<B>(bump: B, tag_name: &'a str) -> Self
59− where
60− B: Into<&'a Bump>,
61− {
62− let bump = bump.into();
63− ElementBuilder {
64− bump,
65− key: NodeKey::NONE,
66− tag_name,
67− listeners: bumpalo::collections::Vec::new_in(bump),
68− attributes: bumpalo::collections::Vec::new_in(bump),
69− children: bumpalo::collections::Vec::new_in(bump),
70− namespace: None,
71− }
72− }
73−}
74−
75−impl<'a, Listeners, Attributes, Children> ElementBuilder<'a, Listeners, Attributes, Children>
76−where
77− Listeners: 'a + AsRef<[Listener<'a>]>,
78− Attributes: 'a + AsRef<[Attribute<'a>]>,
79− Children: 'a + AsRef<[Node<'a>]>,
80−{
81− /// Set the listeners for this element.
82− ///
83− /// You can use this method to customize the backing storage for listeners,
84− /// for example to use a fixed-size array instead of the default
85− /// dynamically-sized `bumpalo::collections::Vec`.
86− ///
87− /// Any listeners already added to the builder will be overridden.
88− ///
89− /// # Example
90− ///
91− /// ```no_run
92− /// use dodrio::{builder::*, bumpalo::Bump};
93− ///
94− /// let b = Bump::new();
95− ///
96− /// // Create a `<div>` with a fixed-size array of two listeners.
97− /// let my_div = div(&b)
98− /// .listeners([
99− /// on(&b, "click", |root, vdom, event| {
100− /// // ...
101− /// }),
102− /// on(&b, "dblclick", |root, vdom, event| {
103− /// // ...
104− /// }),
105− /// ])
106− /// .finish();
107− /// ```
108− #[inline]
109− pub fn listeners<L>(self, listeners: L) -> ElementBuilder<'a, L, Attributes, Children>
110− where
111− L: 'a + AsRef<[Listener<'a>]>,
112− {
113− ElementBuilder {
114− bump: self.bump,
115− key: self.key,
116− tag_name: self.tag_name,
117− listeners,
118− attributes: self.attributes,
119− children: self.children,
120− namespace: self.namespace,
121− }
122− }
123−
124− /// Set the attributes for this element.
125− ///
126− /// You can use this method to customize the backing storage for attributes,
127− /// for example to use a fixed-size array instead of the default
128− /// dynamically-sized `bumpalo::collections::Vec`.
129− ///
130− /// Any attributes already added to the builder will be overridden.
131− ///
132− /// # Example
133− ///
134− /// ```no_run
135− /// use dodrio::{builder::*, bumpalo::Bump, Attribute};
136− ///
137− /// let b = Bump::new();
138− ///
139− /// // Create a `<div>` with a fixed-size array of two attributes.
140− /// let my_div = div(&b)
141− /// .attributes([
142− /// attr("id", "my-div"),
143− /// attr("class", "notification"),
144− /// ])
145− /// .finish();
146− /// ```
147− #[inline]
148− pub fn attributes<A>(self, attributes: A) -> ElementBuilder<'a, Listeners, A, Children>
149− where
150− A: 'a + AsRef<[Attribute<'a>]>,
151− {
152− ElementBuilder {
153− bump: self.bump,
154− key: self.key,
155− tag_name: self.tag_name,
156− listeners: self.listeners,
157− attributes,
158− children: self.children,
159− namespace: self.namespace,
160− }
161− }
162−
163− /// Set the children for this element.
164− ///
165− /// You can use this method to customize the backing storage for children,
166− /// for example to use a fixed-size array instead of the default
167− /// dynamically-sized `bumpalo::collections::Vec`.
168− ///
169− /// Any children already added to the builder will be overridden.
170− ///
171− /// # Example
172− ///
173− /// ```no_run
174− /// use dodrio::{builder::*, bumpalo::Bump};
175− ///
176− /// let b = Bump::new();
177− ///
178− /// // Create a `<div>` with a fixed-size array of two `<span>` children.
179− /// let my_div = div(&b)
180− /// .children([
181− /// span(&b).finish(),
182− /// span(&b).finish(),
183− /// ])
184− /// .finish();
185− /// ```
186− #[inline]
187− pub fn children<C>(self, children: C) -> ElementBuilder<'a, Listeners, Attributes, C>
188− where
189− C: 'a + AsRef<[Node<'a>]>,
190− {
191− ElementBuilder {
192− bump: self.bump,
193− key: self.key,
194− tag_name: self.tag_name,
195− listeners: self.listeners,
196− attributes: self.attributes,
197− children,
198− namespace: self.namespace,
199− }
200− }
201−
202− /// Set the namespace for this element.
203− ///
204− /// # Example
205− ///
206− /// ```no_run
207− /// use dodrio::{builder::*, bumpalo::Bump};
208− ///
209− /// let b = Bump::new();
210− ///
211− /// // Create a `<td>` tag with an xhtml namespace
212− /// let my_td = td(&b)
213− /// .namespace(Some("http://www.w3.org/1999/xhtml"))
214− /// .finish();
215− /// ```
216− #[inline]
217− pub fn namespace(self, namespace: Option<&'a str>) -> Self {
218− ElementBuilder {
219− bump: self.bump,
220− key: self.key,
221− tag_name: self.tag_name,
222− listeners: self.listeners,
223− attributes: self.attributes,
224− children: self.children,
225− namespace,
226− }
227− }
228−
229− /// Set this element's key.
230− ///
231− /// When diffing sets of siblings, if an old sibling and new sibling share a
232− /// key, then they will always reuse the same physical DOM node. This is
233− /// important when using CSS animations, web components, third party JS, or
234− /// anything else that makes the diffing implementation observable.
235− ///
236− /// Do not use keys if such a scenario does not apply. Keyed diffing is
237− /// generally more expensive than not, since it is putting greater
238− /// constraints on the diffing algorithm.
239− ///
240− /// # Invariants You Must Uphold
241− ///
242− /// The key may not be `u32::MAX`, which is a reserved key value.
243− ///
244− /// Keys must be unique among siblings.
245− ///
246− /// All sibling nodes must be keyed, or they must all not be keyed. You may
247− /// not mix keyed and unkeyed siblings.
248− ///
249− /// # Example
250− ///
251− /// ```no_run
252− /// use dodrio::{builder::*, bumpalo::Bump};
253− ///
254− /// let b = Bump::new();
255− ///
256− /// let my_li = li(&b)
257− /// .key(1337)
258− /// .finish();
259− /// ```
260− #[inline]
261− pub fn key(mut self, key: u32) -> Self {
262− use std::u32;
263− debug_assert!(key != u32::MAX);
264− self.key = NodeKey(key);
265− self
266− }
267−
268− /// Create the virtual DOM node described by this builder.
269− ///
270− /// # Example
271− ///
272− /// ```no_run
273− /// use dodrio::{builder::*, bumpalo::Bump, Node};
274− ///
275− /// let b = Bump::new();
276− ///
277− /// // Start with a builder...
278− /// let builder: ElementBuilder<_, _, _> = div(&b);
279− ///
280− /// // ...and finish it to create a virtual DOM node!
281− /// let my_div: Node = builder.finish();
282− /// ```
283− #[inline]
284− pub fn finish(self) -> Node<'a> {
285− let children: &'a Children = self.bump.alloc(self.children);
286− let children: &'a [Node<'a>] = children.as_ref();
287−
288− let listeners: &'a Listeners = self.bump.alloc(self.listeners);
289− let listeners: &'a [Listener<'a>] = listeners.as_ref();
290−
291− let attributes: &'a Attributes = self.bump.alloc(self.attributes);
292− let attributes: &'a [Attribute<'a>] = attributes.as_ref();
293−
294− Node::element(
295− self.bump,
296− self.key,
297− self.tag_name,
298− listeners,
299− attributes,
300− children,
301− self.namespace,
302− )
303− }
304−}
305−
306−impl<'a, Attributes, Children>
307− ElementBuilder<'a, bumpalo::collections::Vec<'a, Listener<'a>>, Attributes, Children>
308−where
309− Attributes: 'a + AsRef<[Attribute<'a>]>,
310− Children: 'a + AsRef<[Node<'a>]>,
311−{
312− /// Add a new event listener to this element.
313− ///
314− /// The `event` string specifies which event will be listened for. The
315− /// `callback` function is the function that will be invoked if the
316− /// specified event occurs.
317− ///
318− /// # Example
319− ///
320− /// ```no_run
321− /// use dodrio::{builder::*, bumpalo::Bump};
322− ///
323− /// let b = Bump::new();
324− ///
325− /// // A button that does something when clicked!
326− /// let my_button = button(&b)
327− /// .on("click", |root, vdom, event| {
328− /// // ...
329− /// })
330− /// .finish();
331− /// ```
332− #[inline]
333− pub fn on<F>(mut self, event: &'a str, callback: F) -> Self
334− where
335− F: 'static + Fn(&mut dyn RootRender, VdomWeak, web_sys::Event),
336− {
337− self.listeners.push(Listener {
338− event,
339− callback: self.bump.alloc(callback),
340− });
341− self
342− }
343−}
344−
345−impl<'a, Listeners, Children>
346− ElementBuilder<'a, Listeners, bumpalo::collections::Vec<'a, Attribute<'a>>, Children>
347−where
348− Listeners: 'a + AsRef<[Listener<'a>]>,
349− Children: 'a + AsRef<[Node<'a>]>,
350−{
351− /// Add a new attribute to this element.
352− ///
353− /// # Example
354− ///
355− /// ```no_run
356− /// use dodrio::{builder::*, bumpalo::Bump};
357− ///
358− /// let b = Bump::new();
359− ///
360− /// // Create the `<div id="my-div"/>` element.
361− /// let my_div = div(&b).attr("id", "my-div").finish();
362− /// ```
363− #[inline]
364− pub fn attr(mut self, name: &'a str, value: &'a str) -> Self {
365− self.attributes.push(Attribute { name, value });
366− self
367− }
368−
369− /// Conditionally add a "boolean-style" attribute to this element.
370− ///
371− /// If the `should_add` parameter is true, then adds an attribute with the
372− /// given `name` and an empty string value. If the `should_add` parameter is
373− /// false, then the attribute is not added.
374− ///
375− /// This method is useful for attributes whose semantics are defined by
376− /// whether or not the attribute is present or not, and whose value is
377− /// ignored. Example attributes like this include:
378− ///
379− /// * `checked`
380− /// * `hidden`
381− /// * `selected`
382− ///
383− /// # Example
384− ///
385− /// ```no_run
386− /// use dodrio::{builder::*, bumpalo::Bump};
387− /// use js_sys::Math;
388− ///
389− /// let b = Bump::new();
390− ///
391− /// // Create the `<div>` that is randomly hidden 50% of the time.
392− /// let my_div = div(&b)
393− /// .bool_attr("hidden", Math::random() >= 0.5)
394− /// .finish();
395− /// ```
396− pub fn bool_attr(mut self, name: &'a str, should_add: bool) -> Self {
397− if should_add {
398− self.attributes.push(Attribute { name, value: "" });
399− }
400− self
401− }
402−}
403−
404−impl<'a, Listeners, Attributes>
405− ElementBuilder<'a, Listeners, Attributes, bumpalo::collections::Vec<'a, Node<'a>>>
406−where
407− Listeners: 'a + AsRef<[Listener<'a>]>,
408− Attributes: 'a + AsRef<[Attribute<'a>]>,
409−{
410− /// Add a new child to this element.
411− ///
412− /// # Example
413− ///
414− /// ```no_run
415− /// use dodrio::{builder::*, bumpalo::Bump};
416− /// use js_sys::Math;
417− ///
418− /// let b = Bump::new();
419− ///
420− /// // Create `<p><span></span></p>`.
421− /// let my_div = p(&b)
422− /// .child(span(&b).finish())
423− /// .finish();
424− /// ```
425− #[inline]
426− pub fn child(mut self, child: Node<'a>) -> Self {
427− self.children.push(child);
428− self
429− }
430−}
431−
432−macro_rules! builder_constructors {
433− ( $(
434− $(#[$attr:meta])*
435− $name:ident;
436− )* ) => {
437− $(
438− $(#[$attr])*
439− #[inline]
440− pub fn $name<'a, B>(
441− bump: B,
442− ) -> ElementBuilder<
443− 'a,
444− bumpalo::collections::Vec<'a, Listener<'a>>,
445− bumpalo::collections::Vec<'a, Attribute<'a>>,
446− bumpalo::collections::Vec<'a, Node<'a>>,
447− >
448− where
449− B: Into<&'a Bump>
450− {
451− ElementBuilder::new(bump, stringify!($name))
452− }
453− )*
454− };
455− ( $(
456− $(#[$attr:meta])*
457− $name:ident <> $namespace:tt;
458− )* ) => {
459− $(
460− $(#[$attr])*
461− #[inline]
462− pub fn $name<'a>(
463− bump: &'a Bump,
464− ) -> ElementBuilder<
465− 'a,
466− bumpalo::collections::Vec<'a, Listener<'a>>,
467− bumpalo::collections::Vec<'a, Attribute<'a>>,
468− bumpalo::collections::Vec<'a, Node<'a>>,
469− > {
470− let builder = ElementBuilder::new(bump, stringify!($name));
471− builder.namespace(Some($namespace))
472− }
473− )*
474− }
475−}
476−
477−// Organized in the same order as
478−// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
479−//
480−// Does not include obsolete elements.
481−builder_constructors! {
482− // Document metadata
483−
484− /// Build a
485− /// [`<base>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base)
486− /// element.
487− base;
488− /// Build a
489− /// [`<head>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head)
490− /// element.
491− head;
492− /// Build a
493− /// [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link)
494− /// element.
495− link;
496− /// Build a
497− /// [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta)
498− /// element.
499− meta;
500− /// Build a
501− /// [`<style>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style)
502− /// element.
503− style;
504− /// Build a
505− /// [`<title>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title)
506− /// element.
507− title;
508−
509− // Sectioning root
510−
511− /// Build a
512− /// [`<body>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body)
513− /// element.
514− body;
515−
516− // Content sectioning
517−
518− /// Build a
519− /// [`<address>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address)
520− /// element.
521− address;
522− /// Build a
523− /// [`<article>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article)
524− /// element.
525− article;
526− /// Build a
527− /// [`<aside>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside)
528− /// element.
529− aside;
530− /// Build a
531− /// [`<footer>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer)
532− /// element.
533− footer;
534− /// Build a
535− /// [`<header>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header)
536− /// element.
537− header;
538− /// Build a
539− /// [`<h1>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1)
540− /// element.
541− h1;
542− /// Build a
543− /// [`<h2>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h2)
544− /// element.
545− h2;
546− /// Build a
547− /// [`<h3>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h3)
548− /// element.
549− h3;
550− /// Build a
551− /// [`<h4>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h4)
552− /// element.
553− h4;
554− /// Build a
555− /// [`<h5>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h5)
556− /// element.
557− h5;
558− /// Build a
559− /// [`<h6>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6)
560− /// element.
561− h6;
562− /// Build a
563− /// [`<hgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup)
564− /// element.
565− hgroup;
566− /// Build a
567− /// [`<main>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main)
568− /// element.
569− main;
570− /// Build a
571− /// [`<nav>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav)
572− /// element.
573− nav;
574− /// Build a
575− /// [`<section>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section)
576− /// element.
577− section;
578−
579− // Text content
580−
581− /// Build a
582− /// [`<blockquote>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote)
583− /// element.
584− blockquote;
585− /// Build a
586− /// [`<dd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd)
587− /// element.
588− dd;
589− /// Build a
590− /// [`<div>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div)
591− /// element.
592− div;
593− /// Build a
594− /// [`<dl>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl)
595− /// element.
596− dl;
597− /// Build a
598− /// [`<dt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt)
599− /// element.
600− dt;
601− /// Build a
602− /// [`<figcaption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption)
603− /// element.
604− figcaption;
605− /// Build a
606− /// [`<figure>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure)
607− /// element.
608− figure;
609− /// Build a
610− /// [`<hr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr)
611− /// element.
612− hr;
613− /// Build a
614− /// [`<li>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li)
615− /// element.
616− li;
617− /// Build a
618− /// [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol)
619− /// element.
620− ol;
621− /// Build a
622− /// [`<p>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p)
623− /// element.
624− p;
625− /// Build a
626− /// [`<pre>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre)
627− /// element.
628− pre;
629− /// Build a
630− /// [`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul)
631− /// element.
632− ul;
633−
634− // Inline text semantics
635−
636− /// Build a
637− /// [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)
638− /// element.
639− a;
640− /// Build a
641− /// [`<abbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr)
642− /// element.
643− abbr;
644− /// Build a
645− /// [`<b>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b)
646− /// element.
647− b;
648− /// Build a
649− /// [`<bdi>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi)
650− /// element.
651− bdi;
652− /// Build a
653− /// [`<bdo>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo)
654− /// element.
655− bdo;
656− /// Build a
657− /// [`<br>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br)
658− /// element.
659− br;
660− /// Build a
661− /// [`<cite>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite)
662− /// element.
663− cite;
664− /// Build a
665− /// [`<code>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code)
666− /// element.
667− code;
668− /// Build a
669− /// [`<data>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data)
670− /// element.
671− data;
672− /// Build a
673− /// [`<dfn>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn)
674− /// element.
675− dfn;
676− /// Build a
677− /// [`<em>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em)
678− /// element.
679− em;
680− /// Build a
681− /// [`<i>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i)
682− /// element.
683− i;
684− /// Build a
685− /// [`<kbd>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd)
686− /// element.
687− kbd;
688− /// Build a
689− /// [`<mark>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark)
690− /// element.
691− mark;
692− /// Build a
693− /// [`<q>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q)
694− /// element.
695− q;
696− /// Build a
697− /// [`<rb>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb)
698− /// element.
699− rb;
700− /// Build a
701− /// [`<rp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp)
702− /// element.
703− rp;
704− /// Build a
705− /// [`<rt>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt)
706− /// element.
707− rt;
708− /// Build a
709− /// [`<rtc>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rtc)
710− /// element.
711− rtc;
712− /// Build a
713− /// [`<ruby>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby)
714− /// element.
715− ruby;
716− /// Build a
717− /// [`<s>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s)
718− /// element.
719− s;
720− /// Build a
721− /// [`<samp>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp)
722− /// element.
723− samp;
724− /// Build a
725− /// [`<small>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small)
726− /// element.
727− small;
728− /// Build a
729− /// [`<span>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)
730− /// element.
731− span;
732− /// Build a
733− /// [`<strong>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong)
734− /// element.
735− strong;
736− /// Build a
737− /// [`<sub>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub)
738− /// element.
739− sub;
740− /// Build a
741− /// [`<sup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup)
742− /// element.
743− sup;
744− /// Build a
745− /// [`<time>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time)
746− /// element.
747− time;
748− /// Build a
749− /// [`<u>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u)
750− /// element.
751− u;
752− /// Build a
753− /// [`<var>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var)
754− /// element.
755− var;
756− /// Build a
757− /// [`<wbr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr)
758− /// element.
759− wbr;
760−
761− // Image and multimedia
762−
763− /// Build a
764− /// [`<area>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area)
765− /// element.
766− area;
767− /// Build a
768− /// [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio)
769− /// element.
770− audio;
771− /// Build a
772− /// [`<img>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img)
773− /// element.
774− img;
775− /// Build a
776− /// [`<map>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map)
777− /// element.
778− map;
779− /// Build a
780− /// [`<track>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track)
781− /// element.
782− track;
783− /// Build a
784− /// [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video)
785− /// element.
786− video;
787−
788− // Embedded content
789−
790− /// Build a
791− /// [`<embed>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed)
792− /// element.
793− embed;
794− /// Build a
795− /// [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)
796− /// element.
797− iframe;
798− /// Build a
799− /// [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object)
800− /// element.
801− object;
802− /// Build a
803− /// [`<param>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param)
804− /// element.
805− param;
806− /// Build a
807− /// [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture)
808− /// element.
809− picture;
810− /// Build a
811− /// [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source)
812− /// element.
813− source;
814−
815− // Scripting
816−
817− /// Build a
818− /// [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas)
819− /// element.
820− canvas;
821− /// Build a
822− /// [`<noscript>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript)
823− /// element.
824− noscript;
825− /// Build a
826− /// [`<script>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script)
827− /// element.
828− script;
829−
830− // Demarcating edits
831−
832− /// Build a
833− /// [`<del>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del)
834− /// element.
835− del;
836− /// Build a
837− /// [`<ins>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins)
838− /// element.
839− ins;
840−
841− // Table content
842−
843− /// Build a
844− /// [`<caption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption)
845− /// element.
846− caption;
847− /// Build a
848− /// [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col)
849− /// element.
850− col;
851− /// Build a
852− /// [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup)
853− /// element.
854− colgroup;
855− /// Build a
856− /// [`<table>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table)
857− /// element.
858− table;
859− /// Build a
860− /// [`<tbody>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody)
861− /// element.
862− tbody;
863− /// Build a
864− /// [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)
865− /// element.
866− td;
867− /// Build a
868− /// [`<tfoot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot)
869− /// element.
870− tfoot;
871− /// Build a
872− /// [`<th>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th)
873− /// element.
874− th;
875− /// Build a
876− /// [`<thead>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead)
877− /// element.
878− thead;
879− /// Build a
880− /// [`<tr>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr)
881− /// element.
882− tr;
883−
884− // Forms
885−
886− /// Build a
887− /// [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button)
888− /// element.
889− button;
890− /// Build a
891− /// [`<datalist>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist)
892− /// element.
893− datalist;
894− /// Build a
895− /// [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset)
896− /// element.
897− fieldset;
898− /// Build a
899− /// [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form)
900− /// element.
901− form;
902− /// Build a
903− /// [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input)
904− /// element.
905− input;
906− /// Build a
907− /// [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label)
908− /// element.
909− label;
910− /// Build a
911− /// [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend)
912− /// element.
913− legend;
914− /// Build a
915− /// [`<meter>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter)
916− /// element.
917− meter;
918− /// Build a
919− /// [`<optgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup)
920− /// element.
921− optgroup;
922− /// Build a
923− /// [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
924− /// element.
925− option;
926− /// Build a
927− /// [`<output>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output)
928− /// element.
929− output;
930− /// Build a
931− /// [`<progress>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress)
932− /// element.
933− progress;
934− /// Build a
935− /// [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select)
936− /// element.
937− select;
938− /// Build a
939− /// [`<textarea>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea)
940− /// element.
941− textarea;
942−
943− // Interactive elements
944−
945− /// Build a
946− /// [`<details>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details)
947− /// element.
948− details;
949− /// Build a
950− /// [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog)
951− /// element.
952− dialog;
953− /// Build a
954− /// [`<menu>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu)
955− /// element.
956− menu;
957− /// Build a
958− /// [`<menuitem>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menuitem)
959− /// element.
960− menuitem;
961− /// Build a
962− /// [`<summary>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary)
963− /// element.
964− summary;
965−
966− // Web components
967−
968− /// Build a
969− /// [`<slot>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot)
970− /// element.
971− slot;
972− /// Build a
973− /// [`<template>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)
974− /// element.
975− template;
976−}
977−
978−builder_constructors! {
979− // SVG components
980−
981− /// Build a
982− /// [`<svg>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg)
983− /// element.
984− svg <> "http://www.w3.org/2000/svg" ;
985− /// Build a
986− /// [`<path>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path)
987− /// element.
988− path <> "http://www.w3.org/2000/svg";
989− /// Build a
990− /// [`<circle>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle)
991− /// element.
992− circle <> "http://www.w3.org/2000/svg";
993− /// Build a
994− /// [`<ellipse>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse)
995− /// element.
996− ellipse <> "http://www.w3.org/2000/svg";
997− /// Build a
998− /// [`<line>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line)
999− /// element.
1000− line <> "http://www.w3.org/2000/svg";
1001− /// Build a
1002− /// [`<polygon>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon)
1003− /// element.
1004− polygon <> "http://www.w3.org/2000/svg";
1005− /// Build a
1006− /// [`<polyline>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline)
1007− /// element.
1008− polyline <> "http://www.w3.org/2000/svg";
1009− /// Build a
1010− /// [`<rect>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect)
1011− /// element.
1012− rect <> "http://www.w3.org/2000/svg";
1013− /// Build a
1014− /// [`<image>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/image)
1015− /// element.
1016− image <> "http://www.w3.org/2000/svg";
1017−}
1018−
1019−/// Construct a text node.
1020−///
1021−/// This is `dodrio`'s virtual DOM equivalent of `document.createTextNode`.
1022−///
1023−/// # Example
1024−///
1025−/// ```no_run
1026−/// use dodrio::builder::*;
1027−///
1028−/// let my_text = text("hello, dodrio!");
1029−/// ```
1030−#[inline]
1031−pub fn text<'a>(contents: &'a str) -> Node<'a> {
1032− Node::text(contents)
1033−}
1034−
1035−/// Construct an attribute for an element.
1036−///
1037−/// # Example
1038−///
1039−/// This example creates the `id="my-id"` for some element like `<div
1040−/// id="my-id"/>`.
1041−///
1042−/// ```no_run
1043−/// use dodrio::builder::*;
1044−///
1045−/// let my_id_attr = attr("id", "my-id");
1046−/// ```
1047−pub fn attr<'a>(name: &'a str, value: &'a str) -> Attribute<'a> {
1048− Attribute { name, value }
1049−}
1050−
1051−/// Create an event listener.
1052−///
1053−/// `event` is the type of event to listen for, e.g. `"click"`. The `callback`
1054−/// is the function that will be invoked when the event occurs.
1055−///
1056−/// # Example
1057−///
1058−/// ```no_run
1059−/// use dodrio::{builder::*, bumpalo::Bump};
1060−///
1061−/// let b = Bump::new();
1062−///
1063−/// let listener = on(&b, "click", |root, vdom, event| {
1064−/// // do something when a click happens...
1065−/// });
1066−/// ```
1067−pub fn on<'a, F>(bump: &'a Bump, event: &'a str, callback: F) -> Listener<'a>
1068−where
1069− F: Fn(&mut dyn RootRender, VdomWeak, web_sys::Event) + 'static,
1070−{
1071− Listener {
1072− event,
1073− callback: bump.alloc(callback),
1074− }
1075−}
src/cached.rsdeleted−229
@@ -1,229 +0,0 @@
1−use crate::{
2− cached_set::CachedSet,
3− node::{CachedNode, NodeKey},
4− Node, Render, RenderContext,
5−};
6−use std::any::TypeId;
7−use std::cell::Cell;
8−use std::ops::{Deref, DerefMut};
9−
10−/// A renderable that supports caching for when rendering is expensive but can
11−/// generate the same DOM tree.
12−///
13−/// # Example
14−///
15−/// The [TodoMVC
16−/// example](https://github.com/fitzgen/dodrio/blob/master/examples/todomvc/src/todo.rs)
17−/// caches individual todo items.
18−#[derive(Clone, Debug, Default)]
19−pub struct Cached<R>
20−where
21− R: Default,
22−{
23− inner: R,
24− cached: Cell<Option<CachedNode>>,
25−}
26−
27−pub_unstable_internal! {
28− #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
29− pub(crate) struct TemplateId(TypeId);
30−}
31−
32−impl<R> Cached<R>
33−where
34− R: Default,
35−{
36− /// Construct a new `Cached<R>` of an inner `R`.
37− ///
38− /// # Example
39− ///
40− /// ```
41− /// use dodrio::{Cached, Node, Render, RenderContext};
42− ///
43− /// #[derive(Default)]
44− /// pub struct Counter {
45− /// count: u32,
46− /// }
47− ///
48− /// impl<'a> Render<'a> for Counter {
49− /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
50− /// // ...
51− /// # unimplemented!()
52− /// }
53− /// }
54− ///
55− /// // Create a render-able counter.
56− /// let counter = Counter { count: 0 };
57− ///
58− /// // And cache its rendering!
59− /// let cached_counter = Cached::new(counter);
60− /// ```
61− #[inline]
62− pub fn new(inner: R) -> Cached<R> {
63− let cached = Cell::new(None);
64− Cached { inner, cached }
65− }
66−
67− /// Invalidate the cached rendering.
68− ///
69− /// This method should be called whenever the inner `R` must be re-rendered,
70− /// and the cached `Node` from the last time `R::render` was invoked can no
71− /// longer be re-used.
72− ///
73− /// # Example
74− ///
75− /// The `Cached<Hello>` component must have its cache invalidated whenever
76− /// the `who` string is changed, or else the cached rendering will keep
77− /// displaying greetings to old `who`s.
78− ///
79− /// ```
80− /// use dodrio::{bumpalo, Cached, Node, Render, RenderContext};
81− ///
82− /// /// A component that renders to "<p>Hello, {who}!</p>"
83− /// #[derive(Default)]
84− /// pub struct Hello {
85− /// who: String
86− /// }
87− ///
88− /// impl<'a> Render<'a> for Hello {
89− /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90− /// use dodrio::builder::*;
91− /// let greeting = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
92− /// p(&cx)
93− /// .children([text(greeting.into_bump_str())])
94− /// .finish()
95− /// }
96− /// }
97− ///
98− /// /// Whenever a `Cached<Hello>`'s `who` is updated, we need to invalidate the
99− /// /// cache so that we don't keep displaying greetings to old `who`s.
100− /// pub fn set_who(hello: &mut Cached<Hello>, who: String) {
101− /// hello.who = who;
102− /// Cached::invalidate(hello);
103− /// }
104− /// ```
105− #[inline]
106− pub fn invalidate(cached: &Self) {
107− cached.cached.set(None);
108− }
109−
110− /// Convert a `Cached<R>` back into a plain `R`.
111− #[inline]
112− pub fn into_inner(cached: Self) -> R {
113− cached.inner
114− }
115−}
116−
117−impl<R> Cached<R>
118−where
119− R: 'static + Default,
120−{
121− pub(crate) fn template_id() -> TemplateId {
122− TemplateId(TypeId::of::<R>())
123− }
124−}
125−
126−impl<R> Deref for Cached<R>
127−where
128− R: Default,
129−{
130− type Target = R;
131−
132− fn deref(&self) -> &R {
133− &self.inner
134− }
135−}
136−
137−impl<R> DerefMut for Cached<R>
138−where
139− R: Default,
140−{
141− fn deref_mut(&mut self) -> &mut R {
142− &mut self.inner
143− }
144−}
145−
146−impl<'a, R> Render<'a> for Cached<R>
147−where
148− R: 'static + Default + for<'b> Render<'b>,
149−{
150− fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
151− let template = cx.template::<R>();
152− let cached = match self.cached.get() {
153− // This does-the-cache-contain-this-id check is necessary because
154− // the same `Cached<R>` instance can be rendered into vdom A, which
155− // will save the results into A's cached set and yield id X. Then,
156− // it can be rendered *again* into a second vdom B, and B's cached
157− // set does not have the saved results for id X. If we didn't have
158− // this check, instead of a cache miss, we would have a panic.
159− //
160− // This scenario should basically never happen in the real world,
161− // however. If we ever find that it is worth sharing a cached render
162− // component between multiple vdoms, and want to avoid these
163− // "unnecessary" cache misses, we can do this:
164− //
165− // * Make each `Cached<R>` have an instance id and generation
166− // counter.
167− //
168− // * On invalidation, bump the generation counter.
169− //
170− // * Add a generation member to the `CacheEntry`.
171− //
172− // * Each vdom maintains a map from `Cached<R>` instance id to
173− // `CacheEntry`s.
174− //
175− // * We only re-use the cached results if the `Cached<R>`'s
176− // generation counter matches the entry in the vdom's cached set.
177− //
178− // This is all do-able but is a bit more book keeping than we really
179− // want to do unless it is well motivated.
180− Some(cached)
181− if {
182− let cached_set = cx.cached_set.borrow();
183− cached_set.contains(cached.id)
184− } =>
185− {
186− cached
187− }
188− _ => {
189− let mut key = NodeKey::NONE;
190− let id = CachedSet::insert(cx, false, template, |nested_cx| {
191− let node = self.inner.render(nested_cx);
192− key = node.key();
193− node
194− });
195− let cached = CachedNode { id, key };
196− self.cached.set(Some(cached));
197− cached
198− }
199− };
200−
201− cached.into()
202− }
203−}
204−
205−#[cfg(feature = "serde")]
206−impl<R> serde::Serialize for Cached<R>
207−where
208− R: Default + serde::Serialize,
209−{
210− fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
211− where
212− S: serde::Serializer,
213− {
214− self.inner.serialize(serializer)
215− }
216−}
217−
218−#[cfg(feature = "serde")]
219−impl<'de, R> serde::Deserialize<'de> for Cached<R>
220−where
221− R: Default + serde::Deserialize<'de>,
222−{
223− fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
224− where
225− D: serde::Deserializer<'de>,
226− {
227− R::deserialize(deserializer).map(Cached::new)
228− }
229−}
src/cached_set.rsdeleted−186
@@ -1,186 +0,0 @@
1−use crate::{
2− events::EventsRegistry,
3− node::{Node, NodeKind},
4− render_context::RenderContext,
5−};
6−use bumpalo::Bump;
7−use fxhash::{FxHashMap, FxHashSet};
8−use std::sync::atomic::{AtomicUsize, Ordering};
9−use std::u32;
10−use wasm_bindgen::prelude::*;
11−
12−static ID_COUNTER: AtomicUsize = AtomicUsize::new(0);
13−
14−pub_unstable_internal! {
15− #[derive(Debug, Default)]
16− pub(crate) struct CachedSet {
17− items: FxHashMap<CacheId, CacheEntry>,
18− }
19−}
20−
21−pub_unstable_internal! {
22− #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
23− pub(crate) struct CacheId(u32);
24−}
25−
26−#[derive(Debug)]
27−pub(crate) struct CacheEntry {
28− bump: Bump,
29−
30− // Actually a reference into `bump`.
31− node: *const Node<'static>,
32−
33− // All the other cached entries that `node` references (including transitive
34− // edges). By eagerly following transitive edges and recording them the
35− // once, we don't have to repeat the tracing every time we want to garbage
36− // collect cache entries.
37− edges: FxHashSet<CacheId>,
38−
39− // The template for this cached virtual subtree.
40− //
41− // When a cache entry has a template, that means that the `ChangeList` will
42− // lazily build a physical DOM subtree based on the template, and when we
43− // create new versions of this cached result, we clone the template's
44− // physical DOM subtree and then modify it, rather than building the cached
45− // result up from scratch. This is a nice win because we bounce between JS
46− // and DOM methods less often, and get the C++ DOM implementation to do most
47− // of the subtree construction for us.
48− template: Option<CacheId>,
49−
50− // Whether this entry should never be garbage collected. Typically only
51− // templates are pinned.
52− pinned: bool,
53−}
54−
55−impl From<CacheId> for u32 {
56− #[inline]
57− fn from(id: CacheId) -> u32 {
58− id.0
59− }
60−}
61−
62−impl CachedSet {
63− pub(crate) fn new_roots_set(&self) -> FxHashSet<CacheId> {
64− let mut roots = FxHashSet::default();
65− roots.reserve(self.items.len());
66− roots
67− }
68−
69− pub(crate) fn gc(&mut self, registry: &mut EventsRegistry, roots: FxHashSet<CacheId>) {
70− let mut marked = FxHashSet::default();
71− marked.reserve(self.items.len());
72−
73− for root in roots {
74− if marked.insert(root) {
75− let entry = self
76− .items
77− .get(&root)
78− .expect_throw("CachedSet::gc: should have root in cached set");
79−
80− // NB: no need to recurse here because `edges` already contains
81− // transitive edges!
82− marked.extend(entry.edges.iter().cloned());
83− }
84− }
85−
86− self.items.retain(|id, entry| {
87− let keep = entry.pinned || marked.contains(id);
88− if !keep {
89− let node: &Node = unsafe { &*entry.node };
90− registry.remove_subtree(node);
91− }
92− keep
93− });
94− }
95−
96− // Trace all the transitive edges to other cached entries that the given
97− // node has.
98− fn trace(&self, node: &Node) -> FxHashSet<CacheId> {
99− let mut edges = FxHashSet::default();
100− self.trace_recursive(&mut edges, node);
101− edges
102− }
103−
104− fn trace_recursive(&self, edges: &mut FxHashSet<CacheId>, node: &Node) {
105− match &node.kind {
106− NodeKind::Text(_) => return,
107− NodeKind::Cached(c) => {
108− debug_assert!(self.items.contains_key(&c.id));
109− edges.insert(c.id);
110− edges.extend(
111− self.items
112− .get(&c.id)
113− .expect_throw("CachedSet::trace: should have c.id in cached set")
114− .edges
115− .iter()
116− .cloned(),
117− );
118− }
119− NodeKind::Element(el) => {
120− for child in el.children {
121− self.trace_recursive(edges, child);
122− }
123− }
124− }
125− }
126−
127− fn next_id(&mut self) -> CacheId {
128− let next = ID_COUNTER.fetch_add(1, Ordering::AcqRel) as u32;
129− let next = if next == u32::MAX { None } else { Some(next) };
130− CacheId(next.expect_throw("ID_COUNTER overflowed"))
131− }
132−
133− pub(crate) fn insert<F>(
134− cx: &mut RenderContext,
135− pinned: bool,
136− template: Option<CacheId>,
137− f: F,
138− ) -> CacheId
139− where
140− F: for<'a> FnOnce(&mut RenderContext<'a>) -> Node<'a>,
141− {
142− let set = cx.cached_set;
143− let bump = Bump::new();
144− let (node, edges) = {
145− let mut nested_cx = RenderContext::new(&bump, cx.cached_set, cx.templates);
146− let node = f(&mut nested_cx);
147− let node = bump.alloc(node);
148− let edges = {
149− let set = set.borrow();
150− set.trace(node)
151− };
152− (
153− node as *mut Node<'_> as usize as *const Node<'static>,
154− edges,
155− )
156− };
157−
158− let entry = CacheEntry {
159− bump,
160− node,
161− edges,
162− template,
163− pinned,
164− };
165−
166− let mut set = set.borrow_mut();
167− let id = set.next_id();
168− set.items.insert(id, entry);
169− id
170− }
171−
172− /// Does the cached set contain a cached node with the given id?
173− pub fn contains(&self, id: CacheId) -> bool {
174− self.items.contains_key(&id)
175− }
176−
177− /// Get the cached node and its template (if any) for the given cache id.
178− pub fn get(&self, id: CacheId) -> (&Node, Option<CacheId>) {
179− let entry = self
180− .items
181− .get(&id)
182− .expect_throw("CachedSet::get: should have id in set");
183− let node: &Node = unsafe { &*entry.node };
184− (node, entry.template)
185− }
186−}
src/change_list.rsnew file+235
@@ -0,0 +1,235 @@
1+use bumpalo::{Bump, BumpAllocSafe};
2+use wasm_bindgen::prelude::*;
3+
4+pub mod js {
5+ use wasm_bindgen::prelude::*;
6+
7+ #[wasm_bindgen(module = "dodrio/change-list")]
8+ extern "C" {
9+ #[derive(Clone, Debug)]
10+ pub type ChangeList;
11+
12+ #[wasm_bindgen(constructor)]
13+ pub fn new(container: &web_sys::Node) -> ChangeList;
14+
15+ #[wasm_bindgen(method, js_name = addChangeListRange)]
16+ pub fn add_change_list_range(this: &ChangeList, start: usize, len: usize);
17+
18+ #[wasm_bindgen(method, js_name = applyChanges)]
19+ pub fn apply_changes(this: &ChangeList, memory: JsValue);
20+ }
21+}
22+
23+pub(crate) struct ChangeList {
24+ bump: Bump,
25+ js: js::ChangeList,
26+}
27+
28+impl ChangeList {
29+ pub(crate) fn new(container: &web_sys::Node) -> ChangeList {
30+ let bump = Bump::new();
31+ let js = js::ChangeList::new(container);
32+ ChangeList { bump, js }
33+ }
34+
35+ pub(crate) fn apply_changes(&mut self) {
36+ let js = &self.js;
37+ unsafe {
38+ self.bump.each_allocated_chunk(|ch| {
39+ js.add_change_list_range(ch.as_ptr() as usize, ch.len());
40+ });
41+ }
42+ js.apply_changes(wasm_bindgen::memory());
43+ self.bump.reset();
44+ }
45+}
46+
47+#[wasm_bindgen]
48+#[repr(u32)]
49+pub enum ChangeDiscriminant {
50+ /// Immediates: `(pointer, length)`
51+ ///
52+ /// Stack: `[... TextNode] -> [... TextNode]`
53+ ///
54+ /// ```text
55+ /// stack.top().textContent = String(pointer, length)
56+ /// ```
57+ SetText = 0,
58+
59+ /// Immediates: `()`
60+ ///
61+ /// Stack: `[... Node] -> [...]`
62+ ///
63+ /// ```text
64+ /// node = stack.pop()
65+ /// while (node.nextSibling) {
66+ /// node.nextSibling.remove();
67+ /// }
68+ /// node.remove()
69+ /// ```
70+ RemoveSelfAndNextSiblings = 1,
71+
72+ /// Immediates: `()`
73+ ///
74+ /// Stack: `[... Node Node] -> [... Node]`
75+ ///
76+ /// ```text
77+ /// new = stack.pop()
78+ /// old = stack.pop()
79+ /// old.replaceWith(new)
80+ /// stack.push(new)
81+ /// ```
82+ ReplaceWith = 2,
83+
84+ /// Immediates: `(pointer1, length1, pointer2, length2)`
85+ ///
86+ /// Stack: `[... Node] -> [... Node]`
87+ ///
88+ /// ```text
89+ /// stack.top().setAttribute(String(pointer1, length1), String(pointer2, length2))
90+ /// ```
91+ SetAttribute = 3,
92+
93+ /// Immediates: (pointer, length)
94+ ///
95+ /// Stack: `[... Node] -> [... Node]`
96+ ///
97+ /// ```text
98+ /// stack.top().removeAttribute(String(pointer, length))
99+ /// ```
100+ RemoveAttribute = 4,
101+
102+ /// Immediates: `()`
103+ ///
104+ /// Stack: `[... Node] -> [... Node node]`
105+ ///
106+ /// ```text
107+ /// stack.push(stack.top().firstChild)
108+ /// ```
109+ PushFirstChild = 5,
110+
111+ /// Immediates: `()`
112+ ///
113+ /// Stack: `[... Node] -> [... Node]`
114+ ///
115+ /// ```text
116+ /// stack.push(stack.pop().nextSibling)
117+ /// ```
118+ PopPushNextSibling = 6,
119+
120+ /// Immediates: `()`
121+ ///
122+ /// Stack: `[... T] -> [...]`
123+ ///
124+ /// ```text
125+ /// stack.pop()
126+ /// ```
127+ Pop = 7,
128+
129+ /// Immediates: `()`
130+ ///
131+ /// Stack: `[... Node Node] -> [... Node]`
132+ ///
133+ /// ```text
134+ /// child = stack.pop()
135+ /// stack.top().appendChild(child)
136+ /// ```
137+ AppendChild = 8,
138+
139+ /// Immediates: `(pointer, length)`
140+ ///
141+ /// Stack: `[...] -> [... Node]`
142+ ///
143+ /// ```text
144+ /// stack.push(createTextNode(String(pointer, length)))
145+ /// ```
146+ CreateTextNode = 9,
147+
148+ /// Immediates: `(pointer, length)`
149+ ///
150+ /// Stack: `[...] -> [... Node]`
151+ ///
152+ /// ```text
153+ /// stack.push(createElement(String(pointer, length))
154+ /// ```
155+ CreateElement = 10,
156+}
157+
158+impl BumpAllocSafe for ChangeDiscriminant {}
159+
160+impl ChangeList {
161+ pub(crate) fn emit_set_text(&self, text: &str) {
162+ debug!("emit_set_text({:?})", text);
163+ self.bump
164+ .alloc((ChangeDiscriminant::SetText, text.as_ptr(), text.len()));
165+ }
166+
167+ pub(crate) fn emit_remove_self_and_next_siblings(&self) {
168+ debug!("emit_remove_self_and_next_siblings()");
169+ self.bump
170+ .alloc(ChangeDiscriminant::RemoveSelfAndNextSiblings);
171+ }
172+
173+ pub(crate) fn emit_replace_with(&self) {
174+ debug!("emit_replace_with()");
175+ self.bump.alloc(ChangeDiscriminant::ReplaceWith);
176+ }
177+
178+ pub(crate) fn emit_set_attribute(&self, name: &str, value: &str) {
179+ debug!("emit_set_attribute({:?}, {:?})", name, value);
180+ self.bump.alloc((
181+ ChangeDiscriminant::SetAttribute,
182+ name.as_ptr(),
183+ name.len(),
184+ value.as_ptr(),
185+ value.len(),
186+ ));
187+ }
188+
189+ pub(crate) fn emit_remove_attribute(&self, name: &str) {
190+ debug!("emit_remove_attribute({:?})", name);
191+ self.bump.alloc((
192+ ChangeDiscriminant::RemoveAttribute,
193+ name.as_ptr(),
194+ name.len(),
195+ ));
196+ }
197+
198+ pub(crate) fn emit_push_first_child(&self) {
199+ debug!("emit_push_first_child()");
200+ self.bump.alloc(ChangeDiscriminant::PushFirstChild);
201+ }
202+
203+ pub(crate) fn emit_pop_push_next_sibling(&self) {
204+ debug!("emit_pop_push_next_sibling()");
205+ self.bump.alloc(ChangeDiscriminant::PopPushNextSibling);
206+ }
207+
208+ pub(crate) fn emit_pop(&self) {
209+ debug!("emit_pop()");
210+ self.bump.alloc(ChangeDiscriminant::Pop);
211+ }
212+
213+ pub(crate) fn emit_append_child(&self) {
214+ debug!("emit_append_child()");
215+ self.bump.alloc(ChangeDiscriminant::AppendChild);
216+ }
217+
218+ pub(crate) fn emit_create_text_node(&self, text: &str) {
219+ debug!("emit_create_text_node({:?})", text);
220+ self.bump.alloc((
221+ ChangeDiscriminant::CreateTextNode,
222+ text.as_ptr(),
223+ text.len(),
224+ ));
225+ }
226+
227+ pub(crate) fn emit_create_element(&self, tag_name: &str) {
228+ debug!("emit_create_element({:?})", tag_name);
229+ self.bump.alloc((
230+ ChangeDiscriminant::CreateElement,
231+ tag_name.as_ptr(),
232+ tag_name.len(),
233+ ));
234+ }
235+}
src/change_list/emitter.rsdeleted−292
@@ -1,292 +0,0 @@
1−//! The `InstructionEmitter` is responsible for encoding change list
2−//! instructions and ensuring that each instruction has the correct number of
3−//! immediates. It ensures that the resulting change list instruction stream is
4−//! *syntactically* correct (opcodes have the correct arity of immediate
5−//! arguments, etc), while `ChangeListBuilder` wraps an emitter and additionally
6−//! ensures that the resulting change list program is *semantically* correct
7−//! (doesn't reference cached strings before they've been added to the cache,
8−//! etc).
9−//!
10−//! We encode the instructions directly into a dedicated bump arena. We
11−//! eventually pass the bump arena's chunks to the interpreter in JS, so it is
12−//! critical that nothing other than change list instructions are allocated
13−//! inside this bump, and that the instructions themselves do not contain any
14−//! padding or uninitialized memory. See the documentation for the the
15−//! `Bump::each_allocated_chunk` method for details.
16−
17−use bumpalo::Bump;
18−
19−#[derive(Debug)]
20−pub(crate) struct InstructionEmitter {
21− bump: Bump,
22−}
23−
24−impl InstructionEmitter {
25− /// Construct a new `InstructionEmitter` with its own bump arena.
26− pub fn new() -> InstructionEmitter {
27− let bump = Bump::new();
28− InstructionEmitter { bump }
29− }
30−
31− /// Invoke the given function with each of the allocated instruction
32− /// sequences that this emitter has built up.
33− #[cfg_attr(feature = "xxx-unstable-internal-use-only", allow(dead_code))]
34− pub fn each_instruction_sequence<F>(&mut self, f: F)
35− where
36− F: FnMut(&[u8]),
37− {
38− // Note: the safety invariants required for `each_allocated_chunk` are
39− // maintained by the fact that everything we encode as allocations in
40− // the bump arena are in the form of `u32`s, and therefore we don't have
41− // any uninitialized memory padding in the arena.
42− unsafe {
43− self.bump.each_allocated_chunk(f);
44− }
45− }
46−
47− /// Reset to an empty sequence of instructions.
48− pub fn reset(&mut self) {
49− self.bump.reset();
50− }
51−}
52−
53−macro_rules! define_change_list_instructions {
54− ( $(
55− $( #[$attr:meta] )*
56− $name:ident (
57− $($immediate:ident),*
58− ) = $discriminant:expr,
59− )* ) => {
60− impl InstructionEmitter {
61− $(
62− $( #[$attr] )*
63− #[inline]
64− pub fn $name(&self $(, $immediate: u32)*) {
65− self.bump.alloc_with(|| [$discriminant $(, $immediate )* ]);
66− }
67− )*
68− }
69− }
70−}
71−
72−define_change_list_instructions! {
73− /// Stack: `[... TextNode] -> [... TextNode]`
74− ///
75− /// ```text
76− /// stack.top().textContent = readString(pointer, length)
77− /// ```
78− set_text(pointer, length) = 0,
79−
80− /// Stack: `[... Node] -> [...]`
81− ///
82− /// ```text
83− /// node = stack.pop()
84− /// while (node.nextSibling) {
85− /// node.nextSibling.remove();
86− /// }
87− /// node.remove()
88− /// ```
89− remove_self_and_next_siblings() = 1,
90−
91− /// Stack: `[... Node Node] -> [... Node]`
92− ///
93− /// ```text
94− /// new = stack.pop()
95− /// old = stack.pop()
96− /// old.replaceWith(new)
97− /// stack.push(new)
98− /// ```
99− replace_with() = 2,
100−
101− /// Stack: `[... Node] -> [... Node]`
102− ///
103− /// ```text
104− /// stack.top().setAttribute(getCachedString(attribute_key), getCachedString(value_key))
105− /// ```
106− set_attribute(attribute_key, value_key) = 3,
107−
108− /// Stack: `[... Node] -> [... Node]`
109− ///
110− /// ```text
111− /// stack.top().removeAttribute(getCachedString(attribute_key))
112− /// ```
113− remove_attribute(attribute_key) = 4,
114−
115− /// Stack: `[... Node] -> [... Node Node]`
116− ///
117− /// ```text
118− /// parent = stack.top()
119− /// child = parent.childNodes[parent.childNodes.length - n - 1]
120− /// stack.push(child)
121− /// ```
122− push_reverse_child(n) = 5,
123−
124− /// Stack: `[... Node Node] -> [... Node Node]`
125− ///
126− /// ```text
127− /// stack.pop();
128− /// parent = stack.top();
129− /// child = parent.childNodes[n]
130− /// stack.push(child)
131− /// ```
132− pop_push_child(n) = 6,
133−
134− /// Stack: `[... T] -> [...]`
135− ///
136− /// ```text
137− /// stack.pop()
138− /// ```
139− pop() = 7,
140−
141− /// Stack: `[... Node Node] -> [... Node]`
142− ///
143− /// ```text
144− /// child = stack.pop()
145− /// stack.top().appendChild(child)
146− /// ```
147− append_child() = 8,
148−
149− /// Stack: `[...] -> [... Node]`
150− ///
151− /// ```text
152− /// stack.push(document.createTextNode(readString(pointer, length)))
153− /// ```
154− create_text_node(pointer, length) = 9,
155−
156− /// Stack: `[...] -> [... Node]`
157− ///
158− /// ```text
159− /// stack.push(document.createElement(getCachedString(tag_name_key))
160− /// ```
161− create_element(tag_name_key) = 10,
162−
163− /// Stack: `[... Node] -> [... Node]`
164− ///
165− /// ```text
166− /// event = getCachedString(event_key)
167− /// callback = createProxyToRustCallback(a, b)
168− /// stack.top().addEventListener(event, callback)
169− /// ```
170− new_event_listener(event_key, a, b) = 11,
171−
172− /// Stack: `[... Node] -> [... Node]`
173− ///
174− /// ```text
175− /// event = getCachedString(event_key)
176− /// new_callback = createProxyToRustCallback(a, b);
177− /// stack.top().updateEventlistener(new_callback)
178− /// ```
179− update_event_listener(event_key, a, b) = 12,
180−
181− /// Stack: `[... Node] -> [... Node]`
182− ///
183− /// ```text
184− /// stack.top().removeEventListener(getCachedString(event_key));
185− /// ```
186− remove_event_listener(event_key) = 13,
187−
188− /// Stack: `[...] -> [...]`
189− ///
190− /// ```text
191− /// addCachedString(readString(pointer, length), key);
192− /// ```
193− add_cached_string(pointer, length, key) = 14,
194−
195− /// Stack: `[...] -> [...]`
196− ///
197− /// ```text
198− /// dropCachedString(key);
199− /// ```
200− drop_cached_string(key) = 15,
201−
202− /// Stack: `[...] -> [... Node]`
203− ///
204− /// ```text
205− /// tag_name = getCachedString(tag_name_key)
206− /// namespace = getCachedString(tag_name_key)
207− /// stack.push(document.createElementNS(tag_name, namespace))
208− /// ```
209− create_element_ns(tag_name_key, namespace_key) = 16,
210−
211− /// Stack: `[...] -> [...]`
212− ///
213− /// ```text
214− /// parent = stack.top()
215− /// children = parent.childNodes
216− /// temp = temp_base
217− /// for i in start .. end:
218− /// temporaries[temp] = children[i]
219− /// temp += 1
220− /// ```
221− save_children_to_temporaries(temp_base, start, end) = 17,
222−
223− /// Stack: `[... Node] -> [... Node Node]`
224− ///
225− /// ```text
226− /// parent = stack.top()
227− /// child = parent.childNodes[n]
228− /// stack.push(child)
229− /// ```
230− push_child(n) = 18,
231−
232− /// Stack: `[...] -> [... Node]`
233− ///
234− /// ```text
235− /// stack.push(temporaries[temp])
236− /// ```
237− push_temporary(temp) = 19,
238−
239− /// Stack: `[... Node Node] -> [... Node]`
240− ///
241− /// ```text
242− /// before = stack.pop()
243− /// after = stack.pop()
244− /// after.insertBefore(before)
245− /// stack.push(before)
246− /// ```
247− insert_before() = 20,
248−
249− /// Stack: `[... Node Node] -> [... Node Node]`
250− ///
251− /// ```text
252− /// stack.pop()
253− /// parent = stack.top()
254− /// child = parent.childNodes[parent.childNodes.length - n - 1]
255− /// stack.push(child)
256− /// ```
257− pop_push_reverse_child(n) = 21,
258−
259− /// Stack: `[... Node] -> [... Node]`
260− ///
261− /// ```text
262− /// parent = stack.top()
263− /// child = parent.childNodes[n]
264− /// child.remove()
265− /// ```
266− remove_child(n) = 22,
267−
268− /// Stack: `[... Node] -> [... Node]`
269− ///
270− /// ```text
271− /// class = getCachedString(class)
272− /// node = stack.top()
273− /// node.className = class
274− /// ```
275− set_class(class) = 23,
276−
277− /// Stack: `[... Node] -> [... Node]`
278− ///
279− /// ```text
280− /// template = stack.top()
281− /// saveTemplate(id, template)
282− /// ```
283− save_template(id) = 24,
284−
285− /// Stack: `[...] -> [... Node]`
286− ///
287− /// ```text
288− /// template = getTemplate(id)
289− /// stack.push(template.cloneNode(true))
290− /// ```
291− push_template(id) = 25,
292−}
src/change_list/js.rsdeleted−40
@@ -1,40 +0,0 @@
1−cfg_if::cfg_if! {
2− if #[cfg(all(feature = "xxx-unstable-internal-use-only", not(target_arch = "wasm32")))] {
3− #[derive(Clone, Debug)]
4− pub struct ChangeListInterpreter {}
5− impl ChangeListInterpreter {
6− pub fn new(_container: &crate::Element) -> ChangeListInterpreter {
7− ChangeListInterpreter {}
8− }
9− pub fn unmount(&self) {}
10− pub fn add_change_list_range(&self, _start: usize, _len: usize) {}
11− pub fn init_events_trampoline(&self, _trampoline: &crate::EventsTrampoline) {}
12− }
13− } else {
14− use wasm_bindgen::prelude::*;
15−
16− #[wasm_bindgen(module = "/js/change-list-interpreter.js")]
17− extern "C" {
18− #[derive(Clone, Debug)]
19− pub type ChangeListInterpreter;
20−
21− #[wasm_bindgen(constructor)]
22− pub fn new(container: &web_sys::Element) -> ChangeListInterpreter;
23−
24− #[wasm_bindgen(structural, method)]
25− pub fn unmount(this: &ChangeListInterpreter);
26−
27− #[wasm_bindgen(structural, method, js_name = addChangeListRange)]
28− pub fn add_change_list_range(this: &ChangeListInterpreter, start: usize, len: usize);
29−
30− #[wasm_bindgen(structural, method, js_name = applyChanges)]
31− pub fn apply_changes(this: &ChangeListInterpreter, memory: JsValue);
32−
33− #[wasm_bindgen(structural, method, js_name = initEventsTrampoline)]
34− pub fn init_events_trampoline(
35− this: &ChangeListInterpreter,
36− trampoline: &crate::EventsTrampoline,
37− );
38− }
39− }
40−}
src/change_list/mod.rsdeleted−353

This diff is too big to show here.

src/change_list/strings.rsdeleted−66

This diff is too big to show here.

src/change_list/traversal.rsdeleted−344

This diff is too big to show here.

src/diff.rsdeleted−1125

This diff is too big to show here.

src/events.rsdeleted−138

This diff is too big to show here.

src/lib.rs+11−129

This diff is too big to show here.

src/logging.rsdeleted−65

This diff is too big to show here.

src/macros.rsnew file+7

This diff is too big to show here.

src/node.rs+66−243

This diff is too big to show here.

src/render.rsdeleted−168

This diff is too big to show here.

src/render_context.rsdeleted−104

This diff is too big to show here.

src/strace.rsdeleted−22

This diff is too big to show here.

src/vdom.rs+174−425

This diff is too big to show here.

tests/web.rsnew file+13

This diff is too big to show here.

tests/web/cached.jsdeleted−11

This diff is too big to show here.

tests/web/cached.rsdeleted−289

This diff is too big to show here.

tests/web/events.rsdeleted−250

This diff is too big to show here.

tests/web/js_api.rsdeleted−153

This diff is too big to show here.

tests/web/keyed.jsdeleted−25

This diff is too big to show here.

tests/web/keyed.rsdeleted−269

This diff is too big to show here.

tests/web/main.rsdeleted−226

This diff is too big to show here.

tests/web/render.rsdeleted−343

This diff is too big to show here.