diff --git a/examples/ConvolutionalLayer.mon b/examples/ConvolutionalLayer.mon
index ae4bc3a..49f6bd6 100644
--- a/examples/ConvolutionalLayer.mon
+++ b/examples/ConvolutionalLayer.mon
@@ -1,11 +1,11 @@
+ConvolutionalLayer{
in:Input
- filters:Tensor
- biases:Tensor
+ filters:Tensor(size = 28x28x10, sparse = true)
+ biases:Tensor(size = 28x28x1)
- [in,filters] -> conv:Convolution
- [conv, biases] -> BiasAdd -> ReLU -> out:Output
+ [in,filters] -> conv:Convolution(strideSize = 2x2)
+ [conv, biases] -> BiasAdd(silent = true) -> ReLU -> out:Output
}
image:Input -> conv1:CL -> conv2:CL -> Out
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 53640fd..a3d47f8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,17 +4,17 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "7zip": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz",
+ "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA="
+ },
"@types/node": {
"version": "7.0.31",
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.31.tgz",
"integrity": "sha512-+KrE1LDddn97ip+gXZAnzNQ0pupKH/6tcKwTpo96BDVNpzmhIKGHug0Wd3H0dN4WEqYB1tXYI5m2mZuIZNI8tg==",
"dev": true
},
- "7zip": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz",
- "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA="
- },
"abbrev": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
@@ -22,7 +22,8 @@
"dev": true
},
"ace-moniel-builds": {
- "version": "github:mlajtos/ace-moniel-builds#f48327e22efe3a59c18edbb22e8b44ce59204100"
+ "version": "github:mlajtos/ace-moniel-builds#f48327e22efe3a59c18edbb22e8b44ce59204100",
+ "from": "github:mlajtos/ace-moniel-builds"
},
"ajv": {
"version": "4.11.8",
@@ -30,8 +31,8 @@
"integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
"dev": true,
"requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
}
},
"amdefine": {
@@ -58,8 +59,8 @@
"integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
"dev": true,
"requires": {
- "arrify": "1.0.1",
- "micromatch": "2.3.11"
+ "arrify": "^1.0.0",
+ "micromatch": "^2.1.5"
}
},
"appdmg": {
@@ -69,17 +70,17 @@
"dev": true,
"optional": true,
"requires": {
- "async": "1.5.2",
- "cp-file": "3.2.0",
- "ds-store": "0.1.6",
- "execa": "0.4.0",
- "fs-temp": "1.1.2",
- "fs-xattr": "0.1.17",
- "image-size": "0.5.5",
- "is-my-json-valid": "2.16.1",
- "minimist": "1.2.0",
- "parse-color": "1.0.0",
- "repeat-string": "1.6.1"
+ "async": "^1.4.2",
+ "cp-file": "^3.1.0",
+ "ds-store": "^0.1.5",
+ "execa": "^0.4.0",
+ "fs-temp": "^1.0.0",
+ "fs-xattr": "^0.1.14",
+ "image-size": "^0.5.0",
+ "is-my-json-valid": "^2.13.1",
+ "minimist": "^1.1.3",
+ "parse-color": "^1.0.0",
+ "repeat-string": "^1.5.4"
},
"dependencies": {
"minimist": {
@@ -103,8 +104,8 @@
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"dev": true,
"requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.2.11"
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
}
},
"arr-diff": {
@@ -113,7 +114,7 @@
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"dev": true,
"requires": {
- "arr-flatten": "1.0.3"
+ "arr-flatten": "^1.0.1"
}
},
"arr-flatten": {
@@ -147,24 +148,19 @@
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
- "asap": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
- "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8="
- },
"asar": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/asar/-/asar-0.13.0.tgz",
"integrity": "sha1-3zPdnQG/+EJGTQ2fCVdA1KYq+xQ=",
"dev": true,
"requires": {
- "chromium-pickle-js": "0.2.0",
- "commander": "2.9.0",
- "cuint": "0.2.2",
- "glob": "6.0.4",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "mksnapshot": "0.3.1",
+ "chromium-pickle-js": "^0.2.0",
+ "commander": "^2.9.0",
+ "cuint": "^0.2.1",
+ "glob": "^6.0.4",
+ "minimatch": "^3.0.3",
+ "mkdirp": "^0.5.0",
+ "mksnapshot": "^0.3.0",
"tmp": "0.0.28"
},
"dependencies": {
@@ -174,11 +170,11 @@
"integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
"dev": true,
"requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
}
}
@@ -224,7 +220,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/attempt-x/-/attempt-x-1.1.1.tgz",
"integrity": "sha512-hIp37ojJRRW8ExWSxxLpkDHUufk/DFfsb7/cUC1cVbBg7JV4gJTkCTRa44dlL9e5jx1P3VNrjL7QOQfi4MyltA==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"aws-sign2": {
"version": "0.6.0",
@@ -244,21 +241,21 @@
"integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=",
"dev": true,
"requires": {
- "babel-core": "6.25.0",
- "babel-polyfill": "6.23.0",
- "babel-register": "6.24.1",
- "babel-runtime": "6.23.0",
- "chokidar": "1.7.0",
- "commander": "2.9.0",
- "convert-source-map": "1.5.0",
- "fs-readdir-recursive": "1.0.0",
- "glob": "7.1.2",
- "lodash": "4.17.4",
- "output-file-sync": "1.1.2",
- "path-is-absolute": "1.0.1",
- "slash": "1.0.0",
- "source-map": "0.5.6",
- "v8flags": "2.1.1"
+ "babel-core": "^6.24.1",
+ "babel-polyfill": "^6.23.0",
+ "babel-register": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "chokidar": "^1.6.1",
+ "commander": "^2.8.1",
+ "convert-source-map": "^1.1.0",
+ "fs-readdir-recursive": "^1.0.0",
+ "glob": "^7.0.0",
+ "lodash": "^4.2.0",
+ "output-file-sync": "^1.1.0",
+ "path-is-absolute": "^1.0.0",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.0",
+ "v8flags": "^2.0.10"
}
},
"babel-code-frame": {
@@ -267,9 +264,9 @@
"integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
"dev": true,
"requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.1"
+ "chalk": "^1.1.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.0"
}
},
"babel-core": {
@@ -278,25 +275,25 @@
"integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=",
"dev": true,
"requires": {
- "babel-code-frame": "6.22.0",
- "babel-generator": "6.25.0",
- "babel-helpers": "6.24.1",
- "babel-messages": "6.23.0",
- "babel-register": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0",
- "babylon": "6.17.3",
- "convert-source-map": "1.5.0",
- "debug": "2.6.8",
- "json5": "0.5.1",
- "lodash": "4.17.4",
- "minimatch": "3.0.4",
- "path-is-absolute": "1.0.1",
- "private": "0.1.7",
- "slash": "1.0.0",
- "source-map": "0.5.6"
+ "babel-code-frame": "^6.22.0",
+ "babel-generator": "^6.25.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.25.0",
+ "babel-traverse": "^6.25.0",
+ "babel-types": "^6.25.0",
+ "babylon": "^6.17.2",
+ "convert-source-map": "^1.1.0",
+ "debug": "^2.1.1",
+ "json5": "^0.5.0",
+ "lodash": "^4.2.0",
+ "minimatch": "^3.0.2",
+ "path-is-absolute": "^1.0.0",
+ "private": "^0.1.6",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.0"
}
},
"babel-generator": {
@@ -305,14 +302,14 @@
"integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=",
"dev": true,
"requires": {
- "babel-messages": "6.23.0",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "detect-indent": "4.0.0",
- "jsesc": "1.3.0",
- "lodash": "4.17.4",
- "source-map": "0.5.6",
- "trim-right": "1.0.1"
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.25.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.2.0",
+ "source-map": "^0.5.0",
+ "trim-right": "^1.0.1"
}
},
"babel-helper-builder-binary-assignment-operator-visitor": {
@@ -321,9 +318,9 @@
"integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
"dev": true,
"requires": {
- "babel-helper-explode-assignable-expression": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-builder-react-jsx": {
@@ -332,9 +329,9 @@
"integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "esutils": "2.0.2"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1",
+ "esutils": "^2.0.0"
}
},
"babel-helper-call-delegate": {
@@ -343,10 +340,10 @@
"integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
"dev": true,
"requires": {
- "babel-helper-hoist-variables": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-define-map": {
@@ -355,10 +352,10 @@
"integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=",
"dev": true,
"requires": {
- "babel-helper-function-name": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "lodash": "4.17.4"
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1",
+ "lodash": "^4.2.0"
}
},
"babel-helper-explode-assignable-expression": {
@@ -367,9 +364,9 @@
"integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-function-name": {
@@ -378,11 +375,11 @@
"integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
"dev": true,
"requires": {
- "babel-helper-get-function-arity": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-get-function-arity": {
@@ -391,8 +388,8 @@
"integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-hoist-variables": {
@@ -401,8 +398,8 @@
"integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-optimise-call-expression": {
@@ -411,8 +408,8 @@
"integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-regex": {
@@ -421,9 +418,9 @@
"integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "lodash": "4.17.4"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1",
+ "lodash": "^4.2.0"
}
},
"babel-helper-remap-async-to-generator": {
@@ -432,11 +429,11 @@
"integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
"dev": true,
"requires": {
- "babel-helper-function-name": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-helper-replace-supers": {
@@ -445,12 +442,12 @@
"integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
"dev": true,
"requires": {
- "babel-helper-optimise-call-expression": "6.24.1",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-helpers": {
@@ -459,8 +456,8 @@
"integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-messages": {
@@ -469,7 +466,7 @@
"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-check-es2015-constants": {
@@ -478,7 +475,7 @@
"integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-syntax-async-functions": {
@@ -529,9 +526,9 @@
"integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
"dev": true,
"requires": {
- "babel-helper-remap-async-to-generator": "6.24.1",
- "babel-plugin-syntax-async-functions": "6.13.0",
- "babel-runtime": "6.23.0"
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-class-properties": {
@@ -540,10 +537,10 @@
"integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
"dev": true,
"requires": {
- "babel-helper-function-name": "6.24.1",
- "babel-plugin-syntax-class-properties": "6.13.0",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-helper-function-name": "^6.24.1",
+ "babel-plugin-syntax-class-properties": "^6.8.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-plugin-transform-es2015-arrow-functions": {
@@ -552,7 +549,7 @@
"integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-block-scoped-functions": {
@@ -561,7 +558,7 @@
"integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-block-scoping": {
@@ -570,11 +567,11 @@
"integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0",
- "lodash": "4.17.4"
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1",
+ "lodash": "^4.2.0"
}
},
"babel-plugin-transform-es2015-classes": {
@@ -583,15 +580,15 @@
"integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
"dev": true,
"requires": {
- "babel-helper-define-map": "6.24.1",
- "babel-helper-function-name": "6.24.1",
- "babel-helper-optimise-call-expression": "6.24.1",
- "babel-helper-replace-supers": "6.24.1",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-computed-properties": {
@@ -600,8 +597,8 @@
"integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-plugin-transform-es2015-destructuring": {
@@ -610,7 +607,7 @@
"integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-duplicate-keys": {
@@ -619,8 +616,8 @@
"integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-for-of": {
@@ -629,7 +626,7 @@
"integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-function-name": {
@@ -638,9 +635,9 @@
"integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
"dev": true,
"requires": {
- "babel-helper-function-name": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-literals": {
@@ -649,7 +646,7 @@
"integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-modules-amd": {
@@ -658,9 +655,9 @@
"integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
"dev": true,
"requires": {
- "babel-plugin-transform-es2015-modules-commonjs": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-plugin-transform-es2015-modules-commonjs": {
@@ -669,10 +666,10 @@
"integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=",
"dev": true,
"requires": {
- "babel-plugin-transform-strict-mode": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-modules-systemjs": {
@@ -681,9 +678,9 @@
"integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
"dev": true,
"requires": {
- "babel-helper-hoist-variables": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-plugin-transform-es2015-modules-umd": {
@@ -692,9 +689,9 @@
"integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
"dev": true,
"requires": {
- "babel-plugin-transform-es2015-modules-amd": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0"
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
"babel-plugin-transform-es2015-object-super": {
@@ -703,8 +700,8 @@
"integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
"dev": true,
"requires": {
- "babel-helper-replace-supers": "6.24.1",
- "babel-runtime": "6.23.0"
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-parameters": {
@@ -713,12 +710,12 @@
"integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
"dev": true,
"requires": {
- "babel-helper-call-delegate": "6.24.1",
- "babel-helper-get-function-arity": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-template": "6.25.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0"
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-shorthand-properties": {
@@ -727,8 +724,8 @@
"integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-spread": {
@@ -737,7 +734,7 @@
"integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-sticky-regex": {
@@ -746,9 +743,9 @@
"integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
"dev": true,
"requires": {
- "babel-helper-regex": "6.24.1",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-plugin-transform-es2015-template-literals": {
@@ -757,7 +754,7 @@
"integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-typeof-symbol": {
@@ -766,7 +763,7 @@
"integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-es2015-unicode-regex": {
@@ -775,9 +772,9 @@
"integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
"dev": true,
"requires": {
- "babel-helper-regex": "6.24.1",
- "babel-runtime": "6.23.0",
- "regexpu-core": "2.0.0"
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
}
},
"babel-plugin-transform-exponentiation-operator": {
@@ -786,9 +783,9 @@
"integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
"dev": true,
"requires": {
- "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
- "babel-plugin-syntax-exponentiation-operator": "6.13.0",
- "babel-runtime": "6.23.0"
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-flow-strip-types": {
@@ -797,8 +794,8 @@
"integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
"dev": true,
"requires": {
- "babel-plugin-syntax-flow": "6.18.0",
- "babel-runtime": "6.23.0"
+ "babel-plugin-syntax-flow": "^6.18.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-object-rest-spread": {
@@ -807,8 +804,8 @@
"integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=",
"dev": true,
"requires": {
- "babel-plugin-syntax-object-rest-spread": "6.13.0",
- "babel-runtime": "6.23.0"
+ "babel-plugin-syntax-object-rest-spread": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-react-display-name": {
@@ -817,7 +814,7 @@
"integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0"
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-react-jsx": {
@@ -826,9 +823,9 @@
"integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
"dev": true,
"requires": {
- "babel-helper-builder-react-jsx": "6.24.1",
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.23.0"
+ "babel-helper-builder-react-jsx": "^6.24.1",
+ "babel-plugin-syntax-jsx": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-react-jsx-self": {
@@ -837,8 +834,8 @@
"integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
"dev": true,
"requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.23.0"
+ "babel-plugin-syntax-jsx": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-react-jsx-source": {
@@ -847,8 +844,8 @@
"integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
"dev": true,
"requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.23.0"
+ "babel-plugin-syntax-jsx": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-regenerator": {
@@ -866,8 +863,8 @@
"integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
"babel-polyfill": {
@@ -876,9 +873,9 @@
"integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "core-js": "2.4.1",
- "regenerator-runtime": "0.10.5"
+ "babel-runtime": "^6.22.0",
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.10.0"
},
"dependencies": {
"core-js": {
@@ -895,30 +892,30 @@
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true,
"requires": {
- "babel-plugin-check-es2015-constants": "6.22.0",
- "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
- "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
- "babel-plugin-transform-es2015-block-scoping": "6.24.1",
- "babel-plugin-transform-es2015-classes": "6.24.1",
- "babel-plugin-transform-es2015-computed-properties": "6.24.1",
- "babel-plugin-transform-es2015-destructuring": "6.23.0",
- "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
- "babel-plugin-transform-es2015-for-of": "6.23.0",
- "babel-plugin-transform-es2015-function-name": "6.24.1",
- "babel-plugin-transform-es2015-literals": "6.22.0",
- "babel-plugin-transform-es2015-modules-amd": "6.24.1",
- "babel-plugin-transform-es2015-modules-commonjs": "6.24.1",
- "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
- "babel-plugin-transform-es2015-modules-umd": "6.24.1",
- "babel-plugin-transform-es2015-object-super": "6.24.1",
- "babel-plugin-transform-es2015-parameters": "6.24.1",
- "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
- "babel-plugin-transform-es2015-spread": "6.22.0",
- "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
- "babel-plugin-transform-es2015-template-literals": "6.22.0",
- "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
- "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
- "babel-plugin-transform-regenerator": "6.24.1"
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.24.1",
+ "babel-plugin-transform-es2015-classes": "^6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "^6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "^6.22.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1",
+ "babel-plugin-transform-es2015-for-of": "^6.22.0",
+ "babel-plugin-transform-es2015-function-name": "^6.24.1",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "^6.24.1",
+ "babel-plugin-transform-es2015-object-super": "^6.24.1",
+ "babel-plugin-transform-es2015-parameters": "^6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.24.1",
+ "babel-plugin-transform-regenerator": "^6.24.1"
}
},
"babel-preset-es2016": {
@@ -927,7 +924,7 @@
"integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=",
"dev": true,
"requires": {
- "babel-plugin-transform-exponentiation-operator": "6.24.1"
+ "babel-plugin-transform-exponentiation-operator": "^6.24.1"
}
},
"babel-preset-es2017": {
@@ -936,8 +933,8 @@
"integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=",
"dev": true,
"requires": {
- "babel-plugin-syntax-trailing-function-commas": "6.22.0",
- "babel-plugin-transform-async-to-generator": "6.24.1"
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.24.1"
}
},
"babel-preset-flow": {
@@ -946,7 +943,7 @@
"integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
"dev": true,
"requires": {
- "babel-plugin-transform-flow-strip-types": "6.22.0"
+ "babel-plugin-transform-flow-strip-types": "^6.22.0"
}
},
"babel-preset-latest": {
@@ -955,9 +952,9 @@
"integrity": "sha1-Z33gaRVKdIXC0lxXfAL2JLhbheg=",
"dev": true,
"requires": {
- "babel-preset-es2015": "6.24.1",
- "babel-preset-es2016": "6.24.1",
- "babel-preset-es2017": "6.24.1"
+ "babel-preset-es2015": "^6.24.1",
+ "babel-preset-es2016": "^6.24.1",
+ "babel-preset-es2017": "^6.24.1"
}
},
"babel-preset-react": {
@@ -966,12 +963,12 @@
"integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
"dev": true,
"requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-plugin-transform-react-display-name": "6.25.0",
- "babel-plugin-transform-react-jsx": "6.24.1",
- "babel-plugin-transform-react-jsx-self": "6.22.0",
- "babel-plugin-transform-react-jsx-source": "6.22.0",
- "babel-preset-flow": "6.23.0"
+ "babel-plugin-syntax-jsx": "^6.3.13",
+ "babel-plugin-transform-react-display-name": "^6.23.0",
+ "babel-plugin-transform-react-jsx": "^6.24.1",
+ "babel-plugin-transform-react-jsx-self": "^6.22.0",
+ "babel-plugin-transform-react-jsx-source": "^6.22.0",
+ "babel-preset-flow": "^6.23.0"
}
},
"babel-register": {
@@ -980,13 +977,13 @@
"integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
"dev": true,
"requires": {
- "babel-core": "6.25.0",
- "babel-runtime": "6.23.0",
- "core-js": "2.4.1",
- "home-or-tmp": "2.0.0",
- "lodash": "4.17.4",
- "mkdirp": "0.5.1",
- "source-map-support": "0.4.15"
+ "babel-core": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "core-js": "^2.4.0",
+ "home-or-tmp": "^2.0.0",
+ "lodash": "^4.2.0",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.4.2"
},
"dependencies": {
"core-js": {
@@ -1003,8 +1000,8 @@
"integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
"dev": true,
"requires": {
- "core-js": "2.4.1",
- "regenerator-runtime": "0.10.5"
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.10.0"
},
"dependencies": {
"core-js": {
@@ -1021,11 +1018,11 @@
"integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-traverse": "6.25.0",
- "babel-types": "6.25.0",
- "babylon": "6.17.3",
- "lodash": "4.17.4"
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.25.0",
+ "babel-types": "^6.25.0",
+ "babylon": "^6.17.2",
+ "lodash": "^4.2.0"
}
},
"babel-traverse": {
@@ -1034,15 +1031,15 @@
"integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=",
"dev": true,
"requires": {
- "babel-code-frame": "6.22.0",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "babylon": "6.17.3",
- "debug": "2.6.8",
- "globals": "9.18.0",
- "invariant": "2.2.2",
- "lodash": "4.17.4"
+ "babel-code-frame": "^6.22.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.25.0",
+ "babylon": "^6.17.2",
+ "debug": "^2.2.0",
+ "globals": "^9.0.0",
+ "invariant": "^2.2.0",
+ "lodash": "^4.2.0"
}
},
"babel-types": {
@@ -1051,10 +1048,10 @@
"integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "esutils": "2.0.2",
- "lodash": "4.17.4",
- "to-fast-properties": "1.0.3"
+ "babel-runtime": "^6.22.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.2.0",
+ "to-fast-properties": "^1.0.1"
}
},
"babylon": {
@@ -1088,7 +1085,7 @@
"dev": true,
"optional": true,
"requires": {
- "tweetnacl": "0.14.5"
+ "tweetnacl": "^0.14.3"
}
},
"binary": {
@@ -1097,8 +1094,8 @@
"integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
"dev": true,
"requires": {
- "buffers": "0.1.1",
- "chainsaw": "0.1.0"
+ "buffers": "~0.1.1",
+ "chainsaw": "~0.1.0"
}
},
"binary-extensions": {
@@ -1113,7 +1110,7 @@
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true,
"requires": {
- "inherits": "2.0.3"
+ "inherits": "~2.0.0"
}
},
"bluebird": {
@@ -1128,7 +1125,7 @@
"integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
"dev": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"bplist-creator": {
@@ -1138,7 +1135,7 @@
"dev": true,
"optional": true,
"requires": {
- "stream-buffers": "2.2.0"
+ "stream-buffers": "~2.2.0"
}
},
"brace-expansion": {
@@ -1146,7 +1143,7 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
"requires": {
- "balanced-match": "1.0.0",
+ "balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
@@ -1156,9 +1153,9 @@
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"dev": true,
"requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
}
},
"buffer-from": {
@@ -1168,7 +1165,7 @@
"dev": true,
"optional": true,
"requires": {
- "is-array-buffer-x": "1.7.0"
+ "is-array-buffer-x": "^1.0.13"
}
},
"buffers": {
@@ -1187,7 +1184,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/cached-constructors-x/-/cached-constructors-x-1.0.0.tgz",
"integrity": "sha512-JVP0oilYlPgBTD8bkQ+of7hSIJRtydCCJiMtzdRMXVQ98gdj0NyrJTZzbu5wtlO26Ev/1HXRTtbBNsVlLJ3+3A==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"camelcase": {
"version": "2.1.1",
@@ -1201,8 +1199,8 @@
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
"requires": {
- "camelcase": "2.1.1",
- "map-obj": "1.0.1"
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
}
},
"caseless": {
@@ -1217,7 +1215,7 @@
"integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
"dev": true,
"requires": {
- "traverse": "0.3.9"
+ "traverse": ">=0.3.0 <0.4"
}
},
"chalk": {
@@ -1226,11 +1224,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
}
},
"chokidar": {
@@ -1239,15 +1237,15 @@
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"requires": {
- "anymatch": "1.3.0",
- "async-each": "1.0.1",
- "fsevents": "1.1.2",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
+ "anymatch": "^1.3.0",
+ "async-each": "^1.0.0",
+ "fsevents": "^1.0.0",
+ "glob-parent": "^2.0.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^2.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0"
}
},
"chromium-pickle-js": {
@@ -1262,9 +1260,9 @@
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
}
},
"co": {
@@ -1297,7 +1295,7 @@
"integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
"dev": true,
"requires": {
- "delayed-stream": "1.0.0"
+ "delayed-stream": "~1.0.0"
}
},
"commander": {
@@ -1305,7 +1303,7 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
"integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
"requires": {
- "graceful-readlink": "1.0.1"
+ "graceful-readlink": ">= 1.0.0"
}
},
"compare-version": {
@@ -1325,9 +1323,9 @@
"integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
"dev": true,
"requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.2.11",
- "typedarray": "0.0.6"
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
}
},
"console-control-strings": {
@@ -1342,11 +1340,6 @@
"integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
"dev": true
},
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -1360,23 +1353,13 @@
"dev": true,
"optional": true,
"requires": {
- "graceful-fs": "4.1.11",
- "mkdirp": "0.5.1",
- "nested-error-stacks": "1.0.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "readable-stream": "2.2.11"
- }
- },
- "create-react-class": {
- "version": "15.6.0",
- "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz",
- "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=",
- "requires": {
- "fbjs": "0.8.12",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1"
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nested-error-stacks": "^1.0.1",
+ "object-assign": "^4.0.1",
+ "pify": "^2.3.0",
+ "pinkie-promise": "^2.0.0",
+ "readable-stream": "^2.1.4"
}
},
"cross-spawn": {
@@ -1385,8 +1368,8 @@
"integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"dev": true,
"requires": {
- "lru-cache": "4.1.1",
- "which": "1.2.14"
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
}
},
"cross-spawn-async": {
@@ -1396,8 +1379,8 @@
"dev": true,
"optional": true,
"requires": {
- "lru-cache": "4.1.1",
- "which": "1.2.14"
+ "lru-cache": "^4.0.0",
+ "which": "^1.2.8"
}
},
"cross-unzip": {
@@ -1411,7 +1394,7 @@
"integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
"dev": true,
"requires": {
- "boom": "2.10.1"
+ "boom": "2.x.x"
}
},
"cuint": {
@@ -1426,7 +1409,7 @@
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
- "array-find-index": "1.0.2"
+ "array-find-index": "^1.0.1"
}
},
"d": {
@@ -1434,7 +1417,7 @@
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"requires": {
- "es5-ext": "0.10.23"
+ "es5-ext": "^0.10.9"
}
},
"d3": {
@@ -1479,11 +1462,11 @@
"resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.2.0.tgz",
"integrity": "sha1-syMfT5OGJBR13v4cVXv9P94QZfs=",
"requires": {
- "d3-dispatch": "1.0.3",
- "d3-drag": "1.1.0",
- "d3-interpolate": "1.1.5",
- "d3-selection": "1.1.0",
- "d3-transition": "1.1.0"
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
}
}
}
@@ -1503,11 +1486,11 @@
"resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz",
"integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=",
"requires": {
- "d3-dispatch": "1.0.3",
- "d3-drag": "1.1.0",
- "d3-interpolate": "1.1.5",
- "d3-selection": "1.1.0",
- "d3-transition": "1.1.0"
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
}
},
"d3-chord": {
@@ -1515,8 +1498,8 @@
"resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz",
"integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=",
"requires": {
- "d3-array": "1.2.0",
- "d3-path": "1.0.5"
+ "d3-array": "1",
+ "d3-path": "1"
}
},
"d3-collection": {
@@ -1539,8 +1522,8 @@
"resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.1.0.tgz",
"integrity": "sha1-Skm013pC6ePVoO87SSsUqqLlpzM=",
"requires": {
- "d3-dispatch": "1.0.3",
- "d3-selection": "1.1.0"
+ "d3-dispatch": "1",
+ "d3-selection": "1"
}
},
"d3-dsv": {
@@ -1548,9 +1531,9 @@
"resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.5.tgz",
"integrity": "sha1-QZ99tH9ih4n8P9tjbmeESdCCETY=",
"requires": {
- "commander": "2.9.0",
- "iconv-lite": "0.4.18",
- "rw": "1.3.3"
+ "commander": "2",
+ "iconv-lite": "0.4",
+ "rw": "1"
}
},
"d3-ease": {
@@ -1563,10 +1546,10 @@
"resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.0.6.tgz",
"integrity": "sha1-6n4bdzDiZkzTFPWU1nGMV8wTK3k=",
"requires": {
- "d3-collection": "1.0.3",
- "d3-dispatch": "1.0.3",
- "d3-quadtree": "1.0.3",
- "d3-timer": "1.0.5"
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-quadtree": "1",
+ "d3-timer": "1"
}
},
"d3-format": {
@@ -1579,7 +1562,7 @@
"resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.6.4.tgz",
"integrity": "sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk=",
"requires": {
- "d3-array": "1.2.0"
+ "d3-array": "1"
}
},
"d3-hierarchy": {
@@ -1592,7 +1575,7 @@
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz",
"integrity": "sha1-aeCZ/zkhRxblY8muw+qdHqS4p58=",
"requires": {
- "d3-color": "1.0.3"
+ "d3-color": "1"
}
},
"d3-path": {
@@ -1625,10 +1608,10 @@
"resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.5.tgz",
"integrity": "sha1-TarpRtHdDVff4B8CKVY1SVjVHyM=",
"requires": {
- "d3-collection": "1.0.3",
- "d3-dispatch": "1.0.3",
- "d3-dsv": "1.0.5",
- "xmlhttprequest": "1.8.0"
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-dsv": "1",
+ "xmlhttprequest": "1"
}
},
"d3-scale": {
@@ -1636,13 +1619,13 @@
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz",
"integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=",
"requires": {
- "d3-array": "1.2.0",
- "d3-collection": "1.0.3",
- "d3-color": "1.0.3",
- "d3-format": "1.2.0",
- "d3-interpolate": "1.1.5",
- "d3-time": "1.0.6",
- "d3-time-format": "2.0.5"
+ "d3-array": "^1.2.0",
+ "d3-collection": "1",
+ "d3-color": "1",
+ "d3-format": "1",
+ "d3-interpolate": "1",
+ "d3-time": "1",
+ "d3-time-format": "2"
}
},
"d3-selection": {
@@ -1655,7 +1638,7 @@
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.1.1.tgz",
"integrity": "sha1-UKEDfkinn1uP2dWM3lJ5musfdyM=",
"requires": {
- "d3-path": "1.0.5"
+ "d3-path": "1"
}
},
"d3-time": {
@@ -1668,7 +1651,7 @@
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.0.5.tgz",
"integrity": "sha1-nXeAIE98kRnJFwsaVttN6aivly4=",
"requires": {
- "d3-time": "1.0.6"
+ "d3-time": "1"
}
},
"d3-timer": {
@@ -1681,12 +1664,12 @@
"resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.0.tgz",
"integrity": "sha1-z8hcdOUjkyQpBUZiNXKZBWDDlm8=",
"requires": {
- "d3-color": "1.0.3",
- "d3-dispatch": "1.0.3",
- "d3-ease": "1.0.3",
- "d3-interpolate": "1.1.5",
- "d3-selection": "1.1.0",
- "d3-timer": "1.0.5"
+ "d3-color": "1",
+ "d3-dispatch": "1",
+ "d3-ease": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "^1.1.0",
+ "d3-timer": "1"
}
},
"d3-voronoi": {
@@ -1699,11 +1682,11 @@
"resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz",
"integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==",
"requires": {
- "d3-dispatch": "1.0.3",
- "d3-drag": "1.1.0",
- "d3-interpolate": "1.1.5",
- "d3-selection": "1.1.0",
- "d3-transition": "1.1.0"
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
}
},
"dagre": {
@@ -1711,8 +1694,8 @@
"resolved": "https://registry.npmjs.org/dagre/-/dagre-0.7.4.tgz",
"integrity": "sha1-3nLw50pVDOEc5jjwoTb+1xI5gCI=",
"requires": {
- "graphlib": "1.0.7",
- "lodash": "3.10.1"
+ "graphlib": "^1.0.5",
+ "lodash": "^3.10.0"
},
"dependencies": {
"graphlib": {
@@ -1720,7 +1703,7 @@
"resolved": "https://registry.npmjs.org/graphlib/-/graphlib-1.0.7.tgz",
"integrity": "sha1-DKst8P/mq+BwsmJb+h7bbslnuLE=",
"requires": {
- "lodash": "3.10.1"
+ "lodash": "^3.10.0"
}
},
"lodash": {
@@ -1736,7 +1719,7 @@
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -1768,12 +1751,12 @@
"integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=",
"dev": true,
"requires": {
- "binary": "0.3.0",
- "graceful-fs": "4.1.11",
- "mkpath": "0.1.0",
- "nopt": "3.0.6",
- "q": "1.5.0",
- "readable-stream": "1.1.14",
+ "binary": "^0.3.0",
+ "graceful-fs": "^4.1.3",
+ "mkpath": "^0.1.0",
+ "nopt": "^3.0.1",
+ "q": "^1.1.2",
+ "readable-stream": "^1.1.8",
"touch": "0.0.3"
},
"dependencies": {
@@ -1789,10 +1772,10 @@
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
"isarray": "0.0.1",
- "string_decoder": "0.10.31"
+ "string_decoder": "~0.10.x"
}
},
"string_decoder": {
@@ -1827,7 +1810,7 @@
"integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
"dev": true,
"requires": {
- "repeating": "2.0.1"
+ "repeating": "^2.0.0"
}
},
"ds-store": {
@@ -1837,9 +1820,9 @@
"dev": true,
"optional": true,
"requires": {
- "bplist-creator": "0.0.7",
- "macos-alias": "0.2.11",
- "tn1150": "0.1.0"
+ "bplist-creator": "~0.0.3",
+ "macos-alias": "~0.2.5",
+ "tn1150": "^0.1.0"
}
},
"ecc-jsbn": {
@@ -1849,7 +1832,7 @@
"dev": true,
"optional": true,
"requires": {
- "jsbn": "0.1.1"
+ "jsbn": "~0.1.0"
}
},
"electron": {
@@ -1858,9 +1841,9 @@
"integrity": "sha1-g5yrCgWYg1oQDc7t4hWYi6mcMls=",
"dev": true,
"requires": {
- "@types/node": "7.0.31",
- "electron-download": "3.3.0",
- "extract-zip": "1.6.5"
+ "@types/node": "^7.0.18",
+ "electron-download": "^3.0.1",
+ "extract-zip": "^1.0.3"
}
},
"electron-devtools-installer": {
@@ -1870,8 +1853,8 @@
"requires": {
"7zip": "0.0.6",
"cross-unzip": "0.0.2",
- "rimraf": "2.6.1",
- "semver": "5.3.0"
+ "rimraf": "^2.5.2",
+ "semver": "^5.3.0"
}
},
"electron-download": {
@@ -1880,15 +1863,15 @@
"integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
"dev": true,
"requires": {
- "debug": "2.6.8",
- "fs-extra": "0.30.0",
- "home-path": "1.0.5",
- "minimist": "1.2.0",
- "nugget": "2.0.1",
- "path-exists": "2.1.0",
- "rc": "1.2.1",
- "semver": "5.3.0",
- "sumchecker": "1.3.1"
+ "debug": "^2.2.0",
+ "fs-extra": "^0.30.0",
+ "home-path": "^1.0.1",
+ "minimist": "^1.2.0",
+ "nugget": "^2.0.0",
+ "path-exists": "^2.1.0",
+ "rc": "^1.1.2",
+ "semver": "^5.3.0",
+ "sumchecker": "^1.2.0"
},
"dependencies": {
"fs-extra": {
@@ -1897,11 +1880,11 @@
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.1"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
}
},
"minimist": {
@@ -1918,9 +1901,9 @@
"integrity": "sha1-3oNfAgCbg/guQIA2rDFGLD1sskk=",
"dev": true,
"requires": {
- "appdmg": "0.4.5",
- "debug": "2.6.8",
- "minimist": "1.2.0"
+ "appdmg": "^0.4.5",
+ "debug": "^2.2.0",
+ "minimist": "^1.1.1"
},
"dependencies": {
"minimist": {
@@ -1937,13 +1920,13 @@
"integrity": "sha1-I5ji18q1wdjD7quxzUkDdlKOw5o=",
"dev": true,
"requires": {
- "bluebird": "3.5.0",
- "compare-version": "0.1.2",
- "debug": "2.6.8",
- "isbinaryfile": "3.0.2",
- "minimist": "1.2.0",
- "plist": "2.1.0",
- "tempfile": "1.1.1"
+ "bluebird": "^3.4.7",
+ "compare-version": "^0.1.2",
+ "debug": "^2.6.1",
+ "isbinaryfile": "^3.0.2",
+ "minimist": "^1.2.0",
+ "plist": "^2.0.1",
+ "tempfile": "^1.1.1"
},
"dependencies": {
"minimist": {
@@ -1960,20 +1943,20 @@
"integrity": "sha1-ImB6RBFstMG85yJGeDmQyuT8+QM=",
"dev": true,
"requires": {
- "asar": "0.13.0",
- "debug": "2.6.8",
- "electron-download": "4.1.0",
- "electron-osx-sign": "0.4.6",
- "extract-zip": "1.6.5",
- "fs-extra": "3.0.1",
- "get-package-info": "1.0.0",
- "minimist": "1.2.0",
- "plist": "2.1.0",
- "rcedit": "0.9.0",
- "resolve": "1.3.3",
- "run-series": "1.1.4",
- "sanitize-filename": "1.6.1",
- "semver": "5.3.0"
+ "asar": "^0.13.0",
+ "debug": "^2.2.0",
+ "electron-download": "^4.0.0",
+ "electron-osx-sign": "^0.4.1",
+ "extract-zip": "^1.0.3",
+ "fs-extra": "^3.0.0",
+ "get-package-info": "^1.0.0",
+ "minimist": "^1.1.1",
+ "plist": "^2.0.0",
+ "rcedit": "^0.9.0",
+ "resolve": "^1.1.6",
+ "run-series": "^1.1.1",
+ "sanitize-filename": "^1.6.0",
+ "semver": "^5.3.0"
},
"dependencies": {
"electron-download": {
@@ -1982,15 +1965,15 @@
"integrity": "sha1-v5MsdG8vh//MCdHdRy8v9rkYeEU=",
"dev": true,
"requires": {
- "debug": "2.6.8",
- "env-paths": "1.0.0",
- "fs-extra": "2.1.2",
- "minimist": "1.2.0",
- "nugget": "2.0.1",
- "path-exists": "3.0.0",
- "rc": "1.2.1",
- "semver": "5.3.0",
- "sumchecker": "2.0.2"
+ "debug": "^2.2.0",
+ "env-paths": "^1.0.0",
+ "fs-extra": "^2.0.0",
+ "minimist": "^1.2.0",
+ "nugget": "^2.0.0",
+ "path-exists": "^3.0.0",
+ "rc": "^1.1.2",
+ "semver": "^5.3.0",
+ "sumchecker": "^2.0.1"
},
"dependencies": {
"fs-extra": {
@@ -1999,8 +1982,8 @@
"integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0"
}
}
}
@@ -2011,9 +1994,9 @@
"integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "3.0.0",
- "universalify": "0.1.0"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^3.0.0",
+ "universalify": "^0.1.0"
},
"dependencies": {
"jsonfile": {
@@ -2022,7 +2005,7 @@
"integrity": "sha1-kufHRE5f/V+jLmqa6LhQNN+DR9A=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11"
+ "graceful-fs": "^4.1.6"
}
}
}
@@ -2045,7 +2028,7 @@
"integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
"dev": true,
"requires": {
- "debug": "2.6.8"
+ "debug": "^2.2.0"
}
}
}
@@ -2056,15 +2039,7 @@
"integrity": "sha1-YW6Qbl29HM6XIi7kKZdRw7KFvys=",
"dev": true,
"requires": {
- "chokidar": "1.7.0"
- }
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "0.4.18"
+ "chokidar": "^1.5.1"
}
},
"env-paths": {
@@ -2079,7 +2054,7 @@
"integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
"dev": true,
"requires": {
- "is-arrayish": "0.2.1"
+ "is-arrayish": "^0.2.1"
}
},
"es5-ext": {
@@ -2087,8 +2062,8 @@
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz",
"integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=",
"requires": {
- "es6-iterator": "2.0.1",
- "es6-symbol": "3.1.1"
+ "es6-iterator": "2",
+ "es6-symbol": "~3.1"
}
},
"es6-iterator": {
@@ -2096,9 +2071,9 @@
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
"integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=",
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.23",
- "es6-symbol": "3.1.1"
+ "d": "1",
+ "es5-ext": "^0.10.14",
+ "es6-symbol": "^3.1"
}
},
"es6-promise": {
@@ -2112,8 +2087,8 @@
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
"requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.23"
+ "d": "1",
+ "es5-ext": "~0.10.14"
}
},
"escape-string-regexp": {
@@ -2135,12 +2110,12 @@
"dev": true,
"optional": true,
"requires": {
- "cross-spawn-async": "2.2.5",
- "is-stream": "1.1.0",
- "npm-run-path": "1.0.0",
- "object-assign": "4.1.1",
- "path-key": "1.0.0",
- "strip-eof": "1.0.0"
+ "cross-spawn-async": "^2.1.1",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "path-key": "^1.0.0",
+ "strip-eof": "^1.0.0"
}
},
"expand-brackets": {
@@ -2149,7 +2124,7 @@
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"dev": true,
"requires": {
- "is-posix-bracket": "0.1.1"
+ "is-posix-bracket": "^0.1.0"
}
},
"expand-range": {
@@ -2158,7 +2133,7 @@
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"dev": true,
"requires": {
- "fill-range": "2.2.3"
+ "fill-range": "^2.1.0"
}
},
"extend": {
@@ -2173,7 +2148,7 @@
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"dev": true,
"requires": {
- "is-extglob": "1.0.0"
+ "is-extglob": "^1.0.0"
}
},
"extract-zip": {
@@ -2220,27 +2195,13 @@
"integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
"dev": true
},
- "fbjs": {
- "version": "0.8.12",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz",
- "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=",
- "requires": {
- "core-js": "1.2.7",
- "isomorphic-fetch": "2.2.1",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "promise": "7.3.0",
- "setimmediate": "1.0.5",
- "ua-parser-js": "0.7.12"
- }
- },
"fd-slicer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
"integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
"dev": true,
"requires": {
- "pend": "1.2.0"
+ "pend": "~1.2.0"
}
},
"filename-regex": {
@@ -2255,11 +2216,11 @@
"integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
"dev": true,
"requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^1.1.3",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
}
},
"find-up": {
@@ -2268,12 +2229,13 @@
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
}
},
"fira-code": {
- "version": "github:mlajtos/FiraCode#c2934b80c86716da96da20732b3e9e489cfa2db9"
+ "version": "github:mlajtos/FiraCode#c2934b80c86716da96da20732b3e9e489cfa2db9",
+ "from": "github:mlajtos/FiraCode"
},
"fmix": {
"version": "0.1.0",
@@ -2282,7 +2244,7 @@
"dev": true,
"optional": true,
"requires": {
- "imul": "1.0.1"
+ "imul": "^1.0.0"
}
},
"for-in": {
@@ -2297,7 +2259,7 @@
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"dev": true,
"requires": {
- "for-in": "1.0.2"
+ "for-in": "^1.0.1"
}
},
"forever-agent": {
@@ -2312,9 +2274,9 @@
"integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
"dev": true,
"requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
}
},
"fs-extra": {
@@ -2322,9 +2284,19 @@
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
"integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "universalify": "0.1.0"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "dependencies": {
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ }
}
},
"fs-readdir-recursive": {
@@ -2340,7 +2312,7 @@
"dev": true,
"optional": true,
"requires": {
- "random-path": "0.1.1"
+ "random-path": "^0.1.0"
}
},
"fs-xattr": {
@@ -2350,8 +2322,8 @@
"dev": true,
"optional": true,
"requires": {
- "buffer-from": "0.1.1",
- "nan": "2.6.2"
+ "buffer-from": "^0.1.1",
+ "nan": "^2.3.2"
}
},
"fs.realpath": {
@@ -2366,8 +2338,8 @@
"dev": true,
"optional": true,
"requires": {
- "nan": "2.6.2",
- "node-pre-gyp": "0.6.36"
+ "nan": "^2.3.0",
+ "node-pre-gyp": "^0.6.36"
},
"dependencies": {
"abbrev": {
@@ -2382,14 +2354,15 @@
"dev": true,
"optional": true,
"requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
}
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.1.1",
@@ -2403,8 +2376,8 @@
"dev": true,
"optional": true,
"requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.2.9"
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
}
},
"asn1": {
@@ -2440,7 +2413,8 @@
"balanced-match": {
"version": "0.4.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"bcrypt-pbkdf": {
"version": "1.0.1",
@@ -2448,38 +2422,42 @@
"dev": true,
"optional": true,
"requires": {
- "tweetnacl": "0.14.5"
+ "tweetnacl": "^0.14.3"
}
},
"block-stream": {
"version": "0.0.9",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "inherits": "2.0.3"
+ "inherits": "~2.0.0"
}
},
"boom": {
"version": "2.10.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"brace-expansion": {
"version": "1.1.7",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "balanced-match": "0.4.2",
+ "balanced-match": "^0.4.1",
"concat-map": "0.0.1"
}
},
"buffer-shims": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"caseless": {
"version": "0.12.0",
@@ -2496,30 +2474,35 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"combined-stream": {
"version": "1.0.5",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "delayed-stream": "1.0.0"
+ "delayed-stream": "~1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"cryptiles": {
"version": "2.0.5",
@@ -2527,7 +2510,7 @@
"dev": true,
"optional": true,
"requires": {
- "boom": "2.10.1"
+ "boom": "2.x.x"
}
},
"dashdash": {
@@ -2536,7 +2519,7 @@
"dev": true,
"optional": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -2565,7 +2548,8 @@
"delayed-stream": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"delegates": {
"version": "1.0.0",
@@ -2579,7 +2563,7 @@
"dev": true,
"optional": true,
"requires": {
- "jsbn": "0.1.1"
+ "jsbn": "~0.1.0"
}
},
"extend": {
@@ -2591,7 +2575,8 @@
"extsprintf": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"forever-agent": {
"version": "0.6.1",
@@ -2605,25 +2590,27 @@
"dev": true,
"optional": true,
"requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
}
},
"fs.realpath": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"fstream": {
"version": "1.0.11",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.1"
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
}
},
"fstream-ignore": {
@@ -2632,9 +2619,9 @@
"dev": true,
"optional": true,
"requires": {
- "fstream": "1.0.11",
- "inherits": "2.0.3",
- "minimatch": "3.0.4"
+ "fstream": "^1.0.0",
+ "inherits": "2",
+ "minimatch": "^3.0.0"
}
},
"gauge": {
@@ -2643,14 +2630,14 @@
"dev": true,
"optional": true,
"requires": {
- "aproba": "1.1.1",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
}
},
"getpass": {
@@ -2659,7 +2646,7 @@
"dev": true,
"optional": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -2674,19 +2661,21 @@
"version": "7.1.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.1.11",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"har-schema": {
"version": "1.0.5",
@@ -2700,8 +2689,8 @@
"dev": true,
"optional": true,
"requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
+ "ajv": "^4.9.1",
+ "har-schema": "^1.0.5"
}
},
"has-unicode": {
@@ -2716,16 +2705,17 @@
"dev": true,
"optional": true,
"requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
+ "boom": "2.x.x",
+ "cryptiles": "2.x.x",
+ "hoek": "2.x.x",
+ "sntp": "1.x.x"
}
},
"hoek": {
"version": "2.16.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"http-signature": {
"version": "1.1.1",
@@ -2733,24 +2723,26 @@
"dev": true,
"optional": true,
"requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.0"
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
}
},
"inflight": {
"version": "1.0.6",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.4",
@@ -2762,8 +2754,9 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"is-typedarray": {
@@ -2775,7 +2768,8 @@
"isarray": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"isstream": {
"version": "0.1.2",
@@ -2789,7 +2783,7 @@
"dev": true,
"optional": true,
"requires": {
- "jsbn": "0.1.1"
+ "jsbn": "~0.1.0"
}
},
"jsbn": {
@@ -2810,7 +2804,7 @@
"dev": true,
"optional": true,
"requires": {
- "jsonify": "0.0.0"
+ "jsonify": "~0.0.0"
}
},
"json-stringify-safe": {
@@ -2848,33 +2842,38 @@
"mime-db": {
"version": "1.27.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"mime-types": {
"version": "2.1.15",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "mime-db": "1.27.0"
+ "mime-db": "~1.27.0"
}
},
"minimatch": {
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "brace-expansion": "1.1.7"
+ "brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -2891,15 +2890,15 @@
"dev": true,
"optional": true,
"requires": {
- "mkdirp": "0.5.1",
- "nopt": "4.0.1",
- "npmlog": "4.1.0",
- "rc": "1.2.1",
- "request": "2.81.0",
- "rimraf": "2.6.1",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.4.0"
+ "mkdirp": "^0.5.1",
+ "nopt": "^4.0.1",
+ "npmlog": "^4.0.2",
+ "rc": "^1.1.7",
+ "request": "^2.81.0",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^2.2.1",
+ "tar-pack": "^3.4.0"
}
},
"nopt": {
@@ -2908,8 +2907,8 @@
"dev": true,
"optional": true,
"requires": {
- "abbrev": "1.1.0",
- "osenv": "0.1.4"
+ "abbrev": "1",
+ "osenv": "^0.1.4"
}
},
"npmlog": {
@@ -2918,16 +2917,17 @@
"dev": true,
"optional": true,
"requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
}
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"oauth-sign": {
"version": "0.8.2",
@@ -2945,8 +2945,9 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
"os-homedir": {
@@ -2967,14 +2968,15 @@
"dev": true,
"optional": true,
"requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"performance-now": {
"version": "0.2.0",
@@ -2985,7 +2987,8 @@
"process-nextick-args": {
"version": "1.0.7",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"punycode": {
"version": "1.4.1",
@@ -3005,10 +3008,10 @@
"dev": true,
"optional": true,
"requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
+ "deep-extend": "~0.4.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
@@ -3023,14 +3026,15 @@
"version": "2.2.9",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "1.0.1",
- "util-deprecate": "1.0.2"
+ "buffer-shims": "~1.0.0",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~1.0.0",
+ "util-deprecate": "~1.0.1"
}
},
"request": {
@@ -3039,42 +3043,44 @@
"dev": true,
"optional": true,
"requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.0.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.0.1"
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.1.1",
+ "har-validator": "~4.2.1",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "oauth-sign": "~0.8.1",
+ "performance-now": "^0.2.0",
+ "qs": "~6.4.0",
+ "safe-buffer": "^5.0.1",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.0.0"
}
},
"rimraf": {
"version": "2.6.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "glob": "7.1.2"
+ "glob": "^7.0.5"
}
},
"safe-buffer": {
"version": "5.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"semver": {
"version": "5.3.0",
@@ -3100,7 +3106,7 @@
"dev": true,
"optional": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"sshpk": {
@@ -3109,15 +3115,15 @@
"dev": true,
"optional": true,
"requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jodid25519": "1.0.2",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jodid25519": "^1.0.0",
+ "jsbn": "~0.1.0",
+ "tweetnacl": "~0.14.0"
},
"dependencies": {
"assert-plus": {
@@ -3128,22 +3134,24 @@
}
}
},
- "string_decoder": {
- "version": "1.0.1",
+ "string-width": {
+ "version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "safe-buffer": "5.0.1"
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
}
},
- "string-width": {
- "version": "1.0.2",
+ "string_decoder": {
+ "version": "1.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
+ "safe-buffer": "^5.0.1"
}
},
"stringstream": {
@@ -3156,8 +3164,9 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
@@ -3170,10 +3179,11 @@
"version": "2.2.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
+ "block-stream": "*",
+ "fstream": "^1.0.2",
+ "inherits": "2"
}
},
"tar-pack": {
@@ -3182,14 +3192,14 @@
"dev": true,
"optional": true,
"requires": {
- "debug": "2.6.8",
- "fstream": "1.0.11",
- "fstream-ignore": "1.0.5",
- "once": "1.4.0",
- "readable-stream": "2.2.9",
- "rimraf": "2.6.1",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
+ "debug": "^2.2.0",
+ "fstream": "^1.0.10",
+ "fstream-ignore": "^1.0.5",
+ "once": "^1.3.3",
+ "readable-stream": "^2.1.4",
+ "rimraf": "^2.5.1",
+ "tar": "^2.2.1",
+ "uid-number": "^0.0.6"
}
},
"tough-cookie": {
@@ -3198,7 +3208,7 @@
"dev": true,
"optional": true,
"requires": {
- "punycode": "1.4.1"
+ "punycode": "^1.4.1"
}
},
"tunnel-agent": {
@@ -3207,7 +3217,7 @@
"dev": true,
"optional": true,
"requires": {
- "safe-buffer": "5.0.1"
+ "safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
@@ -3225,7 +3235,8 @@
"util-deprecate": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"uuid": {
"version": "3.0.1",
@@ -3248,13 +3259,14 @@
"dev": true,
"optional": true,
"requires": {
- "string-width": "1.0.2"
+ "string-width": "^1.0.2"
}
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
@@ -3264,10 +3276,10 @@
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.1"
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
}
},
"gauge": {
@@ -3276,14 +3288,14 @@
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"requires": {
- "aproba": "1.1.2",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
}
},
"gaze": {
@@ -3292,7 +3304,7 @@
"integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
"dev": true,
"requires": {
- "globule": "1.2.0"
+ "globule": "^1.0.0"
}
},
"generate-function": {
@@ -3309,7 +3321,7 @@
"dev": true,
"optional": true,
"requires": {
- "is-property": "1.0.2"
+ "is-property": "^1.0.0"
}
},
"get-caller-file": {
@@ -3324,10 +3336,10 @@
"integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=",
"dev": true,
"requires": {
- "bluebird": "3.5.0",
- "debug": "2.6.8",
- "lodash.get": "4.4.2",
- "read-pkg-up": "2.0.0"
+ "bluebird": "^3.1.1",
+ "debug": "^2.2.0",
+ "lodash.get": "^4.0.0",
+ "read-pkg-up": "^2.0.0"
},
"dependencies": {
"find-up": {
@@ -3336,7 +3348,7 @@
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "2.0.0"
+ "locate-path": "^2.0.0"
}
},
"load-json-file": {
@@ -3345,10 +3357,10 @@
"integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "strip-bom": "3.0.0"
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
}
},
"path-type": {
@@ -3357,7 +3369,7 @@
"integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
"dev": true,
"requires": {
- "pify": "2.3.0"
+ "pify": "^2.0.0"
}
},
"read-pkg": {
@@ -3366,9 +3378,9 @@
"integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
"dev": true,
"requires": {
- "load-json-file": "2.0.0",
- "normalize-package-data": "2.3.8",
- "path-type": "2.0.0"
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
}
},
"read-pkg-up": {
@@ -3377,8 +3389,8 @@
"integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
"dev": true,
"requires": {
- "find-up": "2.1.0",
- "read-pkg": "2.0.0"
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
}
},
"strip-bom": {
@@ -3401,7 +3413,7 @@
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0"
+ "assert-plus": "^1.0.0"
},
"dependencies": {
"assert-plus": {
@@ -3417,12 +3429,12 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
"glob-base": {
@@ -3431,8 +3443,8 @@
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"dev": true,
"requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
}
},
"glob-parent": {
@@ -3441,7 +3453,7 @@
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
- "is-glob": "2.0.1"
+ "is-glob": "^2.0.0"
}
},
"globals": {
@@ -3456,9 +3468,9 @@
"integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
"dev": true,
"requires": {
- "glob": "7.1.2",
- "lodash": "4.17.4",
- "minimatch": "3.0.4"
+ "glob": "~7.1.1",
+ "lodash": "~4.17.4",
+ "minimatch": "~3.0.2"
}
},
"graceful-fs": {
@@ -3476,7 +3488,7 @@
"resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz",
"integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=",
"requires": {
- "lodash": "4.17.4"
+ "lodash": "^4.11.1"
}
},
"har-schema": {
@@ -3491,8 +3503,8 @@
"integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
"dev": true,
"requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
+ "ajv": "^4.9.1",
+ "har-schema": "^1.0.5"
}
},
"has-ansi": {
@@ -3501,7 +3513,7 @@
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"has-own-property-x": {
@@ -3511,24 +3523,26 @@
"dev": true,
"optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "to-object-x": "1.5.0",
- "to-property-key-x": "2.0.2"
+ "cached-constructors-x": "^1.0.0",
+ "to-object-x": "^1.5.0",
+ "to-property-key-x": "^2.0.2"
}
},
"has-symbol-support-x": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz",
"integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"has-to-string-tag-x": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
"integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
"dev": true,
+ "optional": true,
"requires": {
- "has-symbol-support-x": "1.4.1"
+ "has-symbol-support-x": "^1.4.1"
}
},
"has-unicode": {
@@ -3543,10 +3557,10 @@
"integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
"dev": true,
"requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
+ "boom": "2.x.x",
+ "cryptiles": "2.x.x",
+ "hoek": "2.x.x",
+ "sntp": "1.x.x"
}
},
"hoek": {
@@ -3561,8 +3575,8 @@
"integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
"dev": true,
"requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
}
},
"home-path": {
@@ -3583,9 +3597,9 @@
"integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
"dev": true,
"requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.1"
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
}
},
"iconv-lite": {
@@ -3604,7 +3618,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz",
"integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"in-publish": {
"version": "2.0.0",
@@ -3618,7 +3633,7 @@
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"dev": true,
"requires": {
- "repeating": "2.0.1"
+ "repeating": "^2.0.0"
}
},
"infinity-x": {
@@ -3633,8 +3648,8 @@
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
"inherits": {
@@ -3654,7 +3669,7 @@
"integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
"dev": true,
"requires": {
- "loose-envify": "1.3.1"
+ "loose-envify": "^1.0.0"
}
},
"invert-kv": {
@@ -3670,11 +3685,11 @@
"dev": true,
"optional": true,
"requires": {
- "attempt-x": "1.1.1",
- "has-to-string-tag-x": "1.4.1",
- "is-object-like-x": "1.6.0",
- "object-get-own-property-descriptor-x": "3.2.0",
- "to-string-tag-x": "1.4.2"
+ "attempt-x": "^1.1.0",
+ "has-to-string-tag-x": "^1.4.1",
+ "is-object-like-x": "^1.5.1",
+ "object-get-own-property-descriptor-x": "^3.2.0",
+ "to-string-tag-x": "^1.4.1"
}
},
"is-arrayish": {
@@ -3689,7 +3704,7 @@
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"dev": true,
"requires": {
- "binary-extensions": "1.8.0"
+ "binary-extensions": "^1.0.0"
}
},
"is-buffer": {
@@ -3703,14 +3718,15 @@
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
"requires": {
- "builtin-modules": "1.1.1"
+ "builtin-modules": "^1.0.0"
}
},
"is-date-object": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
"integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-dotfile": {
"version": "1.0.3",
@@ -3724,7 +3740,7 @@
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"dev": true,
"requires": {
- "is-primitive": "2.0.0"
+ "is-primitive": "^2.0.0"
}
},
"is-extendable": {
@@ -3744,8 +3760,9 @@
"resolved": "https://registry.npmjs.org/is-falsey-x/-/is-falsey-x-1.0.1.tgz",
"integrity": "sha512-XWNZC4A+3FX1ECoMjspuEFgSdio82IWjqY/suE0gZ10QA7nzHd/KraRq7Tc5VEHtFRgTRyTdY6W+ykPrDnyoAQ==",
"dev": true,
+ "optional": true,
"requires": {
- "to-boolean-x": "1.0.1"
+ "to-boolean-x": "^1.0.1"
}
},
"is-finite": {
@@ -3754,7 +3771,7 @@
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"is-finite-x": {
@@ -3764,8 +3781,8 @@
"dev": true,
"optional": true,
"requires": {
- "infinity-x": "1.0.0",
- "is-nan-x": "1.0.1"
+ "infinity-x": "^1.0.0",
+ "is-nan-x": "^1.0.1"
}
},
"is-fullwidth-code-point": {
@@ -3774,7 +3791,7 @@
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
- "number-is-nan": "1.0.1"
+ "number-is-nan": "^1.0.0"
}
},
"is-function-x": {
@@ -3782,15 +3799,16 @@
"resolved": "https://registry.npmjs.org/is-function-x/-/is-function-x-3.3.0.tgz",
"integrity": "sha512-SreSSU1dlgYaXR5c0mm4qJHKYHIiGiEY+7Cd8/aRLLoMP/VvofD2XcWgBnP833ajpU5XzXbUSpfysnfKZLJFlg==",
"dev": true,
+ "optional": true,
"requires": {
- "attempt-x": "1.1.1",
- "has-to-string-tag-x": "1.4.1",
- "is-falsey-x": "1.0.1",
- "is-primitive": "2.0.0",
- "normalize-space-x": "3.0.0",
- "replace-comments-x": "2.0.0",
- "to-boolean-x": "1.0.1",
- "to-string-tag-x": "1.4.2"
+ "attempt-x": "^1.1.1",
+ "has-to-string-tag-x": "^1.4.1",
+ "is-falsey-x": "^1.0.1",
+ "is-primitive": "^2.0.0",
+ "normalize-space-x": "^3.0.0",
+ "replace-comments-x": "^2.0.0",
+ "to-boolean-x": "^1.0.1",
+ "to-string-tag-x": "^1.4.2"
}
},
"is-glob": {
@@ -3799,7 +3817,7 @@
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
- "is-extglob": "1.0.0"
+ "is-extglob": "^1.0.0"
}
},
"is-index-x": {
@@ -3809,11 +3827,11 @@
"dev": true,
"optional": true,
"requires": {
- "math-clamp-x": "1.2.0",
- "max-safe-integer": "1.0.1",
- "to-integer-x": "3.0.0",
- "to-number-x": "2.0.0",
- "to-string-symbols-supported-x": "1.0.0"
+ "math-clamp-x": "^1.2.0",
+ "max-safe-integer": "^1.0.1",
+ "to-integer-x": "^3.0.0",
+ "to-number-x": "^2.0.0",
+ "to-string-symbols-supported-x": "^1.0.0"
}
},
"is-my-json-valid": {
@@ -3823,10 +3841,10 @@
"dev": true,
"optional": true,
"requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
+ "generate-function": "^2.0.0",
+ "generate-object-property": "^1.1.0",
+ "jsonpointer": "^4.0.0",
+ "xtend": "^4.0.0"
},
"dependencies": {
"xtend": {
@@ -3842,16 +3860,18 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-nan-x/-/is-nan-x-1.0.1.tgz",
"integrity": "sha512-VfNJgfuT8USqKCYQss8g7sFvCzDnL+OOVMQoXhVoulZAyp0ZTj3oyZaaPrn2dxepAkKSQI2BiKHbBabX1DqVtw==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-nil-x": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/is-nil-x/-/is-nil-x-1.4.1.tgz",
"integrity": "sha512-cfTKWI5iSR04SSCzzugTH5tS2rYG7kwI8yl/AqWkyuxZ7k55cbA47Y7Lezdg1N9aaELd+UxLg628bdQeNQ6BUw==",
"dev": true,
+ "optional": true,
"requires": {
- "lodash.isnull": "3.0.0",
- "validate.io-undefined": "1.0.3"
+ "lodash.isnull": "^3.0.0",
+ "validate.io-undefined": "^1.0.3"
}
},
"is-number": {
@@ -3860,7 +3880,7 @@
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
}
},
"is-object-like-x": {
@@ -3870,8 +3890,8 @@
"dev": true,
"optional": true,
"requires": {
- "is-function-x": "3.3.0",
- "is-primitive": "2.0.0"
+ "is-function-x": "^3.3.0",
+ "is-primitive": "^2.0.0"
}
},
"is-posix-bracket": {
@@ -3896,7 +3916,9 @@
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true,
+ "optional": true
},
"is-string": {
"version": "1.0.4",
@@ -3909,7 +3931,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
"integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-typedarray": {
"version": "1.0.0",
@@ -3950,15 +3973,6 @@
"isarray": "1.0.0"
}
},
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "1.7.1",
- "whatwg-fetch": "2.0.3"
- }
- },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -4006,7 +4020,7 @@
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
"dev": true,
"requires": {
- "jsonify": "0.0.0"
+ "jsonify": "~0.0.0"
}
},
"json-stringify-safe": {
@@ -4025,8 +4039,9 @@
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
"requires": {
- "graceful-fs": "4.1.11"
+ "graceful-fs": "^4.1.6"
}
},
"jsonify": {
@@ -4068,7 +4083,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.5"
+ "is-buffer": "^1.1.5"
}
},
"klaw": {
@@ -4077,7 +4092,7 @@
"integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11"
+ "graceful-fs": "^4.1.9"
}
},
"lcid": {
@@ -4086,7 +4101,7 @@
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"dev": true,
"requires": {
- "invert-kv": "1.0.0"
+ "invert-kv": "^1.0.0"
}
},
"load-json-file": {
@@ -4095,11 +4110,11 @@
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
}
},
"locate-path": {
@@ -4108,8 +4123,8 @@
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
},
"dependencies": {
"path-exists": {
@@ -4147,7 +4162,8 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lodash.isnull/-/lodash.isnull-3.0.0.tgz",
"integrity": "sha1-+vvlnqHcon7teGU0A53YTC4HxW4=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"lodash.mergewith": {
"version": "4.6.0",
@@ -4160,7 +4176,7 @@
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
"integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
"requires": {
- "js-tokens": "3.0.1"
+ "js-tokens": "^3.0.0"
}
},
"loud-rejection": {
@@ -4169,8 +4185,8 @@
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
"requires": {
- "currently-unhandled": "0.4.1",
- "signal-exit": "3.0.2"
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
}
},
"lru-cache": {
@@ -4179,8 +4195,8 @@
"integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
"dev": true,
"requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
}
},
"macos-alias": {
@@ -4190,7 +4206,7 @@
"dev": true,
"optional": true,
"requires": {
- "nan": "2.6.2"
+ "nan": "^2.4.0"
}
},
"map-obj": {
@@ -4206,7 +4222,7 @@
"dev": true,
"optional": true,
"requires": {
- "to-number-x": "2.0.0"
+ "to-number-x": "^2.0.0"
}
},
"math-sign-x": {
@@ -4216,8 +4232,8 @@
"dev": true,
"optional": true,
"requires": {
- "is-nan-x": "1.0.1",
- "to-number-x": "2.0.0"
+ "is-nan-x": "^1.0.1",
+ "to-number-x": "^2.0.0"
}
},
"max-safe-integer": {
@@ -4233,16 +4249,16 @@
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
"requires": {
- "camelcase-keys": "2.1.0",
- "decamelize": "1.2.0",
- "loud-rejection": "1.6.0",
- "map-obj": "1.0.1",
- "minimist": "1.2.0",
- "normalize-package-data": "2.3.8",
- "object-assign": "4.1.1",
- "read-pkg-up": "1.0.1",
- "redent": "1.0.0",
- "trim-newlines": "1.0.0"
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
},
"dependencies": {
"minimist": {
@@ -4259,19 +4275,19 @@
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"dev": true,
"requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.3"
+ "arr-diff": "^2.0.0",
+ "array-unique": "^0.2.1",
+ "braces": "^1.8.2",
+ "expand-brackets": "^0.1.4",
+ "extglob": "^0.3.1",
+ "filename-regex": "^2.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.1",
+ "kind-of": "^3.0.2",
+ "normalize-path": "^2.0.1",
+ "object.omit": "^2.0.0",
+ "parse-glob": "^3.0.4",
+ "regex-cache": "^0.4.2"
}
},
"mime-db": {
@@ -4286,7 +4302,7 @@
"integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
"dev": true,
"requires": {
- "mime-db": "1.27.0"
+ "mime-db": "~1.27.0"
}
},
"minimatch": {
@@ -4294,7 +4310,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
- "brace-expansion": "1.1.8"
+ "brace-expansion": "^1.1.7"
}
},
"minimist": {
@@ -4326,7 +4342,7 @@
"requires": {
"decompress-zip": "0.3.0",
"fs-extra": "0.26.7",
- "request": "2.81.0"
+ "request": "^2.79.0"
},
"dependencies": {
"fs-extra": {
@@ -4335,11 +4351,11 @@
"integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.1"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
}
}
}
@@ -4357,9 +4373,9 @@
"dev": true,
"optional": true,
"requires": {
- "array-buffer-from-string": "0.1.0",
- "fmix": "0.1.0",
- "imul": "1.0.1"
+ "array-buffer-from-string": "^0.1.0",
+ "fmix": "^0.1.0",
+ "imul": "^1.0.0"
}
},
"nan": {
@@ -4372,7 +4388,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/nan-x/-/nan-x-1.0.0.tgz",
"integrity": "sha512-yw4Fhe2/UTzanQ4f0yHWkRnfTuHZFAi4GZDjXS4G+qv5BqXTqPJBbSxpa7MyyW9v4Y4ZySZQik1vcbNkhdnIOg==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"nested-error-stacks": {
"version": "1.0.2",
@@ -4381,16 +4398,7 @@
"dev": true,
"optional": true,
"requires": {
- "inherits": "2.0.3"
- }
- },
- "node-fetch": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz",
- "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==",
- "requires": {
- "encoding": "0.1.12",
- "is-stream": "1.1.0"
+ "inherits": "~2.0.1"
}
},
"node-gyp": {
@@ -4399,19 +4407,19 @@
"integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
"dev": true,
"requires": {
- "fstream": "1.0.11",
- "glob": "7.1.2",
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "nopt": "3.0.6",
- "npmlog": "4.1.0",
- "osenv": "0.1.4",
- "request": "2.81.0",
- "rimraf": "2.6.1",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "which": "1.2.14"
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "minimatch": "^3.0.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "2",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
}
},
"node-sass": {
@@ -4420,24 +4428,24 @@
"integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=",
"dev": true,
"requires": {
- "async-foreach": "0.1.3",
- "chalk": "1.1.3",
- "cross-spawn": "3.0.1",
- "gaze": "1.1.2",
- "get-stdin": "4.0.1",
- "glob": "7.1.2",
- "in-publish": "2.0.0",
- "lodash.assign": "4.2.0",
- "lodash.clonedeep": "4.5.0",
- "lodash.mergewith": "4.6.0",
- "meow": "3.7.0",
- "mkdirp": "0.5.1",
- "nan": "2.6.2",
- "node-gyp": "3.6.2",
- "npmlog": "4.1.0",
- "request": "2.81.0",
- "sass-graph": "2.2.4",
- "stdout-stream": "1.4.0"
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash.assign": "^4.2.0",
+ "lodash.clonedeep": "^4.3.2",
+ "lodash.mergewith": "^4.6.0",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.3.2",
+ "node-gyp": "^3.3.1",
+ "npmlog": "^4.0.0",
+ "request": "^2.79.0",
+ "sass-graph": "^2.1.1",
+ "stdout-stream": "^1.4.0"
}
},
"nopt": {
@@ -4446,7 +4454,7 @@
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"dev": true,
"requires": {
- "abbrev": "1.1.0"
+ "abbrev": "1"
}
},
"normalize-package-data": {
@@ -4455,10 +4463,10 @@
"integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=",
"dev": true,
"requires": {
- "hosted-git-info": "2.4.2",
- "is-builtin-module": "1.0.0",
- "semver": "5.3.0",
- "validate-npm-package-license": "3.0.1"
+ "hosted-git-info": "^2.1.4",
+ "is-builtin-module": "^1.0.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
}
},
"normalize-path": {
@@ -4467,7 +4475,7 @@
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
- "remove-trailing-separator": "1.0.2"
+ "remove-trailing-separator": "^1.0.1"
}
},
"normalize-space-x": {
@@ -4475,10 +4483,11 @@
"resolved": "https://registry.npmjs.org/normalize-space-x/-/normalize-space-x-3.0.0.tgz",
"integrity": "sha512-tbCJerqZCCHPst4rRKgsTanLf45fjOyeAU5zE3mhDxJtFJKt66q39g2XArWhXelgTFVib8mNBUm6Wrd0LxYcfQ==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "trim-x": "3.0.0",
- "white-space-x": "3.0.0"
+ "cached-constructors-x": "^1.0.0",
+ "trim-x": "^3.0.0",
+ "white-space-x": "^3.0.0"
}
},
"npm-run-path": {
@@ -4488,7 +4497,7 @@
"dev": true,
"optional": true,
"requires": {
- "path-key": "1.0.0"
+ "path-key": "^1.0.0"
}
},
"npmlog": {
@@ -4497,10 +4506,10 @@
"integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==",
"dev": true,
"requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
}
},
"nugget": {
@@ -4509,12 +4518,12 @@
"integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
"dev": true,
"requires": {
- "debug": "2.6.8",
- "minimist": "1.2.0",
- "pretty-bytes": "1.0.4",
- "progress-stream": "1.2.0",
- "request": "2.81.0",
- "single-line-log": "1.1.2",
+ "debug": "^2.1.3",
+ "minimist": "^1.1.0",
+ "pretty-bytes": "^1.0.2",
+ "progress-stream": "^1.1.0",
+ "request": "^2.45.0",
+ "single-line-log": "^1.1.2",
"throttleit": "0.0.2"
},
"dependencies": {
@@ -4550,16 +4559,16 @@
"dev": true,
"optional": true,
"requires": {
- "attempt-x": "1.1.1",
- "has-own-property-x": "3.2.0",
- "has-symbol-support-x": "1.4.1",
- "is-falsey-x": "1.0.1",
- "is-index-x": "1.1.0",
- "is-primitive": "2.0.0",
- "is-string": "1.0.4",
- "property-is-enumerable-x": "1.1.0",
- "to-object-x": "1.5.0",
- "to-property-key-x": "2.0.2"
+ "attempt-x": "^1.1.0",
+ "has-own-property-x": "^3.1.1",
+ "has-symbol-support-x": "^1.4.1",
+ "is-falsey-x": "^1.0.0",
+ "is-index-x": "^1.0.0",
+ "is-primitive": "^2.0.0",
+ "is-string": "^1.0.4",
+ "property-is-enumerable-x": "^1.1.0",
+ "to-object-x": "^1.4.1",
+ "to-property-key-x": "^2.0.1"
}
},
"object-keys": {
@@ -4574,8 +4583,8 @@
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"dev": true,
"requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
+ "for-own": "^0.1.4",
+ "is-extendable": "^0.1.1"
}
},
"ohm-js": {
@@ -4583,10 +4592,10 @@
"resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-0.12.4.tgz",
"integrity": "sha1-pfn8x9KWlQNe3oJEdXfmlctigVU=",
"requires": {
- "es6-symbol": "3.1.1",
- "inherits": "2.0.3",
- "is-buffer": "1.1.5",
- "util-extend": "1.0.3"
+ "es6-symbol": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-buffer": "^1.1.4",
+ "util-extend": "^1.0.3"
}
},
"once": {
@@ -4594,7 +4603,7 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
- "wrappy": "1.0.2"
+ "wrappy": "1"
}
},
"os-homedir": {
@@ -4609,7 +4618,7 @@
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
- "lcid": "1.0.0"
+ "lcid": "^1.0.0"
}
},
"os-tmpdir": {
@@ -4624,8 +4633,8 @@
"integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
"dev": true,
"requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
}
},
"output-file-sync": {
@@ -4634,9 +4643,9 @@
"integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "mkdirp": "0.5.1",
- "object-assign": "4.1.1"
+ "graceful-fs": "^4.1.4",
+ "mkdirp": "^0.5.1",
+ "object-assign": "^4.1.0"
}
},
"p-limit": {
@@ -4651,7 +4660,7 @@
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
- "p-limit": "1.1.0"
+ "p-limit": "^1.1.0"
}
},
"parse-color": {
@@ -4661,7 +4670,7 @@
"dev": true,
"optional": true,
"requires": {
- "color-convert": "0.5.3"
+ "color-convert": "~0.5.0"
}
},
"parse-glob": {
@@ -4670,10 +4679,10 @@
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"dev": true,
"requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
+ "glob-base": "^0.3.0",
+ "is-dotfile": "^1.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.0"
}
},
"parse-int-x": {
@@ -4681,11 +4690,12 @@
"resolved": "https://registry.npmjs.org/parse-int-x/-/parse-int-x-2.0.0.tgz",
"integrity": "sha512-NIMm52gmd1+0qxJK8lV3OZ4zzWpRH1xcz9xCHXl+DNzddwUdS4NEtd7BmTeK7iCIXoaK5e6BoDMHgieH2eNIhg==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "nan-x": "1.0.0",
- "to-string-x": "1.4.2",
- "trim-left-x": "3.0.0"
+ "cached-constructors-x": "^1.0.0",
+ "nan-x": "^1.0.0",
+ "to-string-x": "^1.4.2",
+ "trim-left-x": "^3.0.0"
}
},
"parse-json": {
@@ -4694,7 +4704,7 @@
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
- "error-ex": "1.3.1"
+ "error-ex": "^1.2.0"
}
},
"path-exists": {
@@ -4703,7 +4713,7 @@
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
- "pinkie-promise": "2.0.1"
+ "pinkie-promise": "^2.0.0"
}
},
"path-is-absolute": {
@@ -4715,7 +4725,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz",
"integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"path-parse": {
"version": "1.0.5",
@@ -4729,9 +4740,9 @@
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
}
},
"pend": {
@@ -4764,7 +4775,7 @@
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
- "pinkie": "2.0.4"
+ "pinkie": "^2.0.0"
}
},
"plist": {
@@ -4775,7 +4786,7 @@
"requires": {
"base64-js": "1.2.0",
"xmlbuilder": "8.2.2",
- "xmldom": "0.1.27"
+ "xmldom": "0.1.x"
}
},
"preserve": {
@@ -4790,8 +4801,8 @@
"integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
"dev": true,
"requires": {
- "get-stdin": "4.0.1",
- "meow": "3.7.0"
+ "get-stdin": "^4.0.1",
+ "meow": "^3.1.0"
}
},
"private": {
@@ -4812,25 +4823,28 @@
"integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
"dev": true,
"requires": {
- "speedometer": "0.1.4",
- "through2": "0.2.3"
- }
- },
- "promise": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.0.tgz",
- "integrity": "sha512-bzAZ0u9Kxa0FYyfISjr9/PK7sCclAzc5rP4UgynMWA2Qv/gpZLKynJmTEXYq2i/giYdjBfRONDhfbsMlGIgvjA==",
- "requires": {
- "asap": "2.0.5"
+ "speedometer": "~0.1.2",
+ "through2": "~0.2.3"
}
},
"prop-types": {
- "version": "15.5.10",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz",
- "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=",
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
"requires": {
- "fbjs": "0.8.12",
- "loose-envify": "1.3.1"
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ },
+ "dependencies": {
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ }
}
},
"property-is-enumerable-x": {
@@ -4840,8 +4854,8 @@
"dev": true,
"optional": true,
"requires": {
- "to-object-x": "1.5.0",
- "to-property-key-x": "2.0.2"
+ "to-object-x": "^1.4.1",
+ "to-property-key-x": "^2.0.1"
}
},
"pseudomap": {
@@ -4875,8 +4889,8 @@
"dev": true,
"optional": true,
"requires": {
- "base32-encode": "0.1.0",
- "murmur-32": "0.1.0"
+ "base32-encode": "^0.1.0",
+ "murmur-32": "^0.1.0"
}
},
"randomatic": {
@@ -4885,8 +4899,8 @@
"integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
"dev": true,
"requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
},
"dependencies": {
"is-number": {
@@ -4895,7 +4909,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
@@ -4904,7 +4918,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "1.1.5"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -4915,7 +4929,7 @@
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
"dev": true,
"requires": {
- "is-buffer": "1.1.5"
+ "is-buffer": "^1.1.5"
}
}
}
@@ -4926,10 +4940,10 @@
"integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
"dev": true,
"requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
+ "deep-extend": "~0.4.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
@@ -4947,37 +4961,62 @@
"dev": true
},
"react": {
- "version": "15.6.1",
- "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz",
- "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=",
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
+ "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
"requires": {
- "create-react-class": "15.6.0",
- "fbjs": "0.8.12",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "prop-types": "15.5.10"
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "dependencies": {
+ "prop-types": {
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ },
+ "dependencies": {
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ }
+ }
+ }
}
},
"react-dom": {
- "version": "15.6.1",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz",
- "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=",
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
+ "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
"requires": {
- "fbjs": "0.8.12",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "prop-types": "15.5.10"
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
}
},
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.3.8",
- "path-type": "1.1.0"
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
}
},
"read-pkg-up": {
@@ -4986,8 +5025,8 @@
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
}
},
"readable-stream": {
@@ -4996,13 +5035,13 @@
"integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==",
"dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "safe-buffer": "5.0.1",
- "string_decoder": "1.0.2",
- "util-deprecate": "1.0.2"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "safe-buffer": "~5.0.1",
+ "string_decoder": "~1.0.0",
+ "util-deprecate": "~1.0.1"
}
},
"readdirp": {
@@ -5011,10 +5050,10 @@
"integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
"dev": true,
"requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.2.11",
- "set-immediate-shim": "1.0.1"
+ "graceful-fs": "^4.1.2",
+ "minimatch": "^3.0.2",
+ "readable-stream": "^2.0.2",
+ "set-immediate-shim": "^1.0.1"
}
},
"redent": {
@@ -5023,8 +5062,8 @@
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"dev": true,
"requires": {
- "indent-string": "2.1.0",
- "strip-indent": "1.0.1"
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
}
},
"regenerate": {
@@ -5045,9 +5084,9 @@
"integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=",
"dev": true,
"requires": {
- "babel-runtime": "6.23.0",
- "babel-types": "6.25.0",
- "private": "0.1.7"
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
}
},
"regex-cache": {
@@ -5056,8 +5095,8 @@
"integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
"dev": true,
"requires": {
- "is-equal-shallow": "0.1.3",
- "is-primitive": "2.0.0"
+ "is-equal-shallow": "^0.1.3",
+ "is-primitive": "^2.0.0"
}
},
"regexpu-core": {
@@ -5066,9 +5105,9 @@
"integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
"dev": true,
"requires": {
- "regenerate": "1.3.2",
- "regjsgen": "0.2.0",
- "regjsparser": "0.1.5"
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
}
},
"regjsgen": {
@@ -5083,7 +5122,7 @@
"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
"dev": true,
"requires": {
- "jsesc": "0.5.0"
+ "jsesc": "~0.5.0"
},
"dependencies": {
"jsesc": {
@@ -5118,7 +5157,7 @@
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
"requires": {
- "is-finite": "1.0.2"
+ "is-finite": "^1.0.0"
}
},
"replace-comments-x": {
@@ -5126,9 +5165,10 @@
"resolved": "https://registry.npmjs.org/replace-comments-x/-/replace-comments-x-2.0.0.tgz",
"integrity": "sha512-+vMP4jqU+8HboLWms6YMNEiaZG5hh1oR6ENCnGYDF/UQ7aYiJUK/8tcl3+KZAHRCKKa3gqzrfiarlUBHQSgRlg==",
"dev": true,
+ "optional": true,
"requires": {
- "require-coercible-to-string-x": "1.0.0",
- "to-string-x": "1.4.2"
+ "require-coercible-to-string-x": "^1.0.0",
+ "to-string-x": "^1.4.2"
}
},
"request": {
@@ -5137,28 +5177,28 @@
"integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
"dev": true,
"requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.0.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.1.0"
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.1.1",
+ "har-validator": "~4.2.1",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "oauth-sign": "~0.8.1",
+ "performance-now": "^0.2.0",
+ "qs": "~6.4.0",
+ "safe-buffer": "^5.0.1",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.0.0"
}
},
"require-coercible-to-string-x": {
@@ -5166,9 +5206,10 @@
"resolved": "https://registry.npmjs.org/require-coercible-to-string-x/-/require-coercible-to-string-x-1.0.0.tgz",
"integrity": "sha512-Rpfd4sMdflPAKecdKhfAtQHlZzzle4UMUgxJ01hXtTcNWMV8w9GeZnKhEyrT73kgrflBOP1zg41amUPZGcNspA==",
"dev": true,
+ "optional": true,
"requires": {
- "require-object-coercible-x": "1.4.1",
- "to-string-x": "1.4.2"
+ "require-object-coercible-x": "^1.4.1",
+ "to-string-x": "^1.4.2"
}
},
"require-directory": {
@@ -5188,8 +5229,9 @@
"resolved": "https://registry.npmjs.org/require-object-coercible-x/-/require-object-coercible-x-1.4.1.tgz",
"integrity": "sha512-0YHa2afepsLfQvwQ1P2XvDZnGOUia5sC07ZijIRU2dnsRxnuilXWF6B2CFaKGDA9eZl39lJHrXCDsnfgroRd6Q==",
"dev": true,
+ "optional": true,
"requires": {
- "is-nil-x": "1.4.1"
+ "is-nil-x": "^1.4.1"
}
},
"resolve": {
@@ -5198,7 +5240,7 @@
"integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=",
"dev": true,
"requires": {
- "path-parse": "1.0.5"
+ "path-parse": "^1.0.5"
}
},
"rimraf": {
@@ -5206,7 +5248,7 @@
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
"integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
"requires": {
- "glob": "7.1.2"
+ "glob": "^7.0.5"
}
},
"run-series": {
@@ -5232,7 +5274,7 @@
"integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
"dev": true,
"requires": {
- "truncate-utf8-bytes": "1.0.2"
+ "truncate-utf8-bytes": "^1.0.0"
}
},
"sass-graph": {
@@ -5241,10 +5283,19 @@
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
"dev": true,
"requires": {
- "glob": "7.1.2",
- "lodash": "4.17.4",
- "scss-tokenizer": "0.2.3",
- "yargs": "7.1.0"
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^7.0.0"
+ }
+ },
+ "scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
}
},
"scss-tokenizer": {
@@ -5253,8 +5304,8 @@
"integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
"dev": true,
"requires": {
- "js-base64": "2.1.9",
- "source-map": "0.4.4"
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
},
"dependencies": {
"source-map": {
@@ -5263,7 +5314,7 @@
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"dev": true,
"requires": {
- "amdefine": "1.0.1"
+ "amdefine": ">=0.0.4"
}
}
}
@@ -5285,11 +5336,6 @@
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
"dev": true
},
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -5302,7 +5348,7 @@
"integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
"dev": true,
"requires": {
- "string-width": "1.0.2"
+ "string-width": "^1.0.1"
}
},
"slash": {
@@ -5317,7 +5363,7 @@
"integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
"dev": true,
"requires": {
- "hoek": "2.16.3"
+ "hoek": "2.x.x"
}
},
"source-map": {
@@ -5332,7 +5378,7 @@
"integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=",
"dev": true,
"requires": {
- "source-map": "0.5.6"
+ "source-map": "^0.5.6"
}
},
"spdx-correct": {
@@ -5341,7 +5387,7 @@
"integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
"dev": true,
"requires": {
- "spdx-license-ids": "1.2.2"
+ "spdx-license-ids": "^1.0.2"
}
},
"spdx-expression-parse": {
@@ -5368,14 +5414,14 @@
"integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
"dev": true,
"requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "tweetnacl": "~0.14.0"
},
"dependencies": {
"assert-plus": {
@@ -5392,7 +5438,7 @@
"integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
"dev": true,
"requires": {
- "readable-stream": "2.2.11"
+ "readable-stream": "^2.0.1"
}
},
"stream-buffers": {
@@ -5402,21 +5448,12 @@
"dev": true,
"optional": true
},
- "string_decoder": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz",
- "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=",
- "dev": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
"string-pixel-width": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/string-pixel-width/-/string-pixel-width-1.0.7.tgz",
"integrity": "sha1-ifqOiaduxlVq1tgpXLIYRUbW+nA=",
"requires": {
- "lodash": "4.17.4"
+ "lodash": "^4.17.4"
}
},
"string-width": {
@@ -5425,9 +5462,18 @@
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz",
+ "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.0.1"
}
},
"stringstream": {
@@ -5442,7 +5488,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "ansi-regex": "^2.0.0"
}
},
"strip-bom": {
@@ -5451,7 +5497,7 @@
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
"requires": {
- "is-utf8": "0.2.1"
+ "is-utf8": "^0.2.0"
}
},
"strip-eof": {
@@ -5467,7 +5513,7 @@
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
"requires": {
- "get-stdin": "4.0.1"
+ "get-stdin": "^4.0.1"
}
},
"strip-json-comments": {
@@ -5482,8 +5528,8 @@
"integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
"dev": true,
"requires": {
- "debug": "2.6.8",
- "es6-promise": "4.1.0"
+ "debug": "^2.2.0",
+ "es6-promise": "^4.0.5"
}
},
"supports-color": {
@@ -5498,9 +5544,9 @@
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true,
"requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
+ "block-stream": "*",
+ "fstream": "^1.0.2",
+ "inherits": "2"
}
},
"tempfile": {
@@ -5509,8 +5555,8 @@
"integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=",
"dev": true,
"requires": {
- "os-tmpdir": "1.0.2",
- "uuid": "2.0.3"
+ "os-tmpdir": "^1.0.0",
+ "uuid": "^2.0.1"
},
"dependencies": {
"uuid": {
@@ -5533,8 +5579,8 @@
"integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
"dev": true,
"requires": {
- "readable-stream": "1.1.14",
- "xtend": "2.1.2"
+ "readable-stream": "~1.1.9",
+ "xtend": "~2.1.1"
},
"dependencies": {
"isarray": {
@@ -5549,10 +5595,10 @@
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
"isarray": "0.0.1",
- "string_decoder": "0.10.31"
+ "string_decoder": "~0.10.x"
}
},
"string_decoder": {
@@ -5569,7 +5615,7 @@
"integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=",
"dev": true,
"requires": {
- "os-tmpdir": "1.0.2"
+ "os-tmpdir": "~1.0.1"
}
},
"tn1150": {
@@ -5579,14 +5625,15 @@
"dev": true,
"optional": true,
"requires": {
- "unorm": "1.4.1"
+ "unorm": "^1.4.1"
}
},
"to-boolean-x": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-boolean-x/-/to-boolean-x-1.0.1.tgz",
"integrity": "sha512-PstxY3K6hVEHnY3FITs8XBoJbt0RI1e4MLIhAL9hWa3BtVLCrb86vU5z6lEKh7uZZjiPiLqIKMmfMro1nNgtXQ==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"to-fast-properties": {
"version": "1.0.3",
@@ -5601,10 +5648,10 @@
"dev": true,
"optional": true,
"requires": {
- "is-finite-x": "3.0.2",
- "is-nan-x": "1.0.1",
- "math-sign-x": "3.0.0",
- "to-number-x": "2.0.0"
+ "is-finite-x": "^3.0.2",
+ "is-nan-x": "^1.0.1",
+ "math-sign-x": "^3.0.0",
+ "to-number-x": "^2.0.0"
}
},
"to-number-x": {
@@ -5612,12 +5659,13 @@
"resolved": "https://registry.npmjs.org/to-number-x/-/to-number-x-2.0.0.tgz",
"integrity": "sha512-lGOnCoccUoSzjZ/9Uen8TC4+VFaQcFGhTroWTv2tYWxXgyJV1zqAZ8hEIMkez/Eo790fBMOjidTnQ/OJSCvAoQ==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "nan-x": "1.0.0",
- "parse-int-x": "2.0.0",
- "to-primitive-x": "1.1.0",
- "trim-x": "3.0.0"
+ "cached-constructors-x": "^1.0.0",
+ "nan-x": "^1.0.0",
+ "parse-int-x": "^2.0.0",
+ "to-primitive-x": "^1.1.0",
+ "trim-x": "^3.0.0"
}
},
"to-object-x": {
@@ -5625,9 +5673,10 @@
"resolved": "https://registry.npmjs.org/to-object-x/-/to-object-x-1.5.0.tgz",
"integrity": "sha512-AKn5GQcdWky+s20vjWkt+Wa6y3dxQH3yQyMBhOfBOPldUwqwhgvlqcIg5H092ntNc+TX8/Cxzs1kMHH19pyCnA==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "require-object-coercible-x": "1.4.1"
+ "cached-constructors-x": "^1.0.0",
+ "require-object-coercible-x": "^1.4.1"
}
},
"to-primitive-x": {
@@ -5635,15 +5684,16 @@
"resolved": "https://registry.npmjs.org/to-primitive-x/-/to-primitive-x-1.1.0.tgz",
"integrity": "sha512-gyMY0gi3wjK3e4MUBKqv9Zl8QGcWguIkaUr2VJmoBEsOpDcpDZSEyljR773eVG4maS48uX7muLkoQoh/BA82OQ==",
"dev": true,
+ "optional": true,
"requires": {
- "has-symbol-support-x": "1.4.1",
- "is-date-object": "1.0.1",
- "is-function-x": "3.3.0",
- "is-nil-x": "1.4.1",
- "is-primitive": "2.0.0",
- "is-symbol": "1.0.1",
- "require-object-coercible-x": "1.4.1",
- "validate.io-undefined": "1.0.3"
+ "has-symbol-support-x": "^1.4.1",
+ "is-date-object": "^1.0.1",
+ "is-function-x": "^3.2.0",
+ "is-nil-x": "^1.4.1",
+ "is-primitive": "^2.0.0",
+ "is-symbol": "^1.0.1",
+ "require-object-coercible-x": "^1.4.1",
+ "validate.io-undefined": "^1.0.3"
}
},
"to-property-key-x": {
@@ -5651,10 +5701,11 @@
"resolved": "https://registry.npmjs.org/to-property-key-x/-/to-property-key-x-2.0.2.tgz",
"integrity": "sha512-YISLpZFYIazNm0P8hLsKEEUEZ3m8U3+eDysJZqTu3+B9tQp+2TrMpaEGT8Agh4fZ5LSoums60/glNEzk5ozqrg==",
"dev": true,
+ "optional": true,
"requires": {
- "has-symbol-support-x": "1.4.1",
- "to-primitive-x": "1.1.0",
- "to-string-x": "1.4.2"
+ "has-symbol-support-x": "^1.4.1",
+ "to-primitive-x": "^1.1.0",
+ "to-string-x": "^1.4.2"
}
},
"to-string-symbols-supported-x": {
@@ -5664,9 +5715,9 @@
"dev": true,
"optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "has-symbol-support-x": "1.4.1",
- "is-symbol": "1.0.1"
+ "cached-constructors-x": "^1.0.0",
+ "has-symbol-support-x": "^1.4.1",
+ "is-symbol": "^1.0.1"
}
},
"to-string-tag-x": {
@@ -5674,9 +5725,10 @@
"resolved": "https://registry.npmjs.org/to-string-tag-x/-/to-string-tag-x-1.4.2.tgz",
"integrity": "sha512-ytO9eLigxsQQLGuab0C1iSSTzKdJNVSlBg0Spg4J/rGAVrQJ5y774mo0SSzgGeTT4RJGGyJNfObXaTMzX0XDOQ==",
"dev": true,
+ "optional": true,
"requires": {
- "lodash.isnull": "3.0.0",
- "validate.io-undefined": "1.0.3"
+ "lodash.isnull": "^3.0.0",
+ "validate.io-undefined": "^1.0.3"
}
},
"to-string-x": {
@@ -5684,8 +5736,9 @@
"resolved": "https://registry.npmjs.org/to-string-x/-/to-string-x-1.4.2.tgz",
"integrity": "sha512-/WP5arlwtCpAAexCCHiQBW0eXwse84osWyP1Qtaz71nsYSuUpOkT6tBm8nQ4IIUfSh5hji0hDupUCD2xbbOL6A==",
"dev": true,
+ "optional": true,
"requires": {
- "is-symbol": "1.0.1"
+ "is-symbol": "^1.0.1"
}
},
"touch": {
@@ -5694,7 +5747,7 @@
"integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=",
"dev": true,
"requires": {
- "nopt": "1.0.10"
+ "nopt": "~1.0.10"
},
"dependencies": {
"nopt": {
@@ -5703,7 +5756,7 @@
"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
"dev": true,
"requires": {
- "abbrev": "1.1.0"
+ "abbrev": "1"
}
}
}
@@ -5714,7 +5767,7 @@
"integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
"dev": true,
"requires": {
- "punycode": "1.4.1"
+ "punycode": "^1.4.1"
}
},
"traverse": {
@@ -5728,10 +5781,11 @@
"resolved": "https://registry.npmjs.org/trim-left-x/-/trim-left-x-3.0.0.tgz",
"integrity": "sha512-+m6cqkppI+CxQBTwWEZliOHpOBnCArGyMnS1WCLb6IRgukhTkiQu/TNEN5Lj2eM9jk8ewJsc7WxFZfmwNpRXWQ==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "require-coercible-to-string-x": "1.0.0",
- "white-space-x": "3.0.0"
+ "cached-constructors-x": "^1.0.0",
+ "require-coercible-to-string-x": "^1.0.0",
+ "white-space-x": "^3.0.0"
}
},
"trim-newlines": {
@@ -5751,10 +5805,11 @@
"resolved": "https://registry.npmjs.org/trim-right-x/-/trim-right-x-3.0.0.tgz",
"integrity": "sha512-iIqEsWEbWVodqdixJHi4FoayJkUxhoL4AvSNGp4FF4FfQKRPGizt8++/RnyC9od75y7P/S6EfONoVqP+NddiKA==",
"dev": true,
+ "optional": true,
"requires": {
- "cached-constructors-x": "1.0.0",
- "require-coercible-to-string-x": "1.0.0",
- "white-space-x": "3.0.0"
+ "cached-constructors-x": "^1.0.0",
+ "require-coercible-to-string-x": "^1.0.0",
+ "white-space-x": "^3.0.0"
}
},
"trim-x": {
@@ -5762,9 +5817,10 @@
"resolved": "https://registry.npmjs.org/trim-x/-/trim-x-3.0.0.tgz",
"integrity": "sha512-w8s38RAUScQ6t3XqMkS75iz5ZkIYLQpVnv2lp3IuTS36JdlVzC54oe6okOf4Wz3UH4rr3XAb2xR3kR5Xei82fw==",
"dev": true,
+ "optional": true,
"requires": {
- "trim-left-x": "3.0.0",
- "trim-right-x": "3.0.0"
+ "trim-left-x": "^3.0.0",
+ "trim-right-x": "^3.0.0"
}
},
"truncate-utf8-bytes": {
@@ -5773,7 +5829,7 @@
"integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
"dev": true,
"requires": {
- "utf8-byte-length": "1.0.4"
+ "utf8-byte-length": "^1.0.1"
}
},
"tunnel-agent": {
@@ -5782,7 +5838,7 @@
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"requires": {
- "safe-buffer": "5.0.1"
+ "safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
@@ -5798,11 +5854,6 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
- "ua-parser-js": {
- "version": "0.7.12",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz",
- "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs="
- },
"universalify": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.0.tgz",
@@ -5850,7 +5901,7 @@
"integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
"dev": true,
"requires": {
- "user-home": "1.1.1"
+ "user-home": "^1.1.1"
}
},
"validate-npm-package-license": {
@@ -5859,15 +5910,16 @@
"integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
"dev": true,
"requires": {
- "spdx-correct": "1.0.2",
- "spdx-expression-parse": "1.0.4"
+ "spdx-correct": "~1.0.0",
+ "spdx-expression-parse": "~1.0.0"
}
},
"validate.io-undefined": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/validate.io-undefined/-/validate.io-undefined-1.0.3.tgz",
"integrity": "sha1-fif8uzFbhB54JDQxiXZxkp4gt/Q=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"verror": {
"version": "1.3.6",
@@ -5878,18 +5930,13 @@
"extsprintf": "1.0.2"
}
},
- "whatwg-fetch": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
- "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
- },
"which": {
"version": "1.2.14",
"resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
"integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
"dev": true,
"requires": {
- "isexe": "2.0.0"
+ "isexe": "^2.0.0"
}
},
"which-module": {
@@ -5902,7 +5949,8 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/white-space-x/-/white-space-x-3.0.0.tgz",
"integrity": "sha512-nMPVXGMdi/jQepXKryxqzEh/vCwdOYY/u6NZy40glMHvZfEr7/+vQKnDhEq4rZ1nniOFq9GWohQYB30uW/5Olg==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"wide-align": {
"version": "1.1.2",
@@ -5910,7 +5958,7 @@
"integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true,
"requires": {
- "string-width": "1.0.2"
+ "string-width": "^1.0.2"
}
},
"wrap-ansi": {
@@ -5919,8 +5967,8 @@
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
}
},
"wrappy": {
@@ -5951,7 +5999,7 @@
"integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
"dev": true,
"requires": {
- "object-keys": "0.4.0"
+ "object-keys": "~0.4.0"
}
},
"y18n": {
@@ -5972,19 +6020,19 @@
"integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
"dev": true,
"requires": {
- "camelcase": "3.0.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.2",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "5.0.0"
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^5.0.0"
},
"dependencies": {
"camelcase": {
@@ -6001,7 +6049,7 @@
"integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
"dev": true,
"requires": {
- "camelcase": "3.0.0"
+ "camelcase": "^3.0.0"
},
"dependencies": {
"camelcase": {
@@ -6018,7 +6066,7 @@
"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
"dev": true,
"requires": {
- "fd-slicer": "1.0.1"
+ "fd-slicer": "~1.0.1"
}
}
}
diff --git a/package.json b/package.json
index bbac22f..07c018e 100644
--- a/package.json
+++ b/package.json
@@ -29,8 +29,8 @@
"jquery": "^1.7.4",
"lodash": "^4.17.4",
"ohm-js": "^0.12.3",
- "react": "^15.4.1",
- "react-dom": "^15.4.2",
+ "react": "^16.13.1",
+ "react-dom": "^16.13.1",
"string-pixel-width": "^1.0.7"
},
"devDependencies": {
diff --git a/src/bundle.css b/src/bundle.css
index bfae620..3edceb3 100644
--- a/src/bundle.css
+++ b/src/bundle.css
@@ -91,8 +91,8 @@ g.node, g.metanode {
transition: transform 0.25s linear;
animation: fade-in 0.25s linear; }
g.node rect, g.metanode rect {
- rx: 15;
- ry: 15;
+ rx: 12;
+ ry: 12;
stroke: white;
stroke-width: 1px;
transition: width 0.25s linear, height 0.25s linear, stroke 0.1s ease-in-out, stroke-width 0.1s ease-in-out;
diff --git a/src/bundle.js b/src/bundle.js
index d2c3287..49d819a 100644
--- a/src/bundle.js
+++ b/src/bundle.js
@@ -546,8 +546,8 @@ var Editor = function (_React$Component) {
this.editor.selection.on("changeCursor", this.onCursorPositionChanged.bind(this));
}
}, {
- key: "componentWillReceiveProps",
- value: function componentWillReceiveProps(nextProps) {
+ key: "UNSAFE_componentWillReceiveProps",
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
var _this3 = this;
if (nextProps.issues) {
@@ -899,6 +899,8 @@ var IDE = function (_React$Component) {
}(React.Component);
"use strict";
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -1078,12 +1080,24 @@ var Interpreter = function () {
}, {
key: "_LiteralNode",
value: function _LiteralNode(instance, state) {
+
+ var heights = {
+ id: 19,
+ class: 18,
+ parameterRow: 15,
+ parameterTablePadding: 2 * 3,
+ headerPadding: 5
+ };
+
var node = {
id: undefined,
class: "Unknown",
color: "darkgrey",
- height: 30,
+ height: 2 * heights.headerPadding + heights.class,
width: 100,
+ parameters: instance.parameters.map(function (p) {
+ return [p.name, p.value.value];
+ }),
_source: instance
};
@@ -1128,7 +1142,11 @@ var Interpreter = function () {
} else {
node.id = instance.alias.value;
node.userGeneratedId = instance.alias.value;
- node.height = 50;
+ node.height += heights.id;
+ }
+
+ if (node.parameters.length > 0) {
+ node.height += heights.parameterTablePadding + node.parameters.length * heights.parameterRow;
}
// is metanode
@@ -1143,10 +1161,28 @@ var Interpreter = function () {
});
}
- var width = 20 + Math.max.apply(Math, _toConsumableArray([node.class, node.userGeneratedId ? node.userGeneratedId : ""].map(function (string) {
+ var left = Math.max.apply(Math, _toConsumableArray(node.parameters.map(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ return pixelWidth(key, { size: 14 });
+ })));
+ var right = Math.max.apply(Math, _toConsumableArray(node.parameters.map(function (_ref3) {
+ var _ref4 = _slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ value = _ref4[1];
+
+ return pixelWidth(value, { size: 14 });
+ })));
+ var widthParams = left + right;
+
+ var widthTitle = Math.max.apply(Math, _toConsumableArray([node.class, node.userGeneratedId ? node.userGeneratedId : ""].map(function (string) {
return pixelWidth(string, { size: 16 });
})));
+ var width = 20 + Math.max(widthParams, widthTitle);
+
this.graph.createNode(node.id, _extends({}, node, {
style: { fill: node.color },
width: width
@@ -1392,13 +1428,14 @@ var Parser = function () {
list: list.eval()
};
},
- BlockParameters: function BlockParameters(_, list, __) {
- return list.eval();
+ BlockParameters: function BlockParameters(_, params, __) {
+ var p = params.eval();
+ return p[0] ? p[0] : p;
},
Parameter: function Parameter(name, _, value) {
return {
kind: "Parameter",
- name: name.eval(),
+ name: name.source.contents,
value: value.eval()
};
},
@@ -1672,426 +1709,432 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
var zoom = require("d3-zoom");
var VisualGraph = function (_React$Component) {
- _inherits(VisualGraph, _React$Component);
-
- function VisualGraph(props) {
- _classCallCheck(this, VisualGraph);
+ _inherits(VisualGraph, _React$Component);
- var _this = _possibleConstructorReturn(this, (VisualGraph.__proto__ || Object.getPrototypeOf(VisualGraph)).call(this, props));
+ function VisualGraph(props) {
+ _classCallCheck(this, VisualGraph);
- _this.graphLayout = new GraphLayout(_this.saveGraph.bind(_this));
- _this.state = {
- graph: null
- };
+ var _this = _possibleConstructorReturn(this, (VisualGraph.__proto__ || Object.getPrototypeOf(VisualGraph)).call(this, props));
- _this.svg = null;
- _this.group = null;
+ _this.graphLayout = new GraphLayout(_this.saveGraph.bind(_this));
+ _this.state = {
+ graph: null
+ };
- _this.currentZoom = null;
- return _this;
- }
+ _this.svg = null;
+ _this.group = null;
- _createClass(VisualGraph, [{
- key: "saveGraph",
- value: function saveGraph(graph) {
- this.setState({ graph: graph });
- }
- }, {
- key: "componentWillReceiveProps",
- value: function componentWillReceiveProps(nextProps) {
- if (nextProps.graph) {
- nextProps.graph._label.rankdir = nextProps.layout;
- this.graphLayout.layout(nextProps.graph);
- }
- }
- }, {
- key: "shouldComponentUpdate",
- value: function shouldComponentUpdate(nextProps, nextState) {
- return this.state !== nextState;
- }
- }, {
- key: "handleClick",
- value: function handleClick(node) {
- var selectedNode = node.id;
- this.setState({ selectedNode: selectedNode });
-
- var _state$graph$graph = this.state.graph.graph(),
- width = _state$graph$graph.width,
- height = _state$graph$graph.height;
-
- var idealSize = function idealSize(width, height, maxWidth, maxHeight) {
- var widthRatio = width / maxWidth;
- var heightRatio = height / maxHeight;
- var idealSize = widthRatio < heightRatio ? width : height;
- // console.log(`[${width}, ${height}], [${maxWidth}, ${maxHeight}], ${widthRatio}, ${heightRatio}, ideal = ${idealSize}`)
- return idealSize;
- };
-
- if (this.currentZoom === null) {
- this.currentZoom = [width / 2, height / 2, idealSize(width, height, width, height)];
- }
- var target = [node.x, node.y, idealSize(node.width, node.height, width, height)];
+ _this.currentZoom = null;
+ return _this;
+ }
- this.transition(this.currentZoom, target, node);
+ _createClass(VisualGraph, [{
+ key: "saveGraph",
+ value: function saveGraph(graph) {
+ this.setState({ graph: graph });
+ }
+ }, {
+ key: "UNSAFE_componentWillReceiveProps",
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
+ if (nextProps.graph) {
+ nextProps.graph._label.rankdir = nextProps.layout;
+ this.graphLayout.layout(nextProps.graph);
+ }
+ }
+ }, {
+ key: "shouldComponentUpdate",
+ value: function shouldComponentUpdate(nextProps, nextState) {
+ return this.state !== nextState;
+ }
+ }, {
+ key: "handleClick",
+ value: function handleClick(node) {
+ var selectedNode = node.id;
+ this.setState({ selectedNode: selectedNode });
+
+ var _state$graph$graph = this.state.graph.graph(),
+ width = _state$graph$graph.width,
+ height = _state$graph$graph.height;
+
+ var idealSize = function idealSize(width, height, maxWidth, maxHeight) {
+ var widthRatio = width / maxWidth;
+ var heightRatio = height / maxHeight;
+ var idealSize = widthRatio < heightRatio ? width : height;
+ // console.log(`[${width}, ${height}], [${maxWidth}, ${maxHeight}], ${widthRatio}, ${heightRatio}, ideal = ${idealSize}`)
+ return idealSize;
+ };
+
+ if (this.currentZoom === null) {
+ this.currentZoom = [width / 2, height / 2, idealSize(width, height, width, height)];
+ }
+ var target = [node.x, node.y, idealSize(node.width, node.height, width, height)];
+
+ this.transition(this.currentZoom, target, node);
+
+ this.currentZoom = target;
+ }
+ }, {
+ key: "transition",
+ value: function transition(start, end, node) {
+ var _state$graph$graph2 = this.state.graph.graph(),
+ width = _state$graph$graph2.width,
+ height = _state$graph$graph2.height;
+
+ var center = {
+ x: width / 2,
+ y: height / 2
+ };
+ var i = d3.interpolateZoom(start, end);
+
+ var transform = function transform(_ref) {
+ var _ref2 = _slicedToArray(_ref, 3),
+ x = _ref2[0],
+ y = _ref2[1],
+ size = _ref2[2];
+
+ var scale = width / size;
+ var translateX = center.x - x * scale;
+ var translateY = center.y - y * scale;
+ return "translate(" + translateX + "," + translateY + ")scale(" + scale + ")";
+ };
+
+ d3.select(this.group).attr("transform", transform(start)).transition().duration(i.duration).attrTween("transform", function () {
+ return function (t) {
+ return transform(i(t));
+ };
+ });
+ }
+ }, {
+ key: "render",
+ value: function render() {
+ var _this2 = this;
- this.currentZoom = target;
- }
- }, {
- key: "transition",
- value: function transition(start, end, node) {
- var _state$graph$graph2 = this.state.graph.graph(),
- width = _state$graph$graph2.width,
- height = _state$graph$graph2.height;
-
- var center = {
- x: width / 2,
- y: height / 2
- };
- var i = d3.interpolateZoom(start, end);
-
- var transform = function transform(_ref) {
- var _ref2 = _slicedToArray(_ref, 3),
- x = _ref2[0],
- y = _ref2[1],
- size = _ref2[2];
-
- var scale = width / size;
- var translateX = center.x - x * scale;
- var translateY = center.y - y * scale;
- return "translate(" + translateX + "," + translateY + ")scale(" + scale + ")";
- };
-
- d3.select(this.group).attr("transform", transform(start)).transition().duration(i.duration).attrTween("transform", function () {
- return function (t) {
- return transform(i(t));
- };
- });
- }
- }, {
- key: "render",
- value: function render() {
- var _this2 = this;
+ if (!this.state.graph) {
+ // console.log(this.state.graph)
+ return null;
+ }
- if (!this.state.graph) {
- // console.log(this.state.graph)
- return null;
- }
+ var g = this.state.graph;
- var g = this.state.graph;
+ var nodes = g.nodes().map(function (nodeName) {
+ var n = g.node(nodeName);
+ var props = {
+ key: nodeName,
+ node: n,
+ onClick: _this2.handleClick.bind(_this2)
+ };
- var nodes = g.nodes().map(function (nodeName) {
- var n = g.node(nodeName);
- var props = {
- key: nodeName,
- node: n,
- onClick: _this2.handleClick.bind(_this2)
- };
+ var Type = nodeDispatch(n);
- var Type = nodeDispatch(n);
+ return React.createElement(Type, props);
+ });
- return React.createElement(Type, props);
- });
+ var edges = g.edges().map(function (edgeName) {
+ var e = g.edge(edgeName);
+ return React.createElement(Edge, { key: edgeName.v + "->" + edgeName.w, edge: e });
+ });
- var edges = g.edges().map(function (edgeName) {
- var e = g.edge(edgeName);
- return React.createElement(Edge, { key: edgeName.v + "->" + edgeName.w, edge: e });
- });
+ var _g$graph = g.graph(),
+ width = _g$graph.width,
+ height = _g$graph.height;
- var _g$graph = g.graph(),
- width = _g$graph.width,
- height = _g$graph.height;
-
- return React.createElement(
- "svg",
- { ref: function ref(el) {
- _this2.svg = el;
- }, id: "visualization", xmlns: "http://www.w3.org/2000/svg", version: "1.1", viewBox: "0 0 " + width + " " + height },
- React.createElement(
- "style",
- null,
- fs.readFileSync(__dirname + "/src/bundle.css", "utf-8", function (err) {
- console.log(err);
- })
- ),
- React.createElement(
- "defs",
- null,
- React.createElement(Arrow, null)
- ),
- React.createElement(
- "g",
- { id: "graph", ref: function ref(el) {
- _this2.group = el;
- } },
- React.createElement(
- "g",
- { id: "nodes" },
- nodes
- ),
- React.createElement(
- "g",
- { id: "edges" },
- edges
- )
- )
- );
- }
- }]);
+ return React.createElement(
+ "svg",
+ {
+ ref: function ref(el) {
+ _this2.svg = el;
+ },
+ id: "visualization",
+ xmlns: "http://www.w3.org/2000/svg",
+ version: "1.1",
+ viewBox: "0 0 " + width + " " + height
+ },
+ React.createElement(
+ "style",
+ null,
+ fs.readFileSync(__dirname + "/src/bundle.css", "utf-8", function (err) {
+ console.log(err);
+ })
+ ),
+ React.createElement(
+ "defs",
+ null,
+ React.createElement(Arrow, null)
+ ),
+ React.createElement(
+ "g",
+ {
+ id: "graph",
+ ref: function ref(el) {
+ _this2.group = el;
+ }
+ },
+ React.createElement(
+ "g",
+ { id: "nodes" },
+ nodes
+ ),
+ React.createElement(
+ "g",
+ { id: "edges" },
+ edges
+ )
+ )
+ );
+ }
+ }]);
- return VisualGraph;
+ return VisualGraph;
}(React.Component);
var Arrow = function Arrow() {
- return React.createElement(
- "marker",
- { id: "arrow", viewBox: "0 0 10 10", refX: "10", refY: "5", markerUnits: "strokeWidth", markerWidth: "10", markerHeight: "7.5", orient: "auto" },
- React.createElement("path", { d: "M 0 0 L 10 5 L 0 10 L 3 5 z", className: "arrow" })
- );
+ return React.createElement(
+ "marker",
+ {
+ id: "arrow",
+ viewBox: "0 0 10 10",
+ refX: "10",
+ refY: "5",
+ markerUnits: "strokeWidth",
+ markerWidth: "10",
+ markerHeight: "7.5",
+ orient: "auto"
+ },
+ React.createElement("path", { d: "M 0 0 L 10 5 L 0 10 L 3 5 z", className: "arrow" })
+ );
};
var Edge = function (_React$Component2) {
- _inherits(Edge, _React$Component2);
+ _inherits(Edge, _React$Component2);
- function Edge(props) {
- _classCallCheck(this, Edge);
+ function Edge(props) {
+ _classCallCheck(this, Edge);
- var _this3 = _possibleConstructorReturn(this, (Edge.__proto__ || Object.getPrototypeOf(Edge)).call(this, props));
+ var _this3 = _possibleConstructorReturn(this, (Edge.__proto__ || Object.getPrototypeOf(Edge)).call(this, props));
- _this3.line = d3.line().curve(d3.curveBasis).x(function (d) {
- return d.x;
- }).y(function (d) {
- return d.y;
- });
+ _this3.line = d3.line().curve(d3.curveBasis).x(function (d) {
+ return d.x;
+ }).y(function (d) {
+ return d.y;
+ });
- _this3.state = {
- previousPoints: []
- };
- return _this3;
- }
+ _this3.state = {
+ previousPoints: []
+ };
+ return _this3;
+ }
- _createClass(Edge, [{
- key: "componentWillReceiveProps",
- value: function componentWillReceiveProps(nextProps) {
- this.setState({
- previousPoints: this.props.edge.points
- });
- }
- }, {
- key: "mount",
- value: function mount(domNode) {
- if (domNode) {
- domNode.beginElement();
- }
- }
- }, {
- key: "render",
- value: function render() {
- var e = this.props.edge;
- var l = this.line;
- return React.createElement(
- "g",
- { className: "edge", markerEnd: "url(#arrow)" },
- React.createElement(
- "path",
- { d: l(e.points) },
- React.createElement("animate", { ref: this.mount, key: Math.random(), restart: "always", from: l(this.state.previousPoints), to: l(e.points), begin: "0s", dur: "0.25s", fill: "freeze", repeatCount: "1", attributeName: "d" })
- )
- );
- }
- }]);
+ _createClass(Edge, [{
+ key: "UNSAFE_componentWillReceiveProps",
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
+ this.setState({
+ previousPoints: this.props.edge.points
+ });
+ }
+ }, {
+ key: "mount",
+ value: function mount(domNode) {
+ if (domNode) {
+ domNode.beginElement();
+ }
+ }
+ }, {
+ key: "render",
+ value: function render() {
+ var e = this.props.edge;
+ var l = this.line;
+ return React.createElement(
+ "g",
+ { className: "edge", markerEnd: "url(#arrow)" },
+ React.createElement(
+ "path",
+ { d: l(e.points) },
+ React.createElement("animate", {
+ ref: this.mount,
+ key: Math.random(),
+ restart: "always",
+ from: l(this.state.previousPoints),
+ to: l(e.points),
+ begin: "0s",
+ dur: "0.25s",
+ fill: "freeze",
+ repeatCount: "1",
+ attributeName: "d"
+ })
+ )
+ );
+ }
+ }]);
- return Edge;
+ return Edge;
}(React.Component);
var nodeDispatch = function nodeDispatch(n) {
- var Type = null;
- if (n.isMetanode === true) {
- if (n.isAnonymous) {
- Type = AnonymousMetanode;
- } else {
- Type = Metanode;
- }
+ var Type = null;
+ if (n.isMetanode === true) {
+ if (n.isAnonymous) {
+ Type = AnonymousMetanode;
} else {
- if (n.userGeneratedId) {
- Type = IdentifiedNode;
- } else {
- Type = AnonymousNode;
- }
+ Type = Metanode;
}
- return Type;
+ } else {
+ Type = AtomNode;
+ }
+ return Type;
};
-var Node = function (_React$Component3) {
- _inherits(Node, _React$Component3);
-
- function Node() {
- _classCallCheck(this, Node);
-
- return _possibleConstructorReturn(this, (Node.__proto__ || Object.getPrototypeOf(Node)).apply(this, arguments));
- }
-
- _createClass(Node, [{
- key: "render",
- value: function render() {
- var n = this.props.node;
- var type = n.isMetanode ? "metanode" : "node";
-
- var translateX = Math.floor(n.x - n.width / 2);
- var translateY = Math.floor(n.y - n.height / 2);
-
- return React.createElement(
- "g",
- {
- className: type + " " + n.class,
- onClick: this.props.onClick.bind(this, this.props.node),
- transform: "translate(" + translateX + "," + translateY + ")"
- },
- React.createElement("rect", { width: n.width, height: n.height, rx: "15px", ry: "15px", style: n.style }),
- this.props.children
- );
- }
- }]);
-
- return Node;
-}(React.Component);
-
-var Metanode = function (_Node) {
- _inherits(Metanode, _Node);
-
- function Metanode() {
- _classCallCheck(this, Metanode);
-
- return _possibleConstructorReturn(this, (Metanode.__proto__ || Object.getPrototypeOf(Metanode)).apply(this, arguments));
- }
-
- _createClass(Metanode, [{
- key: "render",
- value: function render() {
- var n = this.props.node;
- return React.createElement(
- Node,
- this.props,
- React.createElement(
- "text",
- { transform: "translate(10,0)", textAnchor: "start", style: { dominantBaseline: "ideographic" } },
- React.createElement(
- "tspan",
- { x: "0", className: "id" },
- n.userGeneratedId
- ),
- React.createElement(
- "tspan",
- { x: "0", dy: "1.2em" },
- n.class
- )
- )
- );
- }
- }]);
-
- return Metanode;
-}(Node);
-
-var AnonymousMetanode = function (_Node2) {
- _inherits(AnonymousMetanode, _Node2);
-
- function AnonymousMetanode() {
- _classCallCheck(this, AnonymousMetanode);
-
- return _possibleConstructorReturn(this, (AnonymousMetanode.__proto__ || Object.getPrototypeOf(AnonymousMetanode)).apply(this, arguments));
- }
+var Node = function Node(props) {
+ var n = props.node;
+ var type = n.isMetanode ? "metanode" : "node";
+
+ var translateX = Math.floor(n.x - n.width / 2);
+ var translateY = Math.floor(n.y - n.height / 2);
+
+ return React.createElement(
+ "g",
+ {
+ className: type + " " + n.class
+ // TODO: fix zooming
+ // onClick={props.onClick.bind(this, props.node)}
+ , transform: "translate(" + translateX + "," + translateY + ")"
+ },
+ React.createElement(
+ "foreignObject",
+ { width: props.node.width, height: props.node.height },
+ React.createElement(
+ "section",
+ {
+ style: {
+ color: "white",
+ display: "flex",
+ flexDirection: "column",
+ alignItems: "center",
+ justifyContent: "center",
+ height: "100%",
+ width: "100%",
+ overflow: "hidden",
+ borderRadius: "10px",
+ backgroundColor: props.node.style ? props.node.style.fill : undefined,
+ boxShadow: "0px 0px 0px 1px white"
+ }
+ },
+ props.children
+ )
+ )
+ );
+};
- _createClass(AnonymousMetanode, [{
- key: "render",
- value: function render() {
- var n = this.props.node;
- return React.createElement(
- Node,
- this.props,
- React.createElement(
- "text",
- { transform: "translate(10,0)", textAnchor: "start", style: { dominantBaseline: "ideographic" } },
- React.createElement(
- "tspan",
- { x: "0", className: "id" },
- n.userGeneratedId
- )
- )
- );
- }
- }]);
+var Metanode = function Metanode(props) {
+ return React.createElement(
+ Node,
+ props,
+ "muuuu"
+ );
+};
- return AnonymousMetanode;
-}(Node);
+var AnonymousMetanode = function AnonymousMetanode(props) {
+ return React.createElement(Node, props);
+};
-var AnonymousNode = function (_Node3) {
- _inherits(AnonymousNode, _Node3);
+var AtomNode = function AtomNode(props) {
+ return React.createElement(
+ Node,
+ props,
+ React.createElement(NodeContent, { node: props.node })
+ );
+};
- function AnonymousNode() {
- _classCallCheck(this, AnonymousNode);
+var NodeContent = function NodeContent(_ref3) {
+ var node = _ref3.node;
- return _possibleConstructorReturn(this, (AnonymousNode.__proto__ || Object.getPrototypeOf(AnonymousNode)).apply(this, arguments));
- }
+ var id = node.userGeneratedId;
+ if (!node.hasOwnProperty("parameters")) {
+ console.warn("WTF", node);
+ return null;
+ }
- _createClass(AnonymousNode, [{
- key: "render",
- value: function render() {
- var n = this.props.node;
- return React.createElement(
- Node,
- this.props,
- React.createElement(
- "text",
- { transform: "translate(" + n.width / 2 + "," + n.height / 2 + ")", textAnchor: "middle" },
- React.createElement(
- "tspan",
- null,
- n.class
- )
- )
- );
+ var params = node.parameters.length !== 0 ? React.createElement(
+ "div",
+ {
+ style: {
+ background: "rgba(0, 0, 0, 0.2)",
+ fontSize: "0.8em",
+ maxWidth: "100%",
+ width: "100%",
+ paddingTop: "3px",
+ paddingBottom: "3px"
+ }
+ },
+ React.createElement(
+ "table",
+ {
+ style: {
+ borderCollapse: "collapse",
+ width: "100%",
+ lineHeight: "14px"
}
- }]);
-
- return AnonymousNode;
-}(Node);
-
-var IdentifiedNode = function (_Node4) {
- _inherits(IdentifiedNode, _Node4);
-
- function IdentifiedNode() {
- _classCallCheck(this, IdentifiedNode);
-
- return _possibleConstructorReturn(this, (IdentifiedNode.__proto__ || Object.getPrototypeOf(IdentifiedNode)).apply(this, arguments));
- }
-
- _createClass(IdentifiedNode, [{
- key: "render",
- value: function render() {
- var n = this.props.node;
- return React.createElement(
- Node,
- this.props,
- React.createElement(
- "text",
- { transform: "translate(" + n.width / 2 + "," + n.height / 2 + ")", textAnchor: "middle", style: { dominantBaseline: "ideographic" } },
- React.createElement(
- "tspan",
- { x: "0", className: "id" },
- n.userGeneratedId
- ),
- React.createElement(
- "tspan",
- { x: "0", dy: "1.2em" },
- n.class
- )
- )
- );
+ },
+ React.createElement(
+ "tbody",
+ null,
+ node.parameters.map(function (_ref4, i) {
+ var _ref5 = _slicedToArray(_ref4, 2),
+ key = _ref5[0],
+ value = _ref5[1];
+
+ return React.createElement(
+ "tr",
+ { key: key },
+ React.createElement(
+ "td",
+ {
+ style: {
+ paddingRight: "0.25em",
+ fontWeight: "bold",
+ textAlign: "right"
+ }
+ },
+ key
+ ),
+ React.createElement(
+ "td",
+ { style: { paddingLeft: "0.25em" } },
+ value
+ )
+ );
+ })
+ )
+ )
+ ) : null;
+
+ return React.createElement(
+ React.Fragment,
+ null,
+ React.createElement(
+ "header",
+ {
+ style: {
+ padding: "3px 0",
+ display: "flex",
+ flexDirection: "column",
+ alignItems: "center",
+ justifyContent: "center"
}
- }]);
-
- return IdentifiedNode;
-}(Node);
+ },
+ id && React.createElement(
+ "div",
+ { className: "id", style: { fontWeight: "bold" } },
+ id
+ ),
+ React.createElement(
+ "div",
+ null,
+ node.class
+ )
+ ),
+ params
+ );
+};
'use strict';
function run() {
@@ -2106,4 +2149,4 @@ if (loadedStates.includes(document.readyState) && document.body) {
window.addEventListener('DOMContentLoaded', run, false);
}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdHMvQ29sb3JIYXNoLmpzIiwic2NyaXB0cy9Db21wdXRhdGlvbmFsR3JhcGguanMiLCJzY3JpcHRzL0VkaXRvci5qc3giLCJzY3JpcHRzL0dyYXBoTGF5b3V0LmpzeCIsInNjcmlwdHMvSURFLmpzeCIsInNjcmlwdHMvSW50ZXJwcmV0ZXIuanMiLCJzY3JpcHRzL0xvZ2dlci5qcyIsInNjcmlwdHMvUGFuZWwuanN4Iiwic2NyaXB0cy9QYXJzZXIuanMiLCJzY3JpcHRzL1B5VG9yY2hHZW5lcmF0b3IuanMiLCJzY3JpcHRzL1Njb3BlU3RhY2suanMiLCJzY3JpcHRzL1Zpc3VhbEdyYXBoLmpzeCIsInNjcmlwdHMvYXBwLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBTSxnQjs7OzthQUNGLFMsR0FBWSxJQUFJLFNBQUosQ0FBYztBQUN0Qix3QkFBWSxDQUFDLEdBQUQsQ0FEVTtBQUV0Qix1QkFBVyxDQUFDLElBQUQsQ0FGVztBQUd0QixrQkFBTSxLQUFLO0FBSFcsU0FBZCxDO2FBTVosUyxHQUFZLElBQUksU0FBSixDQUFjO0FBQ3RCLHdCQUFZLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBRFU7QUFFdEIsdUJBQVcsQ0FBQyxJQUFEO0FBRlcsU0FBZCxDOzs7OztpQ0FLSCxHLEVBQUs7QUFDVixnQkFBSSxPQUFPLENBQVg7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsd0JBQVEsSUFBSSxVQUFKLENBQWUsQ0FBZixDQUFSO0FBQ0g7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7Ozs4QkFFSyxHLEVBQUs7QUFDUCxnQkFBSSxPQUFPLENBQVg7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsdUJBQU8sT0FBTyxFQUFQLEdBQVksSUFBSSxVQUFKLENBQWUsQ0FB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ckI7O0FBRUEsSUFBSSxhQUFhLFFBQWIsQ0FBc0IsU0FBUyxVQUEvQixLQUE4QyxTQUFTLElBQTNELEVBQWlFO0FBQy9EO0FBQ0QsQ0FGRCxNQUVPO0FBQ0wsU0FBTyxnQkFBUCxDQUF3QixrQkFBeEIsRUFBNEMsR0FBNUMsRUFBaUQsS0FBakQ7QUFDRCIsImZpbGUiOiJidW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBDb2xvckhhc2hXcmFwcGVye1xuICAgIGNvbG9ySGFzaCA9IG5ldyBDb2xvckhhc2goe1xuICAgICAgICBzYXR1cmF0aW9uOiBbMC45XSxcbiAgICAgICAgbGlnaHRuZXNzOiBbMC40NV0sXG4gICAgICAgIGhhc2g6IHRoaXMubWFnaWNcbiAgICB9KVxuXG4gICAgY29sb3JIYXNoID0gbmV3IENvbG9ySGFzaCh7XG4gICAgICAgIHNhdHVyYXRpb246IFswLjUsIDAuNiwgMC43XSxcbiAgICAgICAgbGlnaHRuZXNzOiBbMC40NV0sXG4gICAgfSlcblxuICAgIGxvc2VMb3NlKHN0cikge1xuICAgICAgICB2YXIgaGFzaCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYXNoICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoXG4gICAgfVxuXG4gICAgbWFnaWMoc3RyKSB7XG4gICAgICAgIHZhciBoYXNoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGhhc2ggPSBoYXNoICogNDcgKyBzdHIuY2hhckNvZGVBdChpKSAlIDMyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoXG4gICAgfVxuXG4gICAgaGV4KHN0cikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvckhhc2guaGV4KHN0cilcbiAgICB9XG59IiwiY2xhc3MgQ29tcHV0YXRpb25hbEdyYXBoe1xuXHRub2RlQ291bnRlciA9IHt9XG5cdF9ub2RlU3RhY2sgPSBbXVxuXHRfcHJldmlvdXNOb2RlU3RhY2sgPSBbXVxuXG5cdHNjb3BlU3RhY2sgPSBuZXcgU2NvcGVTdGFjaygpXG5cblx0bWV0YW5vZGVzID0ge31cblx0bWV0YW5vZGVTdGFjayA9IFtdXG5cblx0Z2V0IGdyYXBoKCkge1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLm1ldGFub2RlU3RhY2tbdGhpcy5tZXRhbm9kZVN0YWNrLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiB0aGlzLm1ldGFub2Rlc1tsYXN0SW5kZXhdO1xuXHR9XG5cblx0Z2V0IG5vZGVTdGFjaygpIHtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5tZXRhbm9kZVN0YWNrW3RoaXMubWV0YW5vZGVTdGFjay5sZW5ndGggLSAxXTtcblx0XHRyZXR1cm4gdGhpcy5fbm9kZVN0YWNrW2xhc3RJbmRleF1cblx0fVxuXG5cdHNldCBub2RlU3RhY2sodmFsdWUpIHtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5tZXRhbm9kZVN0YWNrW3RoaXMubWV0YW5vZGVTdGFjay5sZW5ndGggLSAxXTtcblx0XHR0aGlzLl9ub2RlU3RhY2tbbGFzdEluZGV4XSA9IHZhbHVlXG5cdH1cblxuXHRnZXQgcHJldmlvdXNOb2RlU3RhY2soKSB7XG5cdFx0bGV0IGxhc3RJbmRleCA9IHRoaXMubWV0YW5vZGVTdGFja1t0aGlzLm1ldGFub2RlU3RhY2subGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuIHRoaXMuX3ByZXZpb3VzTm9kZVN0YWNrW2xhc3RJbmRleF1cblx0fVxuXG5cdHNldCBwcmV2aW91c05vZGVTdGFjayh2YWx1ZSkge1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLm1ldGFub2RlU3RhY2tbdGhpcy5tZXRhbm9kZVN0YWNrLmxlbmd0aCAtIDFdO1xuXHRcdHRoaXMuX3ByZXZpb3VzTm9kZVN0YWNrW2xhc3RJbmRleF0gPSB2YWx1ZVxuXHR9XG5cblx0Y29uc3RydWN0b3IocGFyZW50KSB7XG5cdFx0dGhpcy5pbml0aWFsaXplKCk7XG5cdFx0dGhpcy5tb25pZWwgPSBwYXJlbnQ7XG5cdH1cblxuXHRpbml0aWFsaXplKCkge1xuXHRcdHRoaXMubm9kZUNvdW50ZXIgPSB7fVxuXHRcdHRoaXMuc2NvcGVTdGFjay5pbml0aWFsaXplKCk7XG5cdFx0dGhpcy5jbGVhck5vZGVTdGFjaygpXG5cblx0XHR0aGlzLm5vZGVTdGFjayA9IFtdXG5cdFx0dGhpcy5wcmV2aW91c05vZGVTdGFjayA9IFtdXG5cblx0XHR0aGlzLm1ldGFub2RlcyA9IHt9XG5cdFx0dGhpcy5tZXRhbm9kZVN0YWNrID0gW11cblxuXHRcdC8vIGNvbnNvbGUubG9nKFwiTWV0YW5vZGVzOlwiLCB0aGlzLm1ldGFub2Rlcylcblx0XHQvLyBjb25zb2xlLmxvZyhcIk1ldGFub2RlIFN0YWNrOlwiLCB0aGlzLm1ldGFub2RlU3RhY2spXG5cbiAgICAgICAgdGhpcy5hZGRNYWluKCk7XG5cdH1cblxuXHRlbnRlck1ldGFub2RlU2NvcGUobmFtZSkge1xuXHRcdHRoaXMubWV0YW5vZGVzW25hbWVdID0gbmV3IGdyYXBobGliLkdyYXBoKHtcblx0XHRcdGNvbXBvdW5kOiB0cnVlXG5cdFx0fSk7XG5cdFx0dGhpcy5tZXRhbm9kZXNbbmFtZV0uc2V0R3JhcGgoe1xuXHRcdFx0bmFtZTogbmFtZSxcblx0ICAgICAgICByYW5rZGlyOiAnQlQnLFxuXHQgICAgICAgIGVkZ2VzZXA6IDIwLFxuXHQgICAgICAgIHJhbmtzZXA6IDQwLFxuXHQgICAgICAgIG5vZGVTZXA6IDMwLFxuXHQgICAgICAgIG1hcmdpbng6IDIwLFxuXHQgICAgICAgIG1hcmdpbnk6IDIwLFxuXHRcdH0pO1xuXHRcdHRoaXMubWV0YW5vZGVTdGFjay5wdXNoKG5hbWUpO1xuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMubWV0YW5vZGVTdGFjaylcblxuXHRcdHJldHVybiB0aGlzLm1ldGFub2Rlc1tuYW1lXTtcblx0fVxuXG5cdGV4aXRNZXRhbm9kZVNjb3BlKCkge1xuXHRcdHJldHVybiB0aGlzLm1ldGFub2RlU3RhY2sucG9wKCk7XG5cdH1cblxuXHRnZW5lcmF0ZUluc3RhbmNlSWQodHlwZSkge1xuXHRcdGlmICghdGhpcy5ub2RlQ291bnRlci5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkge1xuXHRcdFx0dGhpcy5ub2RlQ291bnRlclt0eXBlXSA9IDA7XG5cdFx0fVxuXHRcdHRoaXMubm9kZUNvdW50ZXJbdHlwZV0gKz0gMTtcblx0XHRsZXQgaWQgPSBcImFfXCIgKyB0eXBlICsgdGhpcy5ub2RlQ291bnRlclt0eXBlXTtcblx0XHRyZXR1cm4gaWQ7XG5cdH1cblxuXHRhZGRNYWluKCkge1xuXHRcdHRoaXMuZW50ZXJNZXRhbm9kZVNjb3BlKFwibWFpblwiKTtcblx0XHR0aGlzLnNjb3BlU3RhY2sucHVzaChcIi5cIik7XG5cdFx0bGV0IGlkID0gdGhpcy5zY29wZVN0YWNrLmN1cnJlbnRTY29wZUlkZW50aWZpZXIoKTtcblxuXHRcdHRoaXMuZ3JhcGguc2V0Tm9kZShpZCwge1xuXHRcdFx0Y2xhc3M6IFwiXCJcblx0XHR9KTtcblx0fVxuXG5cdHRvdWNoTm9kZShub2RlUGF0aCkge1xuXHRcdC8vIGNvbnNvbGUubG9nKGBUb3VjaGluZyBub2RlIFwiJHtub2RlUGF0aH1cIi5gKVxuXHRcdGlmICh0aGlzLmdyYXBoLmhhc05vZGUobm9kZVBhdGgpKSB7XG5cdFx0XHR0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGVQYXRoKVxuXG5cdFx0XHRpZiAodGhpcy5wcmV2aW91c05vZGVTdGFjay5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGdlKHRoaXMucHJldmlvdXNOb2RlU3RhY2tbMF0sIG5vZGVQYXRoKVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnByZXZpb3VzTm9kZVN0YWNrLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGdlKHRoaXMucHJldmlvdXNOb2RlU3RhY2ssIG5vZGVQYXRoKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYFRyeWluZyB0byB0b3VjaCBub24tZXhpc3RhbnQgbm9kZSBcIiR7bm9kZVBhdGh9XCJgKTtcblx0XHR9XG5cdH1cblxuXHRyZWZlcmVuY2VOb2RlKGlkKSB7XG5cdFx0dGhpcy5zY29wZVN0YWNrLnB1c2goaWQpO1xuXHRcdGxldCBub2RlUGF0aCA9IHRoaXMuc2NvcGVTdGFjay5jdXJyZW50U2NvcGVJZGVudGlmaWVyKCk7XG5cdFx0bGV0IHNjb3BlID0gdGhpcy5zY29wZVN0YWNrLnByZXZpb3VzU2NvcGVJZGVudGlmaWVyKCk7XG5cblx0XHR2YXIgbm9kZSA9IHtcblx0XHRcdHVzZXJHZW5lcmF0ZWRJZDogaWQsXG5cdFx0XHRjbGFzczogXCJ1bmRlZmluZWRcIixcblx0XHRcdGhlaWdodDogNTBcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuZ3JhcGguaGFzTm9kZShub2RlUGF0aCkpIHtcblx0XHRcdHRoaXMuZ3JhcGguc2V0Tm9kZShub2RlUGF0aCwge1xuXHRcdFx0XHQuLi5ub2RlLFxuXHRcdFx0XHR3aWR0aDogTWF0aC5tYXgobm9kZS5jbGFzcy5sZW5ndGgsIG5vZGUudXNlckdlbmVyYXRlZElkID8gbm9kZS51c2VyR2VuZXJhdGVkSWQubGVuZ3RoIDogMCkgKiAxMFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnNldFBhcmVudChub2RlUGF0aCwgc2NvcGUpO1xuXHRcdH1cblxuXHRcdHRoaXMudG91Y2hOb2RlKG5vZGVQYXRoKTtcblx0XHR0aGlzLnNjb3BlU3RhY2sucG9wKCk7XG5cdH1cblxuXHRjcmVhdGVOb2RlKGlkLCBub2RlKSB7XG5cdFx0dGhpcy5zY29wZVN0YWNrLnB1c2goaWQpXG5cdFx0bGV0IG5vZGVQYXRoID0gdGhpcy5zY29wZVN0YWNrLmN1cnJlbnRTY29wZUlkZW50aWZpZXIoKVxuXHRcdGxldCBzY29wZSA9IHRoaXMuc2NvcGVTdGFjay5wcmV2aW91c1Njb3BlSWRlbnRpZmllcigpXG5cblx0XHRpZiAodGhpcy5ncmFwaC5oYXNOb2RlKG5vZGVQYXRoKSkge1xuXHRcdFx0Y29uc29sZS53YXJuKGBSZWRlZmluaW5nIG5vZGUgXCIke2lkfVwiYCk7XHRcblx0XHR9XG5cblx0XHR0aGlzLmdyYXBoLnNldE5vZGUobm9kZVBhdGgsIHtcblx0XHRcdC4uLm5vZGUsXG5cdFx0XHRpZDogbm9kZVBhdGhcblx0XHR9KTtcblx0XHR0aGlzLnNldFBhcmVudChub2RlUGF0aCwgc2NvcGUpO1xuXG5cdFx0dGhpcy50b3VjaE5vZGUobm9kZVBhdGgpO1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcblxuXHRcdHJldHVybiBub2RlUGF0aDtcblx0fVxuXG5cdGNyZWF0ZU1ldGFub2RlKGlkZW50aWZpZXIsIG5vZGUpIHtcblx0XHRjb25zdCBtZXRhbm9kZUNsYXNzID0gbm9kZS5jbGFzc1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wdXNoKGlkZW50aWZpZXIpXG5cdFx0bGV0IG5vZGVQYXRoID0gdGhpcy5zY29wZVN0YWNrLmN1cnJlbnRTY29wZUlkZW50aWZpZXIoKVxuXHRcdGxldCBzY29wZSA9IHRoaXMuc2NvcGVTdGFjay5wcmV2aW91c1Njb3BlSWRlbnRpZmllcigpXG5cdFx0XG5cdFx0dGhpcy5ncmFwaC5zZXROb2RlKG5vZGVQYXRoLCB7XG5cdFx0XHQuLi5ub2RlLFxuXHRcdFx0aWQ6IG5vZGVQYXRoLFxuXHRcdFx0aXNNZXRhbm9kZTogdHJ1ZVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5ncmFwaC5zZXRQYXJlbnQobm9kZVBhdGgsIHNjb3BlKTtcblxuXHRcdGxldCB0YXJnZXRNZXRhbm9kZSA9IHRoaXMubWV0YW5vZGVzW21ldGFub2RlQ2xhc3NdO1xuXHRcdHRhcmdldE1ldGFub2RlLm5vZGVzKCkuZm9yRWFjaChub2RlSWQgPT4ge1xuXHRcdFx0bGV0IG5vZGUgPSB0YXJnZXRNZXRhbm9kZS5ub2RlKG5vZGVJZCk7XG5cdFx0XHRpZiAoIW5vZGUpIHsgcmV0dXJuIH1cblx0XHRcdGxldCBuZXdOb2RlSWQgPSBub2RlSWQucmVwbGFjZShcIi5cIiwgbm9kZVBhdGgpO1xuXHRcdFx0dmFyIG5ld05vZGUgPSB7XG5cdFx0XHRcdC4uLm5vZGUsXG5cdFx0XHRcdGlkOiBuZXdOb2RlSWRcblx0XHRcdH1cblx0XHRcdHRoaXMuZ3JhcGguc2V0Tm9kZShuZXdOb2RlSWQsIG5ld05vZGUpO1xuXG5cdFx0XHRsZXQgbmV3UGFyZW50ID0gdGFyZ2V0TWV0YW5vZGUucGFyZW50KG5vZGVJZCkucmVwbGFjZShcIi5cIiwgbm9kZVBhdGgpO1xuXHRcdFx0dGhpcy5ncmFwaC5zZXRQYXJlbnQobmV3Tm9kZUlkLCBuZXdQYXJlbnQpO1xuXHRcdH0pO1xuXG5cdFx0dGFyZ2V0TWV0YW5vZGUuZWRnZXMoKS5mb3JFYWNoKGVkZ2UgPT4ge1xuXHRcdFx0Y29uc3QgZSA9IHRhcmdldE1ldGFub2RlLmVkZ2UoZWRnZSlcblx0XHRcdHRoaXMuZ3JhcGguc2V0RWRnZShlZGdlLnYucmVwbGFjZShcIi5cIiwgbm9kZVBhdGgpLCBlZGdlLncucmVwbGFjZShcIi5cIiwgbm9kZVBhdGgpLCB7fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNjb3BlU3RhY2sucG9wKCk7XG5cblx0XHR0aGlzLnRvdWNoTm9kZShub2RlUGF0aCk7XG5cdH1cblxuXHRjbGVhck5vZGVTdGFjaygpIHtcblx0XHR0aGlzLnByZXZpb3VzTm9kZVN0YWNrID0gW11cblx0XHR0aGlzLm5vZGVTdGFjayA9IFtdXG5cdH1cblxuXHRmcmVlemVOb2RlU3RhY2soKSB7XG5cdFx0dGhpcy5wcmV2aW91c05vZGVTdGFjayA9IFsuLi50aGlzLm5vZGVTdGFja11cblx0XHR0aGlzLm5vZGVTdGFjayA9IFtdXG5cdH1cblxuXHRzZXRQYXJlbnQoY2hpbGRQYXRoLCBwYXJlbnRQYXRoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ3JhcGguc2V0UGFyZW50KGNoaWxkUGF0aCwgcGFyZW50UGF0aClcblx0fVxuXG5cdGlzSW5wdXQobm9kZVBhdGgpIHtcblx0XHRjb25zdCBpc0F2YWlsYWJsZSA9ICh0aGlzLmdyYXBoLmluRWRnZXMobm9kZVBhdGgpLmxlbmd0aCA9PT0gMClcblx0XHRjb25zdCBpc0lucHV0ID0gKHRoaXMuZ3JhcGgubm9kZShub2RlUGF0aCkuY2xhc3MgPT09IFwiSW5wdXRcIilcblx0XHRjb25zdCBpc1VuZGVmaW5lZCA9ICh0aGlzLmdyYXBoLm5vZGUobm9kZVBhdGgpLmNsYXNzID09PSBcInVuZGVmaW5lZFwiKVxuXHRcdHJldHVybiAoaXNJbnB1dCB8fCAoaXNVbmRlZmluZWQgJiYgaXNBdmFpbGFibGUpKVxuXHR9XG5cblx0aXNPdXRwdXQobm9kZVBhdGgpIHtcblx0XHRjb25zdCBpc0F2YWlsYWJsZSA9ICh0aGlzLmdyYXBoLm91dEVkZ2VzKG5vZGVQYXRoKS5sZW5ndGggPT09IDApXG5cdFx0Y29uc3QgaXNPdXRwdXQgPSAodGhpcy5ncmFwaC5ub2RlKG5vZGVQYXRoKS5jbGFzcyA9PT0gXCJPdXRwdXRcIilcblx0XHRjb25zdCBpc1VuZGVmaW5lZCA9ICh0aGlzLmdyYXBoLm5vZGUobm9kZVBhdGgpLmNsYXNzID09PSBcInVuZGVmaW5lZFwiKVxuXHRcdHJldHVybiAoaXNPdXRwdXQgfHwgKGlzVW5kZWZpbmVkICYmIGlzQXZhaWxhYmxlKSlcblx0fVxuXG5cdGlzTWV0YW5vZGUobm9kZVBhdGgpIHtcblx0XHQvLyBjb25zb2xlLmxvZyhcImlzTWV0YW5vZGU6XCIsIG5vZGVQYXRoKVxuXHRcdHJldHVybiB0aGlzLmdyYXBoLm5vZGUobm9kZVBhdGgpLmlzTWV0YW5vZGUgPT09IHRydWVcblx0fVxuXG5cdGdldE91dHB1dE5vZGVzKHNjb3BlUGF0aCkge1xuXHRcdGxldCBzY29wZSA9IHRoaXMuZ3JhcGgubm9kZShzY29wZVBhdGgpXG5cdFx0bGV0IG91dHB1dE5vZGVzID0gdGhpcy5ncmFwaC5jaGlsZHJlbihzY29wZVBhdGgpLmZpbHRlcihub2RlID0+IHRoaXMuaXNPdXRwdXQobm9kZSkpXG5cblx0XHRpZiAob3V0cHV0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdFx0dGhpcy5tb25pZWwubG9nZ2VyLmFkZElzc3VlKHtcblx0XHRcdFx0bWVzc2FnZTogYE1ldGFub2RlIFwiJHtzY29wZS5pZH1cIiBkb2Vzbid0IGhhdmUgYW55IE91dHB1dCBub2RlLmAsXG5cdFx0XHRcdHR5cGU6IFwiZXJyb3JcIixcblx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRzdGFydDogc2NvcGUuX3NvdXJjZSA/IHNjb3BlLl9zb3VyY2Uuc3RhcnRJZHggOiAwLFxuXHRcdFx0XHRcdGVuZDogc2NvcGUuX3NvdXJjZSA/IHNjb3BlLl9zb3VyY2UuZW5kSWR4IDogMFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBudWxsXG5cdFx0fSBlbHNlIGlmIChvdXRwdXROb2Rlcy5sZW5ndGggPT09IDEgJiYgdGhpcy5ncmFwaC5ub2RlKG91dHB1dE5vZGVzWzBdKS5pc01ldGFub2RlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlcyhvdXRwdXROb2Rlc1swXSlcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0Tm9kZXNcblx0fVxuXG5cdGdldElucHV0Tm9kZXMoc2NvcGVQYXRoKSB7XG5cdFx0Y29uc29sZS5sb2coc2NvcGVQYXRoKVxuXHRcdGxldCBzY29wZSA9IHRoaXMuZ3JhcGgubm9kZShzY29wZVBhdGgpXG5cdFx0bGV0IGlucHV0Tm9kZXMgPSB0aGlzLmdyYXBoLmNoaWxkcmVuKHNjb3BlUGF0aCkuZmlsdGVyKG5vZGUgPT4gdGhpcy5pc0lucHV0KG5vZGUpKVxuXHRcdGNvbnNvbGUubG9nKGlucHV0Tm9kZXMpXG5cblx0XHRpZiAoaW5wdXROb2Rlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsXG5cdFx0XHR0aGlzLm1vbmllbC5sb2dnZXIuYWRkSXNzdWUoe1xuXHRcdFx0XHRtZXNzYWdlOiBgTWV0YW5vZGUgXCIke3Njb3BlLmlkfVwiIGRvZXNuJ3QgaGF2ZSBhbnkgSW5wdXQgbm9kZXMuYCxcblx0XHRcdFx0dHlwZTogXCJlcnJvclwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdHN0YXJ0OiBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5zdGFydElkeCA6IDAsXG5cdFx0XHRcdFx0ZW5kOiAgc2NvcGUuX3NvdXJjZSA/IHNjb3BlLl9zb3VyY2UuZW5kSWR4IDogMFxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuIG51bGxcblx0XHR9IGVsc2UgaWYgKGlucHV0Tm9kZXMubGVuZ3RoID09PSAxICYmIHRoaXMuZ3JhcGgubm9kZShpbnB1dE5vZGVzWzBdKS5pc01ldGFub2RlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnB1dE5vZGVzKGlucHV0Tm9kZXNbMF0pXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlucHV0Tm9kZXNcblx0fVxuXG5cdHNldEVkZ2UoZnJvbVBhdGgsIHRvUGF0aCkge1xuXHRcdGNvbnNvbGUuaW5mbyhgQ3JlYXRpbmcgZWRnZSBmcm9tIFwiJHtmcm9tUGF0aH1cIiB0byBcIiR7dG9QYXRofVwiLmApXG5cdFx0dmFyIHNvdXJjZVBhdGhzXG5cblx0XHRpZiAodHlwZW9mIGZyb21QYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAodGhpcy5pc01ldGFub2RlKGZyb21QYXRoKSkge1xuXHRcdFx0XHRzb3VyY2VQYXRocyA9IHRoaXMuZ2V0T3V0cHV0Tm9kZXMoZnJvbVBhdGgpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2VQYXRocyA9IFtmcm9tUGF0aF1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZnJvbVBhdGgpKSB7XG5cdFx0XHRzb3VyY2VQYXRocyA9IGZyb21QYXRoXG5cdFx0fVxuXG5cdFx0dmFyIHRhcmdldFBhdGhzXG5cblx0XHRpZiAodHlwZW9mIHRvUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHRoaXMuaXNNZXRhbm9kZSh0b1BhdGgpKSB7XG5cdFx0XHRcdHRhcmdldFBhdGhzID0gdGhpcy5nZXRJbnB1dE5vZGVzKHRvUGF0aClcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhcmdldFBhdGhzID0gW3RvUGF0aF1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9QYXRoKSkge1xuXHRcdFx0dGFyZ2V0UGF0aHMgPSB0b1BhdGhcblx0XHR9XG5cblx0XHR0aGlzLnNldE11bHRpRWRnZShzb3VyY2VQYXRocywgdGFyZ2V0UGF0aHMpXG5cdH1cblxuXHRzZXRNdWx0aUVkZ2Uoc291cmNlUGF0aHMsIHRhcmdldFBhdGhzKSB7XG5cblx0XHRpZiAoc291cmNlUGF0aHMgPT09IG51bGwgfHwgdGFyZ2V0UGF0aHMgPT09IG51bGwpIHtcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGlmIChzb3VyY2VQYXRocy5sZW5ndGggPT09IHRhcmdldFBhdGhzLmxlbmd0aCkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAoc291cmNlUGF0aHNbaV0gJiYgdGFyZ2V0UGF0aHNbaV0pIHtcblx0XHRcdFx0XHR0aGlzLmdyYXBoLnNldEVkZ2Uoc291cmNlUGF0aHNbaV0sIHRhcmdldFBhdGhzW2ldLCB7fSk7XHRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGFyZ2V0UGF0aHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHNvdXJjZVBhdGhzLmZvckVhY2goc291cmNlUGF0aCA9PiB0aGlzLnNldEVkZ2Uoc291cmNlUGF0aCwgdGFyZ2V0UGF0aHNbMF0pKVxuXHRcdFx0fSBlbHNlIGlmIChzb3VyY2VQYXRocy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0dGFyZ2V0UGF0aHMuZm9yRWFjaCh0YXJnZXRQYXRoID0+IHRoaXMuc2V0RWRnZShzb3VyY2VQYXRoc1swXSwgdGFyZ2V0UGF0aCwpKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5tb25pZWwubG9nZ2VyLmFkZElzc3VlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBgTnVtYmVyIG9mIG5vZGVzIGRvZXMgbm90IG1hdGNoLiBbJHtzb3VyY2VQYXRocy5sZW5ndGh9XSAtPiBbJHt0YXJnZXRQYXRocy5sZW5ndGh9XWAsXG5cdFx0XHRcdFx0dHlwZTogXCJlcnJvclwiLFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHQvLyBzdGFydDogc2NvcGUuX3NvdXJjZSA/IHNjb3BlLl9zb3VyY2Uuc3RhcnRJZHggOiAwLFxuXHRcdFx0XHRcdFx0Ly8gZW5kOiAgc2NvcGUuX3NvdXJjZSA/IHNjb3BlLl9zb3VyY2UuZW5kSWR4IDogMFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH1cblxuXHRoYXNOb2RlKG5vZGVQYXRoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ3JhcGguaGFzTm9kZShub2RlUGF0aCk7XG5cdH1cblxuXHRnZXRHcmFwaCgpIHtcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLmdyYXBoKVxuXHRcdHJldHVybiB0aGlzLmdyYXBoO1xuXHR9XG5cblx0Z2V0TWV0YW5vZGVzKCkge1xuXHRcdHJldHVybiB0aGlzLm1ldGFub2Rlc1xuXHR9XG59IiwiY2xhc3MgRWRpdG9yIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50e1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICByZW1vdmVNYXJrZXJzKCkge1xuICAgICAgICB0aGlzLm1hcmtlcnMubWFwKG1hcmtlciA9PiB0aGlzLmVkaXRvci5zZXNzaW9uLnJlbW92ZU1hcmtlcihtYXJrZXIpKTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgfVxuXG4gICAgb25DdXJzb3JQb3NpdGlvbkNoYW5nZWQoZXZlbnQsIHNlbGVjdGlvbikge1xuICAgICAgICBsZXQgbSA9IHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0TWFya2VycygpO1xuICAgICAgICBsZXQgYyA9IHNlbGVjdGlvbi5nZXRDdXJzb3IoKTtcbiAgICAgICAgbGV0IG1hcmtlcnMgPSB0aGlzLm1hcmtlcnMubWFwKGlkID0+IG1baWRdKTtcbiAgICAgICAgbGV0IGN1cnNvck92ZXJNYXJrZXIgPSBtYXJrZXJzLm1hcChtYXJrZXIgPT4gbWFya2VyLnJhbmdlLmNvbnRhaW5zKGMucm93LCBjLmNvbHVtbikpLnJlZHVjZSggKHByZXYsIGN1cnIpID0+IHByZXYgfHwgY3VyciwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChjdXJzb3JPdmVyTWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5leGVjQ29tbWFuZChcImdvVG9OZXh0RXJyb3JcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKFwiYWNlL21vZGUvXCIgKyB0aGlzLnByb3BzLm1vZGUpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9cIiArIHRoaXMucHJvcHMudGhlbWUpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIGVuYWJsZUJhc2ljQXV0b2NvbXBsZXRpb246IHRydWUsXG4gICAgICAgICAgICBlbmFibGVTbmlwcGV0czogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZUxpdmVBdXRvY29tcGxldGlvbjogZmFsc2UsXG4gICAgICAgICAgICB3cmFwOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1Njcm9sbEVkaXRvckludG9WaWV3OiB0cnVlLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJGaXJhIENvZGVcIixcbiAgICAgICAgICAgIHNob3dMaW5lTnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIHNob3dHdXR0ZXI6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLiRibG9ja1Njcm9sbGluZyA9IEluZmluaXR5O1xuICAgICAgICB0aGlzLmVkaXRvci5jb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IDEuNztcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kZWZhdWx0VmFsdWUpe1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5wcm9wcy5kZWZhdWx0VmFsdWUsIC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsIHRoaXMub25DaGFuZ2UpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24ub24oXCJjaGFuZ2VDdXJzb3JcIiwgdGhpcy5vbkN1cnNvclBvc2l0aW9uQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBpZiAobmV4dFByb3BzLmlzc3Vlcykge1xuICAgICAgICAgICAgdmFyIGFubm90YXRpb25zID0gbmV4dFByb3BzLmlzc3Vlcy5tYXAoaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuZWRpdG9yLnNlc3Npb24uZG9jLmluZGV4VG9Qb3NpdGlvbihpc3N1ZS5wb3NpdGlvbi5zdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcm93OiBwb3NpdGlvbi5yb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zaXRpb24uY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpc3N1ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpc3N1ZS50eXBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgLy90aGlzLmVkaXRvci5leGVjQ29tbWFuZChcImdvVG9OZXh0RXJyb3JcIik7XG5cbiAgICAgICAgICAgIHZhciBSYW5nZSA9IHJlcXVpcmUoJ2FjZS9yYW5nZScpLlJhbmdlO1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU1hcmtlcnMoKTtcblxuICAgICAgICAgICAgdmFyIG1hcmtlcnMgPSBuZXh0UHJvcHMuaXNzdWVzLm1hcChpc3N1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5lZGl0b3Iuc2Vzc2lvbi5kb2MuaW5kZXhUb1Bvc2l0aW9uKGlzc3VlLnBvc2l0aW9uLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLmVkaXRvci5zZXNzaW9uLmRvYy5pbmRleFRvUG9zaXRpb24oaXNzdWUucG9zaXRpb24uZW5kKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IG5ldyBSYW5nZShwb3NpdGlvbi5zdGFydC5yb3csIHBvc2l0aW9uLnN0YXJ0LmNvbHVtbiwgcG9zaXRpb24uZW5kLnJvdywgcG9zaXRpb24uZW5kLmNvbHVtbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaCh0aGlzLmVkaXRvci5zZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgXCJtYXJrZXJfZXJyb3JcIiwgXCJ0ZXh0XCIpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5leGVjQ29tbWFuZChcImdvVG9OZXh0RXJyb3JcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZShuZXh0UHJvcHMudmFsdWUsIC0xKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgcmVmPXsgKGVsZW1lbnQpID0+IHRoaXMuaW5pdChlbGVtZW50KSB9PjwvZGl2PjtcbiAgICB9XG59IiwiY2xhc3MgR3JhcGhMYXlvdXR7XG5cdGFjdGl2ZVdvcmtlcnMgPSB7fVxuXHRjdXJyZW50V29ya2VySWQgPSAwXG5cdGxhc3RGaW5pc2hlZFdvcmtlcklkID0gMFxuXHRjYWxsYmFjayA9IGZ1bmN0aW9uKCl7fVxuXG5cdGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG5cdFx0dGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG5cdH1cblxuXHRsYXlvdXQoZ3JhcGgpIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuZ2V0V29ya2VySWQoKVxuXHRcdHRoaXMuYWN0aXZlV29ya2Vyc1tpZF0gPSBuZXcgTGF5b3V0V29ya2VyKGlkLCBncmFwaCwgdGhpcy53b3JrZXJGaW5pc2hlZC5iaW5kKHRoaXMpKVxuXHR9XG5cblx0d29ya2VyRmluaXNoZWQoe2lkLCBncmFwaH0pIHtcblx0XHRpZiAoaWQgPj0gdGhpcy5sYXN0RmluaXNoZWRXb3JrZXJJZCkge1xuXHRcdFx0dGhpcy5sYXN0RmluaXNoZWRXb3JrZXJJZCA9IGlkXG5cdFx0XHR0aGlzLmNhbGxiYWNrKGdyYXBoKVxuXHRcdH1cblx0fVxuXG5cdGdldFdvcmtlcklkKCkge1xuXHRcdHRoaXMuY3VycmVudFdvcmtlcklkICs9IDFcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50V29ya2VySWRcblx0fVxufVxuXG5jbGFzcyBMYXlvdXRXb3JrZXJ7XG5cdGlkID0gMFxuXHR3b3JrZXIgPSBudWxsXG5cdGNvbnN0cnVjdG9yKGlkLCBncmFwaCwgb25GaW5pc2hlZCkge1xuXHRcdHRoaXMuaWQgPSBpZFxuXHRcdHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihcInNyYy9zY3JpcHRzL0dyYXBoTGF5b3V0V29ya2VyLmpzXCIpXG5cdFx0dGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5yZWNlaXZlLmJpbmQodGhpcykpXG5cdFx0dGhpcy5vbkZpbmlzaGVkID0gb25GaW5pc2hlZFxuXHRcdFxuXHRcdHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHRoaXMuZW5jb2RlKGdyYXBoKSlcblx0fVxuXHRyZWNlaXZlKG1lc3NhZ2UpIHtcblx0XHR0aGlzLndvcmtlci50ZXJtaW5hdGUoKVxuXHRcdHRoaXMub25GaW5pc2hlZCh7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGdyYXBoOiB0aGlzLmRlY29kZShtZXNzYWdlLmRhdGEpXG5cdFx0fSlcblx0fVxuXHRlbmNvZGUoZ3JhcGgpIHtcblx0XHRyZXR1cm4gZ3JhcGhsaWIuanNvbi53cml0ZShncmFwaClcbiAgICB9XG5cbiAgICBkZWNvZGUoanNvbikge1xuXHRcdHJldHVybiBncmFwaGxpYi5qc29uLnJlYWQoanNvbilcbiAgICB9XG59IiwiY29uc3QgaXBjID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLmlwY1JlbmRlcmVyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKVxuXG5jbGFzcyBJREUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnR7XG5cdHBhcnNlciA9IG5ldyBQYXJzZXIoKVxuXHRpbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcigpXG5cdGdlbmVyYXRvciA9IG5ldyBQeVRvcmNoR2VuZXJhdG9yKClcblxuXHRsb2NrID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKHByb3BzKSB7XG5cdFx0c3VwZXIocHJvcHMpO1xuXG5cdFx0dGhpcy5zdGF0ZSA9IHtcblx0XHRcdC8vIHRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGhlcmVcblx0XHRcdC8vIFwiZ3JhbW1hclwiOiB0aGlzLnBhcnNlci5ncmFtbWFyLFxuXHRcdFx0Ly8gXCJzZW1hbnRpY3NcIjogdGhpcy5wYXJzZXIuc2VtYW50aWNzLFxuXHRcdFx0XCJuZXR3b3JrRGVmaW5pdGlvblwiOiBcIlwiLFxuXHRcdFx0XCJhc3RcIjogbnVsbCxcblx0XHRcdFwiaXNzdWVzXCI6IG51bGwsXG5cdFx0XHRcImxheW91dFwiOiBcImNvbHVtbnNcIixcblx0XHRcdFwiZ2VuZXJhdGVkQ29kZVwiOiBcIlwiXG5cdFx0fTtcblxuXHRcdGlwYy5vbignc2F2ZScsIGZ1bmN0aW9uKGV2ZW50LCBtZXNzYWdlKSB7XG5cdFx0XHRmcy53cml0ZUZpbGUobWVzc2FnZS5mb2xkZXIgKyBcIi9zb3VyY2UubW9uXCIsIHRoaXMuc3RhdGUubmV0d29ya0RlZmluaXRpb24sIGZ1bmN0aW9uKGVycikge1xuXHRcdFx0ICBpZiAoZXJyKSB0aHJvdyBlcnJzXG5cdFx0XHR9KTtcblx0XHRcdGZzLndyaXRlRmlsZShtZXNzYWdlLmZvbGRlciArIFwiL3NvdXJjZS5hc3QuanNvblwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRlLmFzdCwgbnVsbCwgMiksIGZ1bmN0aW9uKGVycikge1xuXHRcdFx0ICBpZiAoZXJyKSB0aHJvdyBlcnJzXG5cdFx0XHR9KTtcblx0XHRcdGZzLndyaXRlRmlsZShtZXNzYWdlLmZvbGRlciArIFwiL2dyYXBoLnN2Z1wiLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpLm91dGVySFRNTCwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXHRcdFx0ZnMud3JpdGVGaWxlKG1lc3NhZ2UuZm9sZGVyICsgXCIvZ3JhcGguanNvblwiLCBKU09OLnN0cmluZ2lmeShkYWdyZS5ncmFwaGxpYi5qc29uLndyaXRlKHRoaXMuc3RhdGUuZ3JhcGgpLCBudWxsLCAyKSwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXHRcdFx0ZnMud3JpdGVGaWxlKG1lc3NhZ2UuZm9sZGVyICsgXCIvaGFsZi1hc3NlZF9qb2tlLnB5XCIsIHRoaXMuc3RhdGUuZ2VuZXJhdGVkQ29kZSwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgc2F2ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oJ1NrZXRjaCBzYXZlZCcsIHtcblx0XHRcdFx0Ym9keTogYENsaWNrIHRvIG9wZW4gc2F2ZWQgc2tldGNoLmAsXG5cdFx0XHRcdHNpbGVudDogdHJ1ZSxcblx0XHRcdH0pXG5cdFx0XHRjb25zdCB7IHNoZWxsIH0gPSByZXF1aXJlKCdlbGVjdHJvbicpXG5cdFx0XHRcblx0XHRcdHNhdmVOb3RpZmljYXRpb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0c2hlbGwuc2hvd0l0ZW1JbkZvbGRlcihtZXNzYWdlLmZvbGRlcilcblx0XHRcdH1cblx0XHR9LmJpbmQodGhpcykpO1xuXG5cdFx0aXBjLm9uKFwidG9nZ2xlTGF5b3V0XCIsIChlLCBtKSA9PiB7XG5cdFx0XHR0aGlzLnRvZ2dsZUxheW91dCgpXG5cdFx0fSk7XG5cblx0XHRpcGMub24oXCJvcGVuXCIsIChlLCBtKSA9PiB7XG5cdFx0XHR0aGlzLm9wZW5GaWxlKG0uZmlsZVBhdGgpXG5cdFx0fSlcblxuXHRcdGxldCBsYXlvdXQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYXlvdXRcIilcblx0XHRpZiAobGF5b3V0KSB7XG5cdFx0XHRpZiAobGF5b3V0ID09IFwiY29sdW1uc1wiIHx8IGxheW91dCA9PSBcInJvd3NcIikge1xuXHRcdFx0XHR0aGlzLnN0YXRlLmxheW91dCA9IGxheW91dFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5pbnRlcnByZXRlci5sb2dnZXIuYWRkSXNzdWUoe1xuXHRcdFx0XHRcdHR5cGU6IFwid2FybmluZ1wiLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBWYWx1ZSBmb3IgXCJsYXlvdXRcIiBjYW4gYmUgb25seSBcImNvbHVtbnNcIiBvciBcInJvd3NcIi5gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlTmV0d29ya0RlZmluaXRpb24gPSB0aGlzLnVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5kZWxheWVkVXBkYXRlTmV0d29ya0RlZmluaXRpb24gPSB0aGlzLmRlbGF5ZWRVcGRhdGVOZXR3b3JrRGVmaW5pdGlvbi5iaW5kKHRoaXMpO1xuXHR9XG5cblx0b3BlbkZpbGUoZmlsZVBhdGgpIHtcblx0XHRjb25zb2xlLmxvZyhcIm9wZW5GaWxlXCIsIGZpbGVQYXRoKVxuXHRcdGxldCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGY4XCIpXG5cdFx0dGhpcy5lZGl0b3Iuc2V0VmFsdWUoZmlsZUNvbnRlbnQpIC8vIHRoaXMgaGFzIHRvIGJlIGhlcmUsIEkgZG9uJ3Qga25vdyB3aHlcblx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdG5ldHdvcmtEZWZpbml0aW9uOiBmaWxlQ29udGVudFxuXHRcdH0pXG5cdH1cblxuXHRsb2FkRXhhbXBsZShpZCkge1xuXHRcdGxldCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhgJHtfX2Rpcm5hbWV9L2V4YW1wbGVzLyR7aWR9Lm1vbmAsIFwidXRmOFwiKVxuXHRcdHRoaXMuZWRpdG9yLnNldFZhbHVlKGZpbGVDb250ZW50KSAvLyB0aGlzIGhhcyB0byBiZSBoZXJlLCBJIGRvbid0IGtub3cgd2h5XG5cdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRuZXR3b3JrRGVmaW5pdGlvbjogZmlsZUNvbnRlbnRcblx0XHR9KVxuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy5sb2FkRXhhbXBsZShcIkNvbnZvbHV0aW9uYWxMYXllclwiKVxuXHR9XG5cblx0ZGVsYXllZFVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMubG9jaykgeyBjbGVhclRpbWVvdXQodGhpcy5sb2NrKTsgfVxuXHRcdHRoaXMubG9jayA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKTsgfSwgMTAwKTtcblx0fVxuXG5cdHVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKXtcblx0XHRjb25zb2xlLnRpbWUoXCJ1cGRhdGVOZXR3b3JrRGVmaW5pdGlvblwiKTtcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZXIubWFrZSh2YWx1ZSlcblxuXHRcdGlmIChyZXN1bHQuYXN0KSB7XG5cdFx0XHR0aGlzLmludGVycHJldGVyLmV4ZWN1dGUocmVzdWx0LmFzdClcblx0XHRcdGxldCBncmFwaCA9IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0Q29tcHV0YXRpb25hbEdyYXBoKClcblx0XHRcdGxldCBkZWZpbml0aW9ucyA9IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0TWV0YW5vZGVzRGVmaW5pdGlvbnMoKVxuXHRcdFx0Ly9jb25zb2xlLmxvZyhkZWZpbml0aW9ucylcblxuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdG5ldHdvcmtEZWZpbml0aW9uOiB2YWx1ZSxcblx0XHRcdFx0YXN0OiByZXN1bHQuYXN0LFxuXHRcdFx0XHRncmFwaDogZ3JhcGgsXG5cdFx0XHRcdGdlbmVyYXRlZENvZGU6IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ29kZShncmFwaCwgZGVmaW5pdGlvbnMpLFxuXHRcdFx0XHRpc3N1ZXM6IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0SXNzdWVzKClcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKHJlc3VsdCk7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0bmV0d29ya0RlZmluaXRpb246IHZhbHVlLFxuXHRcdFx0XHRhc3Q6IG51bGwsXG5cdFx0XHRcdGdyYXBoOiBudWxsLFxuXHRcdFx0XHRpc3N1ZXM6IFt7XG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHN0YXJ0OiByZXN1bHQucG9zaXRpb24gLSAxLFxuXHRcdFx0XHRcdFx0ZW5kOiByZXN1bHQucG9zaXRpb25cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwiRXhwZWN0ZWQgXCIgKyByZXN1bHQuZXhwZWN0ZWQgKyBcIi5cIixcblx0XHRcdFx0XHR0eXBlOiBcImVycm9yXCJcblx0XHRcdFx0fV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zb2xlLnRpbWVFbmQoXCJ1cGRhdGVOZXR3b3JrRGVmaW5pdGlvblwiKTtcblx0fVxuXG5cdHRvZ2dsZUxheW91dCgpIHtcblx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdGxheW91dDogKHRoaXMuc3RhdGUubGF5b3V0ID09PSBcImNvbHVtbnNcIikgPyBcInJvd3NcIiA6IFwiY29sdW1uc1wiXG5cdFx0fSlcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2l6ZVwiKSlcblx0XHR9LCAxMDApXG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0bGV0IGNvbnRhaW5lckxheW91dCA9IHRoaXMuc3RhdGUubGF5b3V0XG5cdFx0bGV0IGdyYXBoTGF5b3V0ID0gdGhpcy5zdGF0ZS5sYXlvdXQgPT09IFwiY29sdW1uc1wiID8gXCJCVFwiIDogXCJMUlwiXG5cbiAgICBcdHJldHVybiA8ZGl2IGlkPVwiY29udGFpbmVyXCIgY2xhc3NOYW1lPXtgY29udGFpbmVyICR7Y29udGFpbmVyTGF5b3V0fWB9PlxuICAgIFx0XHQ8UGFuZWwgaWQ9XCJkZWZpbml0aW9uXCI+XG4gICAgXHRcdFx0PEVkaXRvclxuICAgIFx0XHRcdFx0cmVmPXsocmVmKSA9PiB0aGlzLmVkaXRvciA9IHJlZn1cbiAgICBcdFx0XHRcdG1vZGU9XCJtb25pZWxcIlxuICAgIFx0XHRcdFx0dGhlbWU9XCJtb25va2FpXCJcbiAgICBcdFx0XHRcdGlzc3Vlcz17dGhpcy5zdGF0ZS5pc3N1ZXN9XG4gICAgXHRcdFx0XHRvbkNoYW5nZT17dGhpcy5kZWxheWVkVXBkYXRlTmV0d29ya0RlZmluaXRpb259XG4gICAgXHRcdFx0XHRkZWZhdWx0VmFsdWU9e3RoaXMuc3RhdGUubmV0d29ya0RlZmluaXRpb259XG4gICAgXHRcdFx0Lz5cbiAgICBcdFx0PC9QYW5lbD5cbiAgICBcdFx0XG4gICAgXHRcdDxQYW5lbCBpZD1cInZpc3VhbGl6YXRpb25cIj5cbiAgICBcdFx0XHQ8VmlzdWFsR3JhcGggZ3JhcGg9e3RoaXMuc3RhdGUuZ3JhcGh9IGxheW91dD17Z3JhcGhMYXlvdXR9IC8+XG4gICAgXHRcdDwvUGFuZWw+XG5cblx0XHRcdHsvKlxuXHRcdFx0PFBhbmVsIHRpdGxlPVwiR2VuZXJhdGVkIENvZGVcIj5cbiAgICBcdFx0XHQ8RWRpdG9yXG4gICAgXHRcdFx0XHRtb2RlPVwicHl0aG9uXCJcbiAgICBcdFx0XHRcdHRoZW1lPVwibW9ub2thaVwiXG4gICAgXHRcdFx0XHR2YWx1ZT17dGhpcy5zdGF0ZS5nZW5lcmF0ZWRDb2RlfVxuICAgIFx0XHRcdC8+XG4gICAgXHRcdDwvUGFuZWw+XG5cdFx0XHQqL31cblxuICAgIFx0XHR7LypcbiAgICBcdFx0PFBhbmVsIHRpdGxlPVwiQVNUXCI+XG4gICAgXHRcdFx0PEVkaXRvclxuICAgIFx0XHRcdFx0bW9kZT1cImpzb25cIlxuICAgIFx0XHRcdFx0dGhlbWU9XCJtb25va2FpXCJcbiAgICBcdFx0XHRcdHZhbHVlPXtKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRlLmFzdCwgbnVsbCwgMil9XG4gICAgXHRcdFx0Lz5cbiAgICBcdFx0PC9QYW5lbD5cbiAgICBcdCovfVxuICAgIFx0XHRcbiAgICBcdDwvZGl2PjtcbiAgXHR9XG59IiwiLypcblx0VGhpcyBjb2RlIGlzIGEgbWVzcy5cbiovXG5cbmNvbnN0IHBpeGVsV2lkdGggPSByZXF1aXJlKCdzdHJpbmctcGl4ZWwtd2lkdGgnKVxuXG5jbGFzcyBJbnRlcnByZXRlciB7XG5cdC8vIG1heWJlIHNpbmdsZXRvbj9cblx0bG9nZ2VyID0gbmV3IExvZ2dlcigpXG5cdGdyYXBoID0gbmV3IENvbXB1dGF0aW9uYWxHcmFwaCh0aGlzKVxuXG5cdC8vIHRvbyBzb29uLCBzaG91bGQgYmUgaW4gVmlzdWFsR3JhcGhcblx0Y29sb3JIYXNoID0gbmV3IENvbG9ySGFzaFdyYXBwZXIoKVxuXG5cdGRlZmluaXRpb25zID0ge307XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5pbml0aWFsaXplKCk7XG5cdH1cblxuXHRpbml0aWFsaXplKCkge1xuXHRcdHRoaXMuZ3JhcGguaW5pdGlhbGl6ZSgpO1xuXHRcdHRoaXMubG9nZ2VyLmNsZWFyKCk7XG5cblx0XHR0aGlzLmRlZmluaXRpb25zID0gW107XG5cdFx0dGhpcy5hZGREZWZhdWx0RGVmaW5pdGlvbnMoKTtcblx0XHR0aGlzLmRlcHRoID0gMFxuXHR9XG5cblx0YWRkRGVmYXVsdERlZmluaXRpb25zKCkge1xuXHRcdC8vIGNvbnNvbGUuaW5mbyhgQWRkaW5nIGRlZmF1bHQgZGVmaW5pdGlvbnMuYCk7XG5cdFx0Y29uc3QgZGVmYXVsdERlZmluaXRpb25zID0gW1wiQWRkXCIsIFwiTGluZWFyXCIsIFwiSW5wdXRcIiwgXCJPdXRwdXRcIiwgXCJQbGFjZWhvbGRlclwiLCBcIlZhcmlhYmxlXCIsIFwiQ29uc3RhbnRcIiwgXCJNdWx0aXBseVwiLCBcIkNvbnZvbHV0aW9uXCIsIFwiRGVuc2VcIiwgXCJNYXhQb29saW5nXCIsIFwiQmF0Y2hOb3JtYWxpemF0aW9uXCIsIFwiRGVjb252b2x1dGlvblwiLCBcIkF2ZXJhZ2VQb29saW5nXCIsIFwiQWRhcHRpdmVBdmVyYWdlUG9vbGluZ1wiLCBcIkFkYXB0aXZlTWF4UG9vbGluZ1wiLCBcIk1heFVucG9vbGluZ1wiLCBcIkxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXCIsIFwiUGFyYW1ldHJpY1JlY3RpZmllZExpbmVhclVuaXRcIiwgXCJMZWFreVJlY3RpZmllZExpbmVhclVuaXRcIiwgXCJSYW5kb21pemVkUmVjdGlmaWVkTGluZWFyVW5pdFwiLCBcIkxvZ1NpZ21vaWRcIiwgXCJUaHJlc2hvbGRcIiwgXCJIYXJkVGFuaFwiLCBcIlRhbmhTaHJpbmtcIiwgXCJIYXJkU2hyaW5rXCIsIFwiTG9nU29mdE1heFwiLCBcIlNvZnRTaHJpbmtcIiwgXCJTb2Z0TWF4XCIsIFwiU29mdE1pblwiLCBcIlNvZnRQbHVzXCIsIFwiU29mdFNpZ25cIiwgXCJJZGVudGl0eVwiLCBcIlJlY3RpZmllZExpbmVhclVuaXRcIiwgXCJTaWdtb2lkXCIsIFwiRXhwb25lbnRpYWxMaW5lYXJVbml0XCIsIFwiVGFuaFwiLCBcIkFic29sdXRlXCIsIFwiU3VtbWF0aW9uXCIsIFwiRHJvcG91dFwiLCBcIk1hdHJpeE11bHRpcGx5XCIsIFwiQmlhc0FkZFwiLCBcIlJlc2hhcGVcIiwgXCJDb25jYXRcIiwgXCJGbGF0dGVuXCIsIFwiVGVuc29yXCIsIFwiU29mdG1heFwiLCBcIkNyb3NzRW50cm9weVwiLCBcIlplcm9QYWRkaW5nXCIsIFwiUmFuZG9tTm9ybWFsXCIsIFwiVHJ1bmNhdGVkTm9ybWFsRGlzdHJpYnV0aW9uXCIsIFwiRG90UHJvZHVjdFwiXTtcblx0XHRkZWZhdWx0RGVmaW5pdGlvbnMuZm9yRWFjaChkZWZpbml0aW9uID0+IHRoaXMuYWRkRGVmaW5pdGlvbihkZWZpbml0aW9uKSk7XG5cdH1cblxuXHRhZGREZWZpbml0aW9uKGRlZmluaXRpb25OYW1lKSB7XG5cdFx0dGhpcy5kZWZpbml0aW9uc1tkZWZpbml0aW9uTmFtZV0gPSB7XG5cdFx0XHRuYW1lOiBkZWZpbml0aW9uTmFtZSxcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9ySGFzaC5oZXgoZGVmaW5pdGlvbk5hbWUpXG5cdFx0fTtcblx0fVxuXG5cdGV4ZWN1dGUoYXN0KSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB7XG5cdFx0XHRncmFwaDogbmV3IENvbXB1dGF0aW9uYWxHcmFwaCh0aGlzKSxcblx0XHRcdGxvZ2dlcjogbmV3IExvZ2dlcigpXG5cdFx0fVxuXHRcdHRoaXMuaW5pdGlhbGl6ZSgpXG5cdFx0dGhpcy53YWxrQXN0KGFzdCwgc3RhdGUpXG5cdFx0Y29uc29sZS5sb2coXCJGaW5hbCBTdGF0ZTpcIiwgc3RhdGUpXG5cdH1cblxuXHR3YWxrQXN0KHRva2VuLCBzdGF0ZSkge1xuXHRcdGlmICghdG9rZW4pIHsgY29uc29sZS5lcnJvcihcIk5vIHRva2VuPyFcIik7IHJldHVybjsgfVxuXHRcdHRoaXMuZGVwdGggKz0gMVxuXHRcdGNvbnN0IHBhZCA9IEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5kZXB0aH0pLmZpbGwoXCIgXCIpLnJlZHVjZSgocCwgYykgPT4gcCArIGMsIFwiXCIpXG5cdFx0Ly9jb25zb2xlLmxvZyhwYWQgKyB0b2tlbi5raW5kKVxuXG5cdFx0Y29uc3QgZm5OYW1lID0gXCJfXCIgKyB0b2tlbi5raW5kXG5cdFx0Y29uc3QgZm4gPSB0aGlzW2ZuTmFtZV0gfHwgdGhpcy5fdW5yZWNvZ25pemVkXG5cdFx0Y29uc3QgcmV0dXJuVmFsdWUgPSBmbi5jYWxsKHRoaXMsIHRva2VuLCBzdGF0ZSlcblx0XHR0aGlzLmRlcHRoIC09IDFcblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZVxuXHR9XG5cblx0X0dyYXBoKGdyYXBoLCBzdGF0ZSkge1xuXHRcdGdyYXBoLmRlZmluaXRpb25zLmZvckVhY2goZGVmaW5pdGlvbiA9PiB0aGlzLndhbGtBc3QoZGVmaW5pdGlvbiwgc3RhdGUpKTtcblx0fVxuXG5cdF9Ob2RlRGVmaW5pdGlvbihub2RlRGVmaW5pdGlvbiwgc3RhdGUpwqB7XG5cdFx0Ly8gY29uc29sZS5pbmZvKGBBZGRpbmcgXCIke25vZGVEZWZpbml0aW9uLm5hbWV9XCIgdG8gYXZhaWxhYmxlIGRlZmluaXRpb25zLmApO1xuXHRcdHRoaXMuYWRkRGVmaW5pdGlvbihub2RlRGVmaW5pdGlvbi5uYW1lKTtcblx0XHRpZiAobm9kZURlZmluaXRpb24uYm9keSkge1xuXHRcdFx0c3RhdGUuZ3JhcGguZW50ZXJNZXRhbm9kZVNjb3BlKG5vZGVEZWZpbml0aW9uLm5hbWUpXG5cdFx0XHR0aGlzLmdyYXBoLmVudGVyTWV0YW5vZGVTY29wZShub2RlRGVmaW5pdGlvbi5uYW1lKVxuXHRcdFx0dGhpcy53YWxrQXN0KG5vZGVEZWZpbml0aW9uLmJvZHksIHN0YXRlKVxuXHRcdFx0c3RhdGUuZ3JhcGguZXhpdE1ldGFub2RlU2NvcGUoKVxuXHRcdFx0dGhpcy5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cdFx0fVxuXHR9XG5cdFxuXHRfQ2hhaW4oY2hhaW4sIHN0YXRlKSB7XG5cdFx0c3RhdGUuZ3JhcGguY2xlYXJOb2RlU3RhY2soKVxuXHRcdHRoaXMuZ3JhcGguY2xlYXJOb2RlU3RhY2soKVxuXHRcdC8vIGNvbnNvbGUubG9nKGNvbm5lY3Rpb24ubGlzdClcblx0XHRjaGFpbi5ibG9ja3MuZm9yRWFjaChpdGVtID0+IHtcblx0XHRcdHN0YXRlLmdyYXBoLmZyZWV6ZU5vZGVTdGFjaygpXG5cdFx0XHR0aGlzLmdyYXBoLmZyZWV6ZU5vZGVTdGFjaygpXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhpdGVtKVxuXHRcdFx0dGhpcy53YWxrQXN0KGl0ZW0sIHN0YXRlKVxuXHRcdH0pXG5cdH1cblxuXHRfSW5saW5lTWV0YU5vZGUobm9kZSwgc3RhdGUpIHtcblx0XHQvL2NvbnNvbGUubG9nKG5vZGUpXG5cdFx0Y29uc3QgaWRlbnRpZmllciA9IG5vZGUuYWxpYXMgPyBub2RlLmFsaWFzLnZhbHVlIDogdGhpcy5ncmFwaC5nZW5lcmF0ZUluc3RhbmNlSWQoXCJtZXRhbm9kZVwiKVxuXG5cdFx0c3RhdGUuZ3JhcGguZW50ZXJNZXRhbm9kZVNjb3BlKGlkZW50aWZpZXIpXG5cdFx0dGhpcy5ncmFwaC5lbnRlck1ldGFub2RlU2NvcGUoaWRlbnRpZmllcilcblx0XHR0aGlzLndhbGtBc3Qobm9kZS5ib2R5LCBzdGF0ZSlcblx0XHRzdGF0ZS5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cdFx0dGhpcy5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cblx0XHR0aGlzLmdyYXBoLmNyZWF0ZU1ldGFub2RlKGlkZW50aWZpZXIsIHtcblx0XHRcdHVzZXJHZW5lcmF0ZWRJZDogbm9kZS5hbGlhcyA/IG5vZGUuYWxpYXMudmFsdWUgOiB1bmRlZmluZWQsXG5cdFx0XHRpZDogaWRlbnRpZmllcixcblx0XHRcdGNsYXNzOiBpZGVudGlmaWVyLFxuXHRcdFx0aXNBbm9ueW1vdXM6IHRydWUsXG5cdFx0XHRfc291cmNlOiBub2RlLl9zb3VyY2Vcblx0XHR9KVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBpZGVudGlmaWVyLFxuXHRcdFx0Y2xhc3M6IGlkZW50aWZpZXIsXG5cdFx0XHR1c2VyR2VuZXJhdGVkSWQ6IG5vZGUuYWxpYXMgPyBub2RlLmFsaWFzLnZhbHVlIDogdW5kZWZpbmVkLFxuXHRcdFx0X3NvdXJjZTogbm9kZS5fc291cmNlXG5cdFx0fVxuXHR9XG5cblx0X01ldGFOb2RlKG1ldGFub2RlLCBzdGF0ZSkge1xuXHRcdC8vIGNvbnNvbGUubG9nKG1ldGFub2RlKVxuXHRcdG1ldGFub2RlLmRlZmluaXRpb25zLmZvckVhY2goZGVmaW5pdGlvbiA9PiB0aGlzLndhbGtBc3QoZGVmaW5pdGlvbiwgc3RhdGUpKVxuXHR9XG5cblxuXHRfTm9kZShub2RlLCBzdGF0ZSkge1xuXHRcdGNvbnN0IG5vZGVEZWZpbml0aW9uID0gdGhpcy53YWxrQXN0KHtcblx0XHRcdC4uLm5vZGUubm9kZSxcblx0XHRcdGFsaWFzOiBub2RlLmFsaWFzXG5cdFx0fSwgc3RhdGUpXG5cblx0XHQvLyBjb25zb2xlLmxvZyhub2RlRGVmaW5pdGlvbilcblx0fVxuXG5cdC8vIHRoaXMgaXMgZG9pbmcgdG9vIG11Y2gg4oCTIGJyZWFrIGludG8gXCJub3QgcmVjb2duaXplZFwiLCBcInN1Y2Nlc3NcIiBhbmQgXCJhbWJpZ3VvdXNcIlxuXHRfTGl0ZXJhbE5vZGUoaW5zdGFuY2UsIHN0YXRlKSB7XG5cdFx0dmFyIG5vZGUgPSB7XG5cdFx0XHRpZDogdW5kZWZpbmVkLFxuXHRcdFx0Y2xhc3M6IFwiVW5rbm93blwiLFxuXHRcdFx0Y29sb3I6IFwiZGFya2dyZXlcIixcblx0XHRcdGhlaWdodDogMzAsXG5cdFx0XHR3aWR0aDogMTAwLFxuXG5cdFx0XHRfc291cmNlOiBpbnN0YW5jZSxcblx0XHR9O1xuXG5cdFx0bGV0IGRlZmluaXRpb25zID0gdGhpcy5tYXRjaEluc3RhbmNlTmFtZVRvRGVmaW5pdGlvbnMoaW5zdGFuY2UudHlwZS52YWx1ZSlcblx0XHQvLyBjb25zb2xlLmxvZyhgTWF0Y2hlZCBkZWZpbml0aW9uczpgLCBkZWZpbml0aW9ucyk7XG5cblx0XHRpZiAoZGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRub2RlLmNsYXNzID0gaW5zdGFuY2UudHlwZS52YWx1ZTtcblx0XHRcdG5vZGUuaXNVbmRlZmluZWQgPSB0cnVlXG5cblx0XHRcdHRoaXMuYWRkSXNzdWUoe1xuXHRcdFx0XHRtZXNzYWdlOiBgVW5yZWNvZ25pemVkIG5vZGUgdHlwZSBcIiR7aW5zdGFuY2UudHlwZS52YWx1ZX1cIi4gTm8gcG9zc2libGUgbWF0Y2hlcyBmb3VuZC5gLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdHN0YXJ0OiAgaW5zdGFuY2UudHlwZS5fc291cmNlLnN0YXJ0SWR4LFxuXHRcdFx0XHRcdGVuZDogIGluc3RhbmNlLnR5cGUuX3NvdXJjZS5lbmRJZHhcblx0XHRcdFx0fSxcblx0XHRcdFx0dHlwZTogXCJlcnJvclwiXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSBpZiAoZGVmaW5pdGlvbnMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRsZXQgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zWzBdXG5cdFx0XHRpZiAoZGVmaW5pdGlvbikge1xuXHRcdFx0XHRub2RlLmNvbG9yID0gZGVmaW5pdGlvbi5jb2xvclxuXHRcdFx0XHRub2RlLmNsYXNzID0gZGVmaW5pdGlvbi5uYW1lXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vZGUuY2xhc3MgPSBpbnN0YW5jZS50eXBlLnZhbHVlXG5cdFx0XHR0aGlzLmFkZElzc3VlKHtcblx0XHRcdFx0bWVzc2FnZTogYFVucmVjb2duaXplZCBub2RlIHR5cGUgXCIke2luc3RhbmNlLnR5cGUudmFsdWV9XCIuIFBvc3NpYmxlIG1hdGNoZXM6ICR7ZGVmaW5pdGlvbnMubWFwKGRlZiA9PiBgXCIke2RlZi5uYW1lfVwiYCkuam9pbihcIiwgXCIpfS5gLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdHN0YXJ0OiAgaW5zdGFuY2UudHlwZS5fc291cmNlLnN0YXJ0SWR4LFxuXHRcdFx0XHRcdGVuZDogIGluc3RhbmNlLnR5cGUuX3NvdXJjZS5lbmRJZHhcblx0XHRcdFx0fSxcblx0XHRcdFx0dHlwZTogXCJlcnJvclwiXG5cdFx0XHR9KVxuXHRcdH1cblxuXHRcdGlmICghaW5zdGFuY2UuYWxpYXMpIHtcblx0XHRcdG5vZGUuaWQgPSB0aGlzLmdyYXBoLmdlbmVyYXRlSW5zdGFuY2VJZChub2RlLmNsYXNzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9kZS5pZCA9IGluc3RhbmNlLmFsaWFzLnZhbHVlO1xuXHRcdFx0bm9kZS51c2VyR2VuZXJhdGVkSWQgPSBpbnN0YW5jZS5hbGlhcy52YWx1ZTtcblx0XHRcdG5vZGUuaGVpZ2h0ID0gNTA7XG5cdFx0fVxuXG5cdFx0Ly8gaXMgbWV0YW5vZGVcblx0XHRpZiAoT2JqZWN0LmtleXModGhpcy5ncmFwaC5tZXRhbm9kZXMpLmluY2x1ZGVzKG5vZGUuY2xhc3MpKSB7XG5cdFx0XHRsZXQgY29sb3IgPSBkMy5jb2xvcihub2RlLmNvbG9yKVxuXHRcdFx0Y29sb3Iub3BhY2l0eSA9IDAuMVxuXHRcdFx0dGhpcy5ncmFwaC5jcmVhdGVNZXRhbm9kZShub2RlLmlkLCB7XG5cdFx0XHRcdC4uLm5vZGUsXG5cdFx0XHRcdHN0eWxlOiB7XCJmaWxsXCI6IGNvbG9yLnRvU3RyaW5nKCl9XG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4ubm9kZSxcblx0XHRcdFx0c3R5bGU6IHsgXCJmaWxsXCI6IGNvbG9yLnRvU3RyaW5nKCkgfVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHdpZHRoID0gMjAgKyBNYXRoLm1heCguLi5bbm9kZS5jbGFzcywgbm9kZS51c2VyR2VuZXJhdGVkSWQgPyBub2RlLnVzZXJHZW5lcmF0ZWRJZCA6IFwiXCJdLm1hcChzdHJpbmcgPT4gcGl4ZWxXaWR0aChzdHJpbmcsIHtzaXplOiAxNn0pKSlcblxuXHRcdHRoaXMuZ3JhcGguY3JlYXRlTm9kZShub2RlLmlkLCB7XG5cdFx0XHQuLi5ub2RlLFxuXHRcdFx0c3R5bGU6IHtmaWxsOiBub2RlLmNvbG9yfSxcblx0XHRcdHdpZHRoXG5cdFx0fSlcblxuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5ub2RlLFxuXHRcdFx0c3R5bGU6IHtmaWxsOiBub2RlLmNvbG9yfSxcblx0XHRcdHdpZHRoXG5cdFx0fVxuXHR9XG5cblx0X0xpc3QobGlzdCwgc3RhdGUpIHtcblx0XHRsaXN0Lmxpc3QuZm9yRWFjaChpdGVtID0+IHRoaXMud2Fsa0FzdChpdGVtLCBzdGF0ZSkpXG5cdH1cblxuXHRfSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG5cdFx0dGhpcy5ncmFwaC5yZWZlcmVuY2VOb2RlKGlkZW50aWZpZXIudmFsdWUpXG5cdH1cblxuXHRtYXRjaEluc3RhbmNlTmFtZVRvRGVmaW5pdGlvbnMocXVlcnkpIHtcblx0XHR2YXIgZGVmaW5pdGlvbnMgPSBPYmplY3Qua2V5cyh0aGlzLmRlZmluaXRpb25zKVxuXHRcdGxldCBkZWZpbml0aW9uS2V5cyA9IEludGVycHJldGVyLm5hbWVSZXNvbHV0aW9uKHF1ZXJ5LCBkZWZpbml0aW9ucylcblx0XHQvL2NvbnNvbGUubG9nKFwiRm91bmQga2V5c1wiLCBkZWZpbml0aW9uS2V5cylcblx0XHRsZXQgbWF0Y2hlZERlZmluaXRpb25zID0gZGVmaW5pdGlvbktleXMubWFwKGtleSA9PiB0aGlzLmRlZmluaXRpb25zW2tleV0pXG5cdFx0cmV0dXJuIG1hdGNoZWREZWZpbml0aW9uc1xuXHR9XG5cblx0Z2V0Q29tcHV0YXRpb25hbEdyYXBoKCkge1xuXHRcdHJldHVybiB0aGlzLmdyYXBoLmdldEdyYXBoKClcblx0fVxuXG5cdGdldE1ldGFub2Rlc0RlZmluaXRpb25zKCkge1xuXHRcdHJldHVybiB0aGlzLmdyYXBoLmdldE1ldGFub2RlcygpXG5cdH1cblxuXHRnZXRJc3N1ZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMubG9nZ2VyLmdldElzc3VlcygpXG5cdH1cblxuXHRhZGRJc3N1ZShpc3N1ZSkge1xuXHRcdHRoaXMubG9nZ2VyLmFkZElzc3VlKGlzc3VlKVxuXHR9XG5cblx0c3RhdGljIG5hbWVSZXNvbHV0aW9uKHBhcnRpYWwsIGxpc3QpIHtcblx0XHRsZXQgc3BsaXRSZWdleCA9IC8oPz1bMC05QS1aXSkvXG5cdCAgICBsZXQgcGFydGlhbEFycmF5ID0gcGFydGlhbC5zcGxpdChzcGxpdFJlZ2V4KVxuXHQgICAgbGV0IGxpc3RBcnJheSA9IGxpc3QubWFwKGRlZmluaXRpb24gPT4gZGVmaW5pdGlvbi5zcGxpdChzcGxpdFJlZ2V4KSlcblx0ICAgIHZhciByZXN1bHQgPSBsaXN0QXJyYXkuZmlsdGVyKHBvc3NpYmxlTWF0Y2ggPT4gSW50ZXJwcmV0ZXIuaXNNdWx0aVByZWZpeChwYXJ0aWFsQXJyYXksIHBvc3NpYmxlTWF0Y2gpKVxuXHQgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChpdGVtID0+IGl0ZW0uam9pbihcIlwiKSlcblx0ICAgIHJldHVybiByZXN1bHRcblx0fVxuXG5cdHN0YXRpYyBpc011bHRpUHJlZml4KG5hbWUsIHRhcmdldCkge1xuXHQgICAgaWYgKG5hbWUubGVuZ3RoICE9PSB0YXJnZXQubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XG5cdCAgICBsZXQgaSA9IDBcblx0ICAgIHdoaWxlKGkgPCBuYW1lLmxlbmd0aCAmJiB0YXJnZXRbaV0uc3RhcnRzV2l0aChuYW1lW2ldKSkgeyBpICs9IDEgfVxuXHQgICAgcmV0dXJuIChpID09PSBuYW1lLmxlbmd0aCkgLy8gZ290IHRvIHRoZSBlbmQ/XG5cdH1cblxuXHRfdW5yZWNvZ25pemVkKHRva2VuKSB7XG5cdFx0Y29uc29sZS53YXJuKFwiV2hhdCB0byBkbyB3aXRoIHRoaXMgQVNUIHRva2VuP1wiLCB0b2tlbilcblx0fVxufSIsImNsYXNzIExvZ2dlcntcblx0aXNzdWVzID0gW11cblxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmlzc3VlcyA9IFtdO1xuXHR9XG5cdFxuXHRnZXRJc3N1ZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaXNzdWVzO1xuXHR9XG5cblx0YWRkSXNzdWUoaXNzdWUpIHtcblx0XHR2YXIgZiA9IG51bGw7XG5cdFx0c3dpdGNoKGlzc3VlLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJlcnJvclwiOiBmID0gY29uc29sZS5lcnJvcjsgYnJlYWs7XG5cdFx0XHRjYXNlIFwid2FybmluZ1wiOiBmID0gY29uc29sZS53YXJuOyBicmVhaztcblx0XHRcdGNhc2UgXCJpbmZvXCI6IGYgPSBjb25zb2xlLmluZm87IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogZiA9IGNvbnNvbGUubG9nOyBicmVhaztcblx0XHR9XG5cdFx0Zihpc3N1ZS5tZXNzYWdlKTtcblx0XHR0aGlzLmlzc3Vlcy5wdXNoKGlzc3VlKTtcblx0fVxufSIsImNsYXNzIFBhbmVsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50e1xuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIDxkaXYgaWQ9e3RoaXMucHJvcHMuaWR9IGNsYXNzTmFtZT1cInBhbmVsXCI+XG4gICAgXHR7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICA8L2Rpdj47XG4gIH1cbn0iLCJjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKVxuY29uc3Qgb2htID0gcmVxdWlyZShcIm9obS1qc1wiKVxuXG5jbGFzcyBQYXJzZXJ7XG5cdGNvbnRlbnRzID0gbnVsbFxuXHRncmFtbWFyID0gbnVsbFxuXHRcblx0ZXZhbE9wZXJhdGlvbiA9IHtcblx0XHRHcmFwaDogKGRlZmluaXRpb25zKSA9PiAgKHtcblx0XHRcdGtpbmQ6IFwiR3JhcGhcIixcblx0XHRcdGRlZmluaXRpb25zOiBkZWZpbml0aW9ucy5ldmFsKClcblx0XHR9KSxcblx0XHROb2RlRGVmaW5pdGlvbjogZnVuY3Rpb24oXywgbGF5ZXJOYW1lLCBwYXJhbXMsIGJvZHkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiTm9kZURlZmluaXRpb25cIixcblx0XHRcdFx0bmFtZTogbGF5ZXJOYW1lLnNvdXJjZS5jb250ZW50cyxcblx0XHRcdFx0Ym9keTogYm9keS5ldmFsKClbMF1cblx0XHRcdH1cblx0XHR9LFxuXHRcdElubGluZU1ldGFOb2RlOiBmdW5jdGlvbihib2R5KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIklubGluZU1ldGFOb2RlXCIsXG5cdFx0XHRcdGJvZHk6IGJvZHkuZXZhbCgpLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0TWV0YU5vZGU6IGZ1bmN0aW9uKF8sIGRlZnMsIF9fKSB7XG5cdFx0XHR2YXIgZGVmaW5pdGlvbnMgPSBkZWZzLmV2YWwoKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJNZXRhTm9kZVwiLFxuXHRcdFx0XHRkZWZpbml0aW9uczogZGVmaW5pdGlvbnMuZGVmaW5pdGlvbnNcblx0XHRcdH1cblx0XHR9LFxuXHRcdENoYWluOiBmdW5jdGlvbihsaXN0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIkNoYWluXCIsXG5cdFx0XHRcdGJsb2NrczogbGlzdC5ldmFsKClcblx0XHRcdH1cblx0XHR9LFxuXHRcdE5vZGU6IGZ1bmN0aW9uKGlkLCBfLCBub2RlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIk5vZGVcIixcblx0XHRcdFx0bm9kZTogbm9kZS5ldmFsKCksXG5cdFx0XHRcdGFsaWFzOiBpZC5ldmFsKClbMF0sXG5cdFx0XHRcdF9zb3VyY2U6IHRoaXMuc291cmNlXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRMaXRlcmFsTm9kZTogZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIkxpdGVyYWxOb2RlXCIsXG5cdFx0XHRcdHR5cGU6IHR5cGUuZXZhbCgpLFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJhbXMuZXZhbCgpXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKlxuXHRcdEJsb2NrTmFtZTogZnVuY3Rpb24oaWQsIF8pIHtcblx0XHRcdHJldHVybiBpZC5ldmFsKClcblx0XHR9LFxuXHRcdCovXG5cdFx0TGlzdDogZnVuY3Rpb24oXywgbGlzdCwgX18pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiTGlzdFwiLFxuXHRcdFx0XHRsaXN0OiBsaXN0LmV2YWwoKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0QmxvY2tQYXJhbWV0ZXJzOiBmdW5jdGlvbihfLCBsaXN0LCBfXykge1xuXHRcdFx0cmV0dXJuIGxpc3QuZXZhbCgpXG5cdFx0fSxcblx0XHRQYXJhbWV0ZXI6IGZ1bmN0aW9uKG5hbWUsIF8sIHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIlBhcmFtZXRlclwiLFxuXHRcdFx0XHRuYW1lOiBuYW1lLmV2YWwoKSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLmV2YWwoKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0VmFsdWU6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJWYWx1ZVwiLFxuXHRcdFx0XHR2YWx1ZTogdmFsLnNvdXJjZS5jb250ZW50c1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Tm9uZW1wdHlMaXN0T2Y6IGZ1bmN0aW9uKHgsIF8sIHhzKSB7XG5cdFx0XHRyZXR1cm4gW3guZXZhbCgpXS5jb25jYXQoeHMuZXZhbCgpKVxuXHRcdH0sXG5cdFx0RW1wdHlMaXN0T2Y6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFtdXG5cdFx0fSxcblx0XHRwYXRoOiBmdW5jdGlvbihsaXN0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIklkZW50aWZpZXJcIixcblx0XHRcdFx0dmFsdWU6IHRoaXMuc291cmNlLmNvbnRlbnRzLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cGFyYW1ldGVyTmFtZTogZnVuY3Rpb24oYSkge1xuXHRcdFx0cmV0dXJuIGEuc291cmNlLmNvbnRlbnRzXG5cdFx0fSxcblx0XHRub2RlVHlwZTogZnVuY3Rpb24oXywgX18pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiTm9kZVR5cGVcIixcblx0XHRcdFx0dmFsdWU6IHRoaXMuc291cmNlLmNvbnRlbnRzLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aWRlbnRpZmllcjogZnVuY3Rpb24oXywgX18pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiSWRlbnRpZmllclwiLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5zb3VyY2UuY29udGVudHMsXG5cdFx0XHRcdF9zb3VyY2U6IHRoaXMuc291cmNlXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5jb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyBcIi9zcmMvbW9uaWVsLm9obVwiLCBcInV0ZjhcIilcblx0XHR0aGlzLmdyYW1tYXIgPSBvaG0uZ3JhbW1hcih0aGlzLmNvbnRlbnRzKVxuXHRcdHRoaXMuc2VtYW50aWNzID0gdGhpcy5ncmFtbWFyLmNyZWF0ZVNlbWFudGljcygpLmFkZE9wZXJhdGlvbihcImV2YWxcIiwgdGhpcy5ldmFsT3BlcmF0aW9uKVxuXHR9XG5cblx0bWFrZShzb3VyY2UpIHtcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5ncmFtbWFyLm1hdGNoKHNvdXJjZSlcblxuXHRcdGlmIChyZXN1bHQuc3VjY2VlZGVkKCkpIHtcblx0XHRcdHZhciBhc3QgPSB0aGlzLnNlbWFudGljcyhyZXN1bHQpLmV2YWwoKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXN0XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBleHBlY3RlZCA9IHJlc3VsdC5nZXRFeHBlY3RlZFRleHQoKVxuXHRcdFx0dmFyIHBvc2l0aW9uID0gcmVzdWx0LmdldFJpZ2h0bW9zdEZhaWx1cmVQb3NpdGlvbigpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHBlY3RlZCxcblx0XHRcdFx0cG9zaXRpb25cblx0XHRcdH1cblx0XHR9XG5cdH1cblxufSIsImNsYXNzIFB5VG9yY2hHZW5lcmF0b3Ige1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmJ1aWx0aW5zID0gW1wiQXJpdGhtZXRpY0Vycm9yXCIsIFwiQXNzZXJ0aW9uRXJyb3JcIiwgXCJBdHRyaWJ1dGVFcnJvclwiLCBcIkJhc2VFeGNlcHRpb25cIiwgXCJCbG9ja2luZ0lPRXJyb3JcIiwgXCJCcm9rZW5QaXBlRXJyb3JcIiwgXCJCdWZmZXJFcnJvclwiLCBcIkJ5dGVzV2FybmluZ1wiLCBcIkNoaWxkUHJvY2Vzc0Vycm9yXCIsIFwiQ29ubmVjdGlvbkFib3J0ZWRFcnJvclwiLCBcIkNvbm5lY3Rpb25FcnJvclwiLCBcIkNvbm5lY3Rpb25SZWZ1c2VkRXJyb3JcIiwgXCJDb25uZWN0aW9uUmVzZXRFcnJvclwiLCBcIkRlcHJlY2F0aW9uV2FybmluZ1wiLCBcIkVPRkVycm9yXCIsIFwiRWxsaXBzaXNcIiwgXCJFbnZpcm9ubWVudEVycm9yXCIsIFwiRXhjZXB0aW9uXCIsIFwiRmFsc2VcIiwgXCJGaWxlRXhpc3RzRXJyb3JcIiwgXCJGaWxlTm90Rm91bmRFcnJvclwiLCBcIkZsb2F0aW5nUG9pbnRFcnJvclwiLCBcIkZ1dHVyZVdhcm5pbmdcIiwgXCJHZW5lcmF0b3JFeGl0XCIsIFwiSU9FcnJvclwiLCBcIkltcG9ydEVycm9yXCIsIFwiSW1wb3J0V2FybmluZ1wiLCBcIkluZGVudGF0aW9uRXJyb3JcIiwgXCJJbmRleEVycm9yXCIsIFwiSW50ZXJydXB0ZWRFcnJvclwiLCBcIklzQURpcmVjdG9yeUVycm9yXCIsIFwiS2V5RXJyb3JcIiwgXCJLZXlib2FyZEludGVycnVwdFwiLCBcIkxvb2t1cEVycm9yXCIsIFwiTWVtb3J5RXJyb3JcIiwgXCJNb2R1bGVOb3RGb3VuZEVycm9yXCIsIFwiTmFtZUVycm9yXCIsIFwiTm9uZVwiLCBcIk5vdEFEaXJlY3RvcnlFcnJvclwiLCBcIk5vdEltcGxlbWVudGVkXCIsIFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLCBcIk9TRXJyb3JcIiwgXCJPdmVyZmxvd0Vycm9yXCIsIFwiUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ1wiLCBcIlBlcm1pc3Npb25FcnJvclwiLCBcIlByb2Nlc3NMb29rdXBFcnJvclwiLCBcIlJlY3Vyc2lvbkVycm9yXCIsIFwiUmVmZXJlbmNlRXJyb3JcIiwgXCJSZXNvdXJjZVdhcm5pbmdcIiwgXCJSdW50aW1lRXJyb3JcIiwgXCJSdW50aW1lV2FybmluZ1wiLCBcIlN0b3BBc3luY0l0ZXJhdGlvblwiLCBcIlN0b3BJdGVyYXRpb25cIiwgXCJTeW50YXhFcnJvclwiLCBcIlN5bnRheFdhcm5pbmdcIiwgXCJTeXN0ZW1FcnJvclwiLCBcIlN5c3RlbUV4aXRcIiwgXCJUYWJFcnJvclwiLCBcIlRpbWVvdXRFcnJvclwiLCBcIlRydWVcIiwgXCJUeXBlRXJyb3JcIiwgXCJVbmJvdW5kTG9jYWxFcnJvclwiLCBcIlVuaWNvZGVEZWNvZGVFcnJvclwiLCBcIlVuaWNvZGVFbmNvZGVFcnJvclwiLCBcIlVuaWNvZGVFcnJvclwiLCBcIlVuaWNvZGVUcmFuc2xhdGVFcnJvclwiLCBcIlVuaWNvZGVXYXJuaW5nXCIsIFwiVXNlcldhcm5pbmdcIiwgXCJWYWx1ZUVycm9yXCIsIFwiV2FybmluZ1wiLCBcIlplcm9EaXZpc2lvbkVycm9yXCIsIFwiX19idWlsZF9jbGFzc19fXCIsIFwiX19kZWJ1Z19fXCIsIFwiX19kb2NfX1wiLCBcIl9faW1wb3J0X19cIiwgXCJfX2xvYWRlcl9fXCIsIFwiX19uYW1lX19cIiwgXCJfX3BhY2thZ2VfX1wiLCBcIl9fc3BlY19fXCIsIFwiYWJzXCIsIFwiYWxsXCIsIFwiYW55XCIsIFwiYXNjaWlcIiwgXCJiaW5cIiwgXCJib29sXCIsIFwiYnl0ZWFycmF5XCIsIFwiYnl0ZXNcIiwgXCJjYWxsYWJsZVwiLCBcImNoclwiLCBcImNsYXNzbWV0aG9kXCIsIFwiY29tcGlsZVwiLCBcImNvbXBsZXhcIiwgXCJjb3B5cmlnaHRcIiwgXCJjcmVkaXRzXCIsIFwiZGVsYXR0clwiLCBcImRpY3RcIiwgXCJkaXJcIiwgXCJkaXZtb2RcIiwgXCJlbnVtZXJhdGVcIiwgXCJldmFsXCIsIFwiZXhlY1wiLCBcImV4aXRcIiwgXCJmaWx0ZXJcIiwgXCJmbG9hdFwiLCBcImZvcm1hdFwiLCBcImZyb3plbnNldFwiLCBcImdldGF0dHJcIiwgXCJnbG9iYWxzXCIsIFwiaGFzYXR0clwiLCBcImhhc2hcIiwgXCJoZWxwXCIsIFwiaGV4XCIsIFwiaWRcIiwgXCJpbnB1dFwiLCBcImludFwiLCBcImlzaW5zdGFuY2VcIiwgXCJpc3N1YmNsYXNzXCIsIFwiaXRlclwiLCBcImxlblwiLCBcImxpY2Vuc2VcIiwgXCJsaXN0XCIsIFwibG9jYWxzXCIsIFwibWFwXCIsIFwibWF4XCIsIFwibWVtb3J5dmlld1wiLCBcIm1pblwiLCBcIm5leHRcIiwgXCJvYmplY3RcIiwgXCJvY3RcIiwgXCJvcGVuXCIsIFwib3JkXCIsIFwicG93XCIsIFwicHJpbnRcIiwgXCJwcm9wZXJ0eVwiLCBcInF1aXRcIiwgXCJyYW5nZVwiLCBcInJlcHJcIiwgXCJyZXZlcnNlZFwiLCBcInJvdW5kXCIsIFwic2V0XCIsIFwic2V0YXR0clwiLCBcInNsaWNlXCIsIFwic29ydGVkXCIsIFwic3RhdGljbWV0aG9kXCIsIFwic3RyXCIsIFwic3VtXCIsIFwic3VwZXJcIiwgXCJ0dXBsZVwiLCBcInR5cGVcIiwgXCJ2YXJzXCIsIFwiemlwXCJdXG5cdFx0dGhpcy5rZXl3b3JkcyA9IFtcImFuZFwiLCBcImFzXCIsIFwiYXNzZXJ0XCIsIFwiYnJlYWtcIiwgXCJjbGFzc1wiLCBcImNvbnRpbnVlXCIsIFwiZGVmXCIsIFwiZGVsXCIsIFwiZWxpZlwiLCBcImVsc2VcIiwgXCJleGNlcHRcIiwgXCJleGVjXCIsIFwiZmluYWxseVwiLCBcImZvclwiLCBcImZyb21cIiwgXCJnbG9iYWxcIiwgXCJpZlwiLCBcImltcG9ydFwiLCBcImluXCIsIFwiaXNcIiwgXCJsYW1iZGFcIiwgXCJub3RcIiwgXCJvclwiLCBcInBhc3NcIiwgXCJwcmludFwiLCBcInJhaXNlXCIsIFwicmV0dXJuXCIsIFwidHJ5XCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIl1cblx0fVxuXG4gICAgc2FuaXRpemUoaWQpIHtcblx0XHR2YXIgc2FuaXRpemVkSWQgPSBpZFxuXHRcdGlmICh0aGlzLmJ1aWx0aW5zLmluY2x1ZGVzKHNhbml0aXplZElkKSB8fCB0aGlzLmtleXdvcmRzLmluY2x1ZGVzKHNhbml0aXplZElkKSkge1xuXHRcdFx0c2FuaXRpemVkSWQgPSBcIl9cIiArIHNhbml0aXplZElkXG5cdFx0fVxuXHRcdHNhbml0aXplZElkID0gc2FuaXRpemVkSWQucmVwbGFjZSgvXFwuL2csIFwidGhpc1wiKVxuXHRcdHNhbml0aXplZElkID0gc2FuaXRpemVkSWQucmVwbGFjZSgvXFwvL2csIFwiLlwiKVxuXHRcdHJldHVybiBzYW5pdGl6ZWRJZFxuXHR9XG5cblx0bWFwVG9GdW5jdGlvbihub2RlVHlwZSkge1xuXHRcdGxldCB0cmFuc2xhdGlvblRhYmxlID0ge1xuXHRcdFx0XCJDb252b2x1dGlvblwiOiBcIkYuY29udjJkXCIsXG5cdFx0XHRcIkRlY29udm9sdXRpb25cIjogXCJGLmNvbnZfdHJhbnNwb3NlMmRcIixcblx0XHRcdFwiQXZlcmFnZVBvb2xpbmdcIjogXCJGLmF2Z19wb29sMmRcIixcblx0XHRcdFwiQWRhcHRpdmVBdmVyYWdlUG9vbGluZ1wiOiBcIkYuYWRhcHRpdmVfYXZnX3Bvb2wyZFwiLFxuXHRcdFx0XCJNYXhQb29saW5nXCI6IFwiRi5tYXhfcG9vbDJkXCIsXG5cdFx0XHRcIkFkYXB0aXZlTWF4UG9vbGluZ1wiOiBcIkYuYWRhcHRpdmVfbWF4X3Bvb2wyZFwiLFxuXHRcdFx0XCJNYXhVbnBvb2xpbmdcIjogXCJGLm1heF91bnBvb2wyZFwiLFxuXHRcdFx0XCJSZWN0aWZpZWRMaW5lYXJVbml0XCI6IFwiRi5yZWx1XCIsXG5cdFx0XHRcIkV4cG9uZW50aWFsTGluZWFyVW5pdFwiOiBcIkYuZWx1XCIsXG5cdFx0XHRcIlBhcmFtZXRyaWNSZWN0aWZpZWRMaW5lYXJVbml0XCI6IFwiRi5wcmVsdVwiLFxuXHRcdFx0XCJMZWFreVJlY3RpZmllZExpbmVhclVuaXRcIjogXCJGLmxlYWt5X3JlbHVcIixcblx0XHRcdFwiUmFuZG9taXplZFJlY3RpZmllZExpbmVhclVuaXRcIjogXCJGLnJyZWx1XCIsXG5cdFx0XHRcIlNpZ21vaWRcIjogXCJGLnNpZ21vaWRcIixcblx0XHRcdFwiTG9nU2lnbW9pZFwiOiBcIkYubG9nc2lnbW9pZFwiLFxuXHRcdFx0XCJUaHJlc2hvbGRcIjogXCJGLnRocmVzaG9sZFwiLFxuXHRcdFx0XCJIYXJkVGFuaFwiOiBcIkYuaGFyZHRhbmhcIixcblx0XHRcdFwiVGFuaFwiOiBcIkYudGFuaFwiLFxuXHRcdFx0XCJUYW5oU2hyaW5rXCI6IFwiRi50YW5oc2hyaW5rXCIsXG5cdFx0XHRcIkhhcmRTaHJpbmtcIjogXCJGLmhhcmRzaHJpbmtcIixcblx0XHRcdFwiTG9nU29mdE1heFwiOiBcIkYubG9nX3NvZnRtYXhcIixcblx0XHRcdFwiU29mdFNocmlua1wiOiBcIkYuc29mdHNocmlua1wiLFxuXHRcdFx0XCJTb2Z0TWF4XCI6IFwiRi5zb2Z0bWF4XCIsXG5cdFx0XHRcIlNvZnRNaW5cIjogXCJGLnNvZnRtaW5cIixcblx0XHRcdFwiU29mdFBsdXNcIjogXCJGLnNvZnRwbHVzXCIsXG5cdFx0XHRcIlNvZnRTaWduXCI6IFwiRi5zb2Z0c2lnblwiLFxuXHRcdFx0XCJCYXRjaE5vcm1hbGl6YXRpb25cIjogXCJGLmJhdGNoX25vcm1cIixcblx0XHRcdFwiTGluZWFyXCI6IFwiRi5saW5lYXJcIixcblx0XHRcdFwiRHJvcG91dFwiOiBcIkYuZHJvcG91dFwiLFxuXHRcdFx0XCJQYWlyd2lzZURpc3RhbmNlXCI6IFwiRi5wYWlyd2lzZV9kaXN0YW5jZVwiLFxuXHRcdFx0XCJDcm9zc0VudHJvcHlcIjogXCJGLmNyb3NzX2VudHJvcHlcIixcblx0XHRcdFwiQmluYXJ5Q3Jvc3NFbnRyb3B5XCI6IFwiRi5iaW5hcnlfY3Jvc3NfZW50cm9weVwiLFxuXHRcdFx0XCJLdWxsYmFja0xlaWJsZXJEaXZlcmdlbmNlTG9zc1wiOiBcIkYua2xfZGl2XCIsXG5cdFx0XHRcIlBhZFwiOiBcIkYucGFkXCIsXG5cdFx0XHRcIlZhcmlhYmxlXCI6IFwiQUcuVmFyaWFibGVcIixcblx0XHRcdFwiUmFuZG9tTm9ybWFsXCI6IFwiVC5yYW5kblwiLFxuXHRcdFx0XCJUZW5zb3JcIjogXCJULlRlbnNvclwiXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zbGF0aW9uVGFibGUuaGFzT3duUHJvcGVydHkobm9kZVR5cGUpID8gdHJhbnNsYXRpb25UYWJsZVtub2RlVHlwZV0gOiBub2RlVHlwZVxuXG5cdH1cblxuXHRpbmRlbnQoY29kZSwgbGV2ZWwgPSAxLCBpbmRlbnRQZXJMZXZlbCA9IFwiICAgIFwiKSB7XG5cdFx0bGV0IGluZGVudCA9IGluZGVudFBlckxldmVsLnJlcGVhdChsZXZlbClcblx0XHRyZXR1cm4gY29kZS5zcGxpdChcIlxcblwiKS5tYXAobGluZSA9PiBpbmRlbnQgKyBsaW5lKS5qb2luKFwiXFxuXCIpXG5cdH1cblxuXHRnZW5lcmF0ZUNvZGUoZ3JhcGgsIGRlZmluaXRpb25zKSB7XG5cdFx0bGV0IGltcG9ydHMgPVxuYGltcG9ydCB0b3JjaCBhcyBUXG5pbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGXG5pbXBvcnQgdG9yY2guYXV0b2dyYWQgYXMgQUdgXG5cblx0XHRsZXQgbW9kdWxlRGVmaW5pdGlvbnMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykubWFwKGRlZmluaXRpb25OYW1lID0+IHtcblx0XHRcdGlmIChkZWZpbml0aW9uTmFtZSAhPT0gXCJtYWluXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVDb2RlRm9yTW9kdWxlKGRlZmluaXRpb25OYW1lLCBkZWZpbml0aW9uc1tkZWZpbml0aW9uTmFtZV0pXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3JldHVybiBcIlwiXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdGxldCBjb2RlID1cbmAke2ltcG9ydHN9XG5cbiR7bW9kdWxlRGVmaW5pdGlvbnMuam9pbihcIlxcblwiKX1cbmBcblxuXHRcdHJldHVybiBjb2RlXG5cdH1cblxuXHRnZW5lcmF0ZUNvZGVGb3JNb2R1bGUoY2xhc3NuYW1lLCBncmFwaCkge1xuXHRcdGxldCB0b3BvbG9naWNhbE9yZGVyaW5nID0gZ3JhcGhsaWIuYWxnLnRvcHNvcnQoZ3JhcGgpXG5cdFx0bGV0IGZvcndhcmRGdW5jdGlvbiA9IFwiXCJcblxuXHRcdHRvcG9sb2dpY2FsT3JkZXJpbmcubWFwKG5vZGUgPT4ge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJtdVwiLCBub2RlKVxuXHRcdFx0bGV0IG4gPSBncmFwaC5ub2RlKG5vZGUpXG5cdFx0XHRsZXQgY2ggPSBncmFwaC5jaGlsZHJlbihub2RlKVxuXG5cdFx0XHRpZiAoIW4pIHtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhuKVxuXG5cdFx0XHRpZiAoY2gubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGxldCBpbk5vZGVzID0gZ3JhcGguaW5FZGdlcyhub2RlKS5tYXAoZSA9PiB0aGlzLnNhbml0aXplKGUudikpXG5cdFx0XHRcdGZvcndhcmRGdW5jdGlvbiArPSBgJHt0aGlzLnNhbml0aXplKG5vZGUpfSA9ICR7dGhpcy5tYXBUb0Z1bmN0aW9uKG4uY2xhc3MpfSgke2luTm9kZXMuam9pbihcIiwgXCIpfSlcXG5gXG5cdFx0XHR9IFxuXHRcdH0sIHRoaXMpXG5cblx0XHRsZXQgbW9kdWxlQ29kZSA9XG5gY2xhc3MgJHtjbGFzc25hbWV9KFQubm4uTW9kdWxlKTpcbiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW0xLCBwYXJhbTIpOiAjIHBhcmFtZXRlcnMgaGVyZVxuICAgICAgICBzdXBlcigke2NsYXNzbmFtZX0sIHNlbGYpLl9faW5pdF9fKClcbiAgICAgICAgIyBhbGwgZGVjbGFyYXRpb25zIGhlcmVcblxuICAgIGRlZiBmb3J3YXJkKHNlbGYsIGluMSwgaW4yKTogIyBhbGwgSW5wdXRzIGhlcmVcbiAgICAgICAgIyBhbGwgZnVuY3Rpb25hbCBzdHVmZiBoZXJlXG4ke3RoaXMuaW5kZW50KGZvcndhcmRGdW5jdGlvbiwgMil9XG4gICAgICAgIHJldHVybiAob3V0MSwgb3V0MikgIyBhbGwgT3V0cHV0cyBoZXJlXG5gXG5cdFx0cmV0dXJuIG1vZHVsZUNvZGVcblx0fVxufSIsImNsYXNzIFNjb3BlU3RhY2t7XG5cdHNjb3BlU3RhY2sgPSBbXVxuXG5cdGNvbnN0cnVjdG9yKHNjb3BlID0gW10pIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShzY29wZSkpIHtcblx0XHRcdHRoaXMuc2NvcGVTdGFjayA9IHNjb3BlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvZiBzY29wZSBzdGFjay5cIiwgc2NvcGUpO1xuXHRcdH1cblx0fVxuXG5cdGluaXRpYWxpemUoKSB7XG5cdFx0dGhpcy5jbGVhcigpO1xuXHR9XG5cblx0cHVzaChzY29wZSkge1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wdXNoKHNjb3BlKTtcblx0fVxuXG5cdHBvcCgpIHtcblx0XHRyZXR1cm4gdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuXHR9XG5cblx0Y2xlYXIoKSB7XG5cdFx0dGhpcy5zY29wZVN0YWNrID0gW107XG5cdH1cblxuXHRjdXJyZW50U2NvcGVJZGVudGlmaWVyKCkge1xuXHRcdHJldHVybiB0aGlzLnNjb3BlU3RhY2suam9pbihcIi9cIik7XG5cdH1cblxuXHRwcmV2aW91c1Njb3BlSWRlbnRpZmllcigpIHtcblx0XHRsZXQgY29weSA9IEFycmF5LmZyb20odGhpcy5zY29wZVN0YWNrKTtcblx0XHRjb3B5LnBvcCgpO1xuXHRcdHJldHVybiBjb3B5LmpvaW4oXCIvXCIpO1xuXHR9XG59IiwiY29uc3Qgem9vbSA9IHJlcXVpcmUoXCJkMy16b29tXCIpXG5cbmNsYXNzIFZpc3VhbEdyYXBoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50e1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuXG4gICAgICAgIHRoaXMuZ3JhcGhMYXlvdXQgPSBuZXcgR3JhcGhMYXlvdXQodGhpcy5zYXZlR3JhcGguYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBncmFwaDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdmcgPSBudWxsXG4gICAgICAgIHRoaXMuZ3JvdXAgPSBudWxsXG5cbiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IG51bGxcbiAgICB9XG5cbiAgICBzYXZlR3JhcGgoZ3JhcGgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGdyYXBoIH0pXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgaWYgKG5leHRQcm9wcy5ncmFwaCkge1xuICAgICAgICAgICAgbmV4dFByb3BzLmdyYXBoLl9sYWJlbC5yYW5rZGlyID0gbmV4dFByb3BzLmxheW91dFxuICAgICAgICAgICAgdGhpcy5ncmFwaExheW91dC5sYXlvdXQobmV4dFByb3BzLmdyYXBoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSAhPT0gbmV4dFN0YXRlKVxuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gbm9kZS5pZFxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWROb2RlIH0pXG5cbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnN0YXRlLmdyYXBoLmdyYXBoKClcblxuICAgICAgICBjb25zdCBpZGVhbFNpemUgPSAod2lkdGgsIGhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IHdpZHRoIC8gbWF4V2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodFJhdGlvID0gaGVpZ2h0IC8gbWF4SGVpZ2h0XG4gICAgICAgICAgICBjb25zdCBpZGVhbFNpemUgPSAod2lkdGhSYXRpbyA8IGhlaWdodFJhdGlvID8gd2lkdGggOiBoZWlnaHQpXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgWyR7d2lkdGh9LCAke2hlaWdodH1dLCBbJHttYXhXaWR0aH0sICR7bWF4SGVpZ2h0fV0sICR7d2lkdGhSYXRpb30sICR7aGVpZ2h0UmF0aW99LCBpZGVhbCA9ICR7aWRlYWxTaXplfWApXG4gICAgICAgICAgICByZXR1cm4gaWRlYWxTaXplXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Wm9vbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IFsgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBpZGVhbFNpemUod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCldXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gW25vZGUueCwgbm9kZS55LCBpZGVhbFNpemUobm9kZS53aWR0aCwgbm9kZS5oZWlnaHQsIHdpZHRoLCBoZWlnaHQpXVxuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbih0aGlzLmN1cnJlbnRab29tLCB0YXJnZXQsIG5vZGUpXG5cbiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IHRhcmdldFxuICAgIH1cblxuICAgIHRyYW5zaXRpb24oc3RhcnQsIGVuZCwgbm9kZSkge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuc3RhdGUuZ3JhcGguZ3JhcGgoKVxuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHtcbiAgICAgICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgICAgIHk6IGhlaWdodCAvIDJcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpID0gZDMuaW50ZXJwb2xhdGVab29tKHN0YXJ0LCBlbmQpXG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gKFt4LCB5LCBzaXplXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSB3aWR0aCAvIHNpemVcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSBjZW50ZXIueCAtIHggKiBzY2FsZVxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlWSA9IGNlbnRlci55IC0geSAqIHNjYWxlXG4gICAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9LCR7dHJhbnNsYXRlWX0pc2NhbGUoJHtzY2FsZX0pYFxuICAgICAgICB9XG5cbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuZ3JvdXApXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0oc3RhcnQpKVxuICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbihpLmR1cmF0aW9uKVxuICAgICAgICAgICAgLmF0dHJUd2VlbihcInRyYW5zZm9ybVwiLCAoKSA9PiAoICh0KSA9PiB0cmFuc2Zvcm0oaSh0KSkgKSlcbiAgICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmdyYXBoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN0YXRlLmdyYXBoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLnN0YXRlLmdyYXBoXG5cbiAgICAgICAgY29uc3Qgbm9kZXMgPSBnLm5vZGVzKCkubWFwKG5vZGVOYW1lID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBnLm5vZGUobm9kZU5hbWUpXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBrZXk6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgIG5vZGU6IG4sXG4gICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljay5iaW5kKHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFR5cGUgPSBub2RlRGlzcGF0Y2gobilcblxuICAgICAgICAgICAgcmV0dXJuIDxUeXBlIHsuLi5wcm9wc30gLz5cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBlZGdlcyA9IGcuZWRnZXMoKS5tYXAoZWRnZU5hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IGcuZWRnZShlZGdlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gPEVkZ2Uga2V5PXtgJHtlZGdlTmFtZS52fS0+JHtlZGdlTmFtZS53fWB9IGVkZ2U9e2V9Lz5cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGcuZ3JhcGgoKVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c3ZnIHJlZj17IGVsID0+IHsgdGhpcy5zdmcgPSBlbCB9IH0gaWQ9XCJ2aXN1YWxpemF0aW9uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZlcnNpb249XCIxLjFcIiB2aWV3Qm94PXtgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWB9PlxuICAgICAgICAgICAgICAgIDxzdHlsZT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArIFwiL3NyYy9idW5kbGUuY3NzXCIsIFwidXRmLThcIiwgKGVycikgPT4ge2NvbnNvbGUubG9nKGVycil9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPEFycm93IC8+XG4gICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgIDxnIGlkPVwiZ3JhcGhcIiByZWY9e2VsID0+IHsgdGhpcy5ncm91cCA9IGVsIH19PlxuICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIm5vZGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7bm9kZXN9XG4gICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9XCJlZGdlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2VkZ2VzfVxuICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBBcnJvdyA9ICgpID0+IChcbiAgICA8bWFya2VyIGlkPVwiYXJyb3dcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgcmVmWD1cIjEwXCIgcmVmWT1cIjVcIiBtYXJrZXJVbml0cz1cInN0cm9rZVdpZHRoXCIgbWFya2VyV2lkdGg9XCIxMFwiIG1hcmtlckhlaWdodD1cIjcuNVwiIG9yaWVudD1cImF1dG9cIj5cbiAgICAgICAgPHBhdGggZD1cIk0gMCAwIEwgMTAgNSBMIDAgMTAgTCAzIDUgelwiIGNsYXNzTmFtZT1cImFycm93XCIgLz5cbiAgICA8L21hcmtlcj5cbilcblxuY2xhc3MgRWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudHtcbiAgICBsaW5lID0gZDMubGluZSgpXG4gICAgICAgIC5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKVxuICAgICAgICAueChkID0+IGQueClcbiAgICAgICAgLnkoZCA9PiBkLnkpXG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwcmV2aW91c1BvaW50czogW11cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcHJldmlvdXNQb2ludHM6IHRoaXMucHJvcHMuZWRnZS5wb2ludHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW91bnQoZG9tTm9kZSkge1xuICAgICAgICBpZiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgZG9tTm9kZS5iZWdpbkVsZW1lbnQoKSAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnByb3BzLmVkZ2U7XG4gICAgICAgIGxldCBsID0gdGhpcy5saW5lO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGcgY2xhc3NOYW1lPVwiZWRnZVwiIG1hcmtlckVuZD1cInVybCgjYXJyb3cpXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD17bChlLnBvaW50cyl9PlxuICAgICAgICAgICAgICAgICAgICA8YW5pbWF0ZSByZWY9e3RoaXMubW91bnR9IGtleT17TWF0aC5yYW5kb20oKX0gcmVzdGFydD1cImFsd2F5c1wiIGZyb209e2wodGhpcy5zdGF0ZS5wcmV2aW91c1BvaW50cyl9IHRvPXtsKGUucG9pbnRzKX0gYmVnaW49XCIwc1wiIGR1cj1cIjAuMjVzXCIgZmlsbD1cImZyZWV6ZVwiIHJlcGVhdENvdW50PVwiMVwiIGF0dHJpYnV0ZU5hbWU9XCJkXCIgLz5cbiAgICAgICAgICAgICAgICA8L3BhdGg+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBub2RlRGlzcGF0Y2ggPSAobikgPT4ge1xuICAgIGxldCBUeXBlID0gbnVsbFxuICAgIGlmIChuLmlzTWV0YW5vZGUgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKG4uaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgIFR5cGUgPSBBbm9ueW1vdXNNZXRhbm9kZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVHlwZSA9IE1ldGFub2RlXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobi51c2VyR2VuZXJhdGVkSWQpIHtcbiAgICAgICAgICAgIFR5cGUgPSBJZGVudGlmaWVkTm9kZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVHlwZSA9IEFub255bW91c05vZGVcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVHlwZVxufVxuXG5jbGFzcyBOb2RlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnByb3BzLm5vZGVcbiAgICAgICAgY29uc3QgdHlwZSA9IG4uaXNNZXRhbm9kZSA/IFwibWV0YW5vZGVcIiA6IFwibm9kZVwiXG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9IE1hdGguZmxvb3Iobi54IC0obi53aWR0aCAvIDIpKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGVZID0gTWF0aC5mbG9vcihuLnkgLShuLmhlaWdodCAvIDIpKVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Z1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7dHlwZX0gJHtuLmNsYXNzfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrLmJpbmQodGhpcywgdGhpcy5wcm9wcy5ub2RlKX1cbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfSwke3RyYW5zbGF0ZVl9KWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9e24ud2lkdGh9IGhlaWdodD17bi5oZWlnaHR9IHJ4PVwiMTVweFwiIHJ5PVwiMTVweFwiIHN0eWxlPXtuLnN0eWxlfSAvPlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgPC9nPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuY2xhc3MgTWV0YW5vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnByb3BzLm5vZGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxOb2RlIHsuLi50aGlzLnByb3BzfT5cbiAgICAgICAgICAgICAgICA8dGV4dCB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoMTAsMClgfSB0ZXh0QW5jaG9yPVwic3RhcnRcIiBzdHlsZT17e2RvbWluYW50QmFzZWxpbmU6IFwiaWRlb2dyYXBoaWNcIn19PlxuICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD1cIjBcIiBjbGFzc05hbWU9XCJpZFwiPntuLnVzZXJHZW5lcmF0ZWRJZH08L3RzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD1cIjBcIiBkeT1cIjEuMmVtXCI+e24uY2xhc3N9PC90c3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICA8L05vZGU+XG4gICAgICAgIClcbiAgICB9XG59XG5cbmNsYXNzIEFub255bW91c01ldGFub2RlIGV4dGVuZHMgTm9kZSB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wcm9wcy5ub2RlXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Tm9kZSB7Li4udGhpcy5wcm9wc30+XG4gICAgICAgICAgICAgICAgPHRleHQgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKDEwLDApYH0gdGV4dEFuY2hvcj1cInN0YXJ0XCIgc3R5bGU9e3tkb21pbmFudEJhc2VsaW5lOiBcImlkZW9ncmFwaGljXCJ9fT5cbiAgICAgICAgICAgICAgICAgICAgPHRzcGFuIHg9XCIwXCIgY2xhc3NOYW1lPVwiaWRcIj57bi51c2VyR2VuZXJhdGVkSWR9PC90c3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICA8L05vZGU+XG4gICAgICAgIClcbiAgICB9XG59XG5cbmNsYXNzIEFub255bW91c05vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnByb3BzLm5vZGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxOb2RlIHsuLi50aGlzLnByb3BzfT5cbiAgICAgICAgICAgICAgICA8dGV4dCB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHsobi53aWR0aC8yKSB9LCR7KG4uaGVpZ2h0LzIpfSlgfSB0ZXh0QW5jaG9yPVwibWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0c3Bhbj57bi5jbGFzc308L3RzcGFuPlxuICAgICAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICAgIDwvTm9kZT5cbiAgICAgICAgKVxuICAgIH1cbn1cblxuY2xhc3MgSWRlbnRpZmllZE5vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnByb3BzLm5vZGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxOb2RlIHsuLi50aGlzLnByb3BzfT5cbiAgICAgICAgICAgICAgICA8dGV4dCB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHsobi53aWR0aC8yKSB9LCR7KG4uaGVpZ2h0LzIpfSlgfSB0ZXh0QW5jaG9yPVwibWlkZGxlXCIgc3R5bGU9e3tkb21pbmFudEJhc2VsaW5lOiBcImlkZW9ncmFwaGljXCJ9fT5cbiAgICAgICAgICAgICAgICAgICAgPHRzcGFuIHg9XCIwXCIgY2xhc3NOYW1lPVwiaWRcIj57bi51c2VyR2VuZXJhdGVkSWR9PC90c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHRzcGFuIHg9XCIwXCIgZHk9XCIxLjJlbVwiPntuLmNsYXNzfTwvdHNwYW4+XG4gICAgICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgICAgPC9Ob2RlPlxuICAgICAgICApXG4gICAgfVxufSIsImZ1bmN0aW9uIHJ1bigpIHtcbiAgUmVhY3RET00ucmVuZGVyKDxJREUvPiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vbmllbCcpKTtcbn1cblxuY29uc3QgbG9hZGVkU3RhdGVzID0gWydjb21wbGV0ZScsICdsb2FkZWQnLCAnaW50ZXJhY3RpdmUnXTtcblxuaWYgKGxvYWRlZFN0YXRlcy5pbmNsdWRlcyhkb2N1bWVudC5yZWFkeVN0YXRlKSAmJiBkb2N1bWVudC5ib2R5KSB7XG4gIHJ1bigpO1xufSBlbHNlIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBydW4sIGZhbHNlKTtcbn0iXX0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjcmlwdHMvQ29sb3JIYXNoLmpzIiwic2NyaXB0cy9Db21wdXRhdGlvbmFsR3JhcGguanMiLCJzY3JpcHRzL0VkaXRvci5qc3giLCJzY3JpcHRzL0dyYXBoTGF5b3V0LmpzeCIsInNjcmlwdHMvSURFLmpzeCIsInNjcmlwdHMvSW50ZXJwcmV0ZXIuanMiLCJzY3JpcHRzL0xvZ2dlci5qcyIsInNjcmlwdHMvUGFuZWwuanN4Iiwic2NyaXB0cy9QYXJzZXIuanMiLCJzY3JpcHRzL1B5VG9yY2hHZW5lcmF0b3IuanMiLCJzY3JpcHRzL1Njb3BlU3RhY2suanMiLCJzY3JpcHRzL1Zpc3VhbEdyYXBoLmpzeCIsInNjcmlwdHMvYXBwLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBTSxnQjs7OzthQUNGLFMsR0FBWSxJQUFJLFNBQUosQ0FBYztBQUN0Qix3QkFBWSxDQUFDLEdBQUQsQ0FEVTtBQUV0Qix1QkFBVyxDQUFDLElBQUQsQ0FGVztBQUd0QixrQkFBTSxLQUFLO0FBSFcsU0FBZCxDO2FBTVosUyxHQUFZLElBQUksU0FBSixDQUFjO0FBQ3RCLHdCQUFZLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLENBRFU7QUFFdEIsdUJBQVcsQ0FBQyxJQUFEO0FBRlcsU0FBZCxDOzs7OztpQ0FLSCxHLEVBQUs7QUFDVixnQkFBSSxPQUFPLENBQVg7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsd0JBQVEsSUFBSSxVQUFKLENBQWUsQ0FBZixDQUFSO0FBQ0g7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7Ozs4QkFFSyxHLEVBQUs7QUFDUCxnQkFBSSxPQUFPLENBQVg7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsdUJBQU8sT0FBTyxFQUFQLEdBQVksSUFBSSxVQUFKLENBQWUsQ0FBZixJQUFvQixFQUF2QztBQUNIO0FBQ0QsbUJBQU8sSUFBUDtBQUNIOzs7NEJBRUcsRyxFQUFLO0FBQ0wsbUJBQU8sS0FBSyxTQUFMLENBQWUsR0FBZixDQUFtQixHQUFuQixDQUFQO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztJQzlCQyxrQjs7O3NCQVVPO0FBQ1gsT0FBSSxZQUFZLEtBQUssYUFBTCxDQUFtQixLQUFLLGFBQUwsQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBL0MsQ0FBaEI7QUFDQSxVQUFPLEtBQUssU0FBTCxDQUFlLFNBQWYsQ0FBUDtBQUNBOzs7c0JBRWU7QUFDZixPQUFJLFlBQVksS0FBSyxhQUFMLENBQW1CLEtBQUssYUFBTCxDQUFtQixNQUFuQixHQUE0QixDQUEvQyxDQUFoQjtBQUNBLFVBQU8sS0FBSyxVQUFMLENBQWdCLFNBQWhCLENBQVA7QUFDQSxHO29CQUVhLEssRUFBTztBQUNwQixPQUFJLFlBQVksS0FBSyxhQUFMLENBQW1CLEtBQUssYUFBTCxDQUFtQixNQUFuQixHQUE0QixDQUEvQyxDQUFoQjtBQUNBLFFBQUssVUFBTCxDQUFnQixTQUFoQixJQUE2QixLQUE3QjtBQUNBOzs7c0JBRXVCO0FBQ3ZCLE9BQUksWUFBWSxLQUFLLGFBQUwsQ0FBbUIsS0FBSyxhQUFMLENBQW1CLE1BQW5CLEdBQTRCLENBQS9DLENBQWhCO0FBQ0EsVUFBTyxLQUFLLGtCQUFMLENBQXdCLFNBQXhCLENBQVA7QUFDQSxHO29CQUVxQixLLEVBQU87QUFDNUIsT0FBSSxZQUFZLEtBQUssYUFBTCxDQUFtQixLQUFLLGFBQUwsQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBL0MsQ0FBaEI7QUFDQSxRQUFLLGtCQUFMLENBQXdCLFNBQXhCLElBQXFDLEtBQXJDO0FBQ0E7OztBQUVELDZCQUFZLE1BQVosRUFBb0I7QUFBQTs7QUFBQSxPQWxDcEIsV0FrQ29CLEdBbENOLEVBa0NNO0FBQUEsT0FqQ3BCLFVBaUNvQixHQWpDUCxFQWlDTztBQUFBLE9BaENwQixrQkFnQ29CLEdBaENDLEVBZ0NEO0FBQUEsT0E5QnBCLFVBOEJvQixHQTlCUCxJQUFJLFVBQUosRUE4Qk87QUFBQSxPQTVCcEIsU0E0Qm9CLEdBNUJSLEVBNEJRO0FBQUEsT0EzQnBCLGFBMkJvQixHQTNCSixFQTJCSTs7QUFDbkIsT0FBSyxVQUFMO0FBQ0EsT0FBSyxNQUFMLEdBQWMsTUFBZDtBQUNBOzs7OytCQUVZO0FBQ1osUUFBSyxXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsUUFBSyxVQUFMLENBQWdCLFVBQWhCO0FBQ0EsUUFBSyxjQUFMOztBQUVBLFFBQUssU0FBTCxHQUFpQixFQUFqQjtBQUNBLFFBQUssaUJBQUwsR0FBeUIsRUFBekI7O0FBRUEsUUFBSyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0EsUUFBSyxhQUFMLEdBQXFCLEVBQXJCOztBQUVBO0FBQ0E7O0FBRU0sUUFBSyxPQUFMO0FBQ047OztxQ0FFa0IsSSxFQUFNO0FBQ3hCLFFBQUssU0FBTCxDQUFlLElBQWYsSUFBdUIsSUFBSSxTQUFTLEtBQWIsQ0FBbUI7QUFDekMsY0FBVTtBQUQrQixJQUFuQixDQUF2QjtBQUdBLFFBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsUUFBckIsQ0FBOEI7QUFDN0IsVUFBTSxJQUR1QjtBQUV2QixhQUFTLElBRmM7QUFHdkIsYUFBUyxFQUhjO0FBSXZCLGFBQVMsRUFKYztBQUt2QixhQUFTLEVBTGM7QUFNdkIsYUFBUyxFQU5jO0FBT3ZCLGFBQVM7QUFQYyxJQUE5QjtBQVNBLFFBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixJQUF4QjtBQUNBOztBQUVBLFVBQU8sS0FBSyxTQUFMLENBQWUsSUFBZixDQUFQO0FBQ0E7OztzQ0FFbUI7QUFDbkIsVUFBTyxLQUFLLGFBQUwsQ0FBbUIsR0FBbkIsRUFBUDtBQUNBOzs7cUNBRWtCLEksRUFBTTtBQUN4QixPQUFJLENBQUMsS0FBSyxXQUFMLENBQWlCLGNBQWpCLENBQWdDLElBQWhDLENBQUwsRUFBNEM7QUFDM0MsU0FBSyxXQUFMLENBQWlCLElBQWpCLElBQXlCLENBQXpCO0FBQ0E7QUFDRCxRQUFLLFdBQUwsQ0FBaUIsSUFBakIsS0FBMEIsQ0FBMUI7QUFDQSxPQUFJLEtBQUssT0FBTyxJQUFQLEdBQWMsS0FBSyxXQUFMLENBQWlCLElBQWpCLENBQXZCO0FBQ0EsVUFBTyxFQUFQO0FBQ0E7Ozs0QkFFUztBQUNULFFBQUssa0JBQUwsQ0FBd0IsTUFBeEI7QUFDQSxRQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsR0FBckI7QUFDQSxPQUFJLEtBQUssS0FBSyxVQUFMLENBQWdCLHNCQUFoQixFQUFUOztBQUVBLFFBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsRUFBbkIsRUFBdUI7QUFDdEIsV0FBTztBQURlLElBQXZCO0FBR0E7Ozs0QkFFUyxRLEVBQVU7QUFDbkI7QUFDQSxPQUFJLEtBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsUUFBbkIsQ0FBSixFQUFrQztBQUNqQyxTQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLFFBQXBCOztBQUVBLFFBQUksS0FBSyxpQkFBTCxDQUF1QixNQUF2QixLQUFrQyxDQUF0QyxFQUF5QztBQUN4QyxVQUFLLE9BQUwsQ0FBYSxLQUFLLGlCQUFMLENBQXVCLENBQXZCLENBQWIsRUFBd0MsUUFBeEM7QUFDQSxLQUZELE1BRU8sSUFBSSxLQUFLLGlCQUFMLENBQXVCLE1BQXZCLEdBQWdDLENBQXBDLEVBQXVDO0FBQzdDLFVBQUssT0FBTCxDQUFhLEtBQUssaUJBQWxCLEVBQXFDLFFBQXJDO0FBQ0E7QUFDRCxJQVJELE1BUU87QUFDTixZQUFRLElBQVIsMENBQW1ELFFBQW5EO0FBQ0E7QUFDRDs7O2dDQUVhLEUsRUFBSTtBQUNqQixRQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsRUFBckI7QUFDQSxPQUFJLFdBQVcsS0FBSyxVQUFMLENBQWdCLHNCQUFoQixFQUFmO0FBQ0EsT0FBSSxRQUFRLEtBQUssVUFBTCxDQUFnQix1QkFBaEIsRUFBWjs7QUFFQSxPQUFJLE9BQU87QUFDVixxQkFBaUIsRUFEUDtBQUVWLFdBQU8sV0FGRztBQUdWLFlBQVE7QUFIRSxJQUFYOztBQU1BLE9BQUksQ0FBQyxLQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLFFBQW5CLENBQUwsRUFBbUM7QUFDbEMsU0FBSyxLQUFMLENBQVcsT0FBWCxDQUFtQixRQUFuQixlQUNJLElBREo7QUFFQyxZQUFPLEtBQUssR0FBTCxDQUFTLEtBQUssS0FBTCxDQUFXLE1BQXBCLEVBQTRCLEtBQUssZUFBTCxHQUF1QixLQUFLLGVBQUwsQ0FBcUIsTUFBNUMsR0FBcUQsQ0FBakYsSUFBc0Y7QUFGOUY7QUFJQSxTQUFLLFNBQUwsQ0FBZSxRQUFmLEVBQXlCLEtBQXpCO0FBQ0E7O0FBRUQsUUFBSyxTQUFMLENBQWUsUUFBZjtBQUNBLFFBQUssVUFBTCxDQUFnQixHQUFoQjtBQUNBOzs7NkJBRVUsRSxFQUFJLEksRUFBTTtBQUNwQixRQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsRUFBckI7QUFDQSxPQUFJLFdBQVcsS0FBSyxVQUFMLENBQWdCLHNCQUFoQixFQUFmO0FBQ0EsT0FBSSxRQUFRLEtBQUssVUFBTCxDQUFnQix1QkFBaEIsRUFBWjs7QUFFQSxPQUFJLEtBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsUUFBbkIsQ0FBSixFQUFrQztBQUNqQyxZQUFRLElBQVIsd0JBQWlDLEVBQWpDO0FBQ0E7O0FBRUQsUUFBSyxLQUFMLENBQVcsT0FBWCxDQUFtQixRQUFuQixlQUNJLElBREo7QUFFQyxRQUFJO0FBRkw7QUFJQSxRQUFLLFNBQUwsQ0FBZSxRQUFmLEVBQXlCLEtBQXpCOztBQUVBLFFBQUssU0FBTCxDQUFlLFFBQWY7QUFDQSxRQUFLLFVBQUwsQ0FBZ0IsR0FBaEI7O0FBRUEsVUFBTyxRQUFQO0FBQ0E7OztpQ0FFYyxVLEVBQVksSSxFQUFNO0FBQUE7O0FBQ2hDLE9BQU0sZ0JBQWdCLEtBQUssS0FBM0I7QUFDQSxRQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsVUFBckI7QUFDQSxPQUFJLFdBQVcsS0FBSyxVQUFMLENBQWdCLHNCQUFoQixFQUFmO0FBQ0EsT0FBSSxRQUFRLEtBQUssVUFBTCxDQUFnQix1QkFBaEIsRUFBWjs7QUFFQSxRQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLFFBQW5CLGVBQ0ksSUFESjtBQUVDLFFBQUksUUFGTDtBQUdDLGdCQUFZO0FBSGI7O0FBTUEsUUFBSyxLQUFMLENBQVcsU0FBWCxDQUFxQixRQUFyQixFQUErQixLQUEvQjs7QUFFQSxPQUFJLGlCQUFpQixLQUFLLFNBQUwsQ0FBZSxhQUFmLENBQXJCO0FBQ0Esa0JBQWUsS0FBZixHQUF1QixPQUF2QixDQUErQixrQkFBVTtBQUN4QyxRQUFJLE9BQU8sZUFBZSxJQUFmLENBQW9CLE1BQXBCLENBQVg7QUFDQSxRQUFJLENBQUMsSUFBTCxFQUFXO0FBQUU7QUFBUTtBQUNyQixRQUFJLFlBQVksT0FBTyxPQUFQLENBQWUsR0FBZixFQUFvQixRQUFwQixDQUFoQjtBQUNBLFFBQUksdUJBQ0EsSUFEQTtBQUVILFNBQUk7QUFGRCxNQUFKO0FBSUEsVUFBSyxLQUFMLENBQVcsT0FBWCxDQUFtQixTQUFuQixFQUE4QixPQUE5Qjs7QUFFQSxRQUFJLFlBQVksZUFBZSxNQUFmLENBQXNCLE1BQXRCLEVBQThCLE9BQTlCLENBQXNDLEdBQXRDLEVBQTJDLFFBQTNDLENBQWhCO0FBQ0EsVUFBSyxLQUFMLENBQVcsU0FBWCxDQUFxQixTQUFyQixFQUFnQyxTQUFoQztBQUNBLElBWkQ7O0FBY0Esa0JBQWUsS0FBZixHQUF1QixPQUF2QixDQUErQixnQkFBUTtBQUN0QyxRQUFNLElBQUksZUFBZSxJQUFmLENBQW9CLElBQXBCLENBQVY7QUFDQSxVQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLEtBQUssQ0FBTCxDQUFPLE9BQVAsQ0FBZSxHQUFmLEVBQW9CLFFBQXBCLENBQW5CLEVBQWtELEtBQUssQ0FBTCxDQUFPLE9BQVAsQ0FBZSxHQUFmLEVBQW9CLFFBQXBCLENBQWxELEVBQWlGLEVBQWpGO0FBQ0EsSUFIRDs7QUFLQSxRQUFLLFVBQUwsQ0FBZ0IsR0FBaEI7O0FBRUEsUUFBSyxTQUFMLENBQWUsUUFBZjtBQUNBOzs7bUNBRWdCO0FBQ2hCLFFBQUssaUJBQUwsR0FBeUIsRUFBekI7QUFDQSxRQUFLLFNBQUwsR0FBaUIsRUFBakI7QUFDQTs7O29DQUVpQjtBQUNqQixRQUFLLGlCQUFMLGdDQUE2QixLQUFLLFNBQWxDO0FBQ0EsUUFBSyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0E7Ozs0QkFFUyxTLEVBQVcsVSxFQUFZO0FBQ2hDLFVBQU8sS0FBSyxLQUFMLENBQVcsU0FBWCxDQUFxQixTQUFyQixFQUFnQyxVQUFoQyxDQUFQO0FBQ0E7OzswQkFFTyxRLEVBQVU7QUFDakIsT0FBTSxjQUFlLEtBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsUUFBbkIsRUFBNkIsTUFBN0IsS0FBd0MsQ0FBN0Q7QUFDQSxPQUFNLFVBQVcsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixRQUFoQixFQUEwQixLQUExQixLQUFvQyxPQUFyRDtBQUNBLE9BQU0sY0FBZSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFFBQWhCLEVBQTBCLEtBQTFCLEtBQW9DLFdBQXpEO0FBQ0EsVUFBUSxXQUFZLGVBQWUsV0FBbkM7QUFDQTs7OzJCQUVRLFEsRUFBVTtBQUNsQixPQUFNLGNBQWUsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixRQUFwQixFQUE4QixNQUE5QixLQUF5QyxDQUE5RDtBQUNBLE9BQU0sV0FBWSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFFBQWhCLEVBQTBCLEtBQTFCLEtBQW9DLFFBQXREO0FBQ0EsT0FBTSxjQUFlLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsUUFBaEIsRUFBMEIsS0FBMUIsS0FBb0MsV0FBekQ7QUFDQSxVQUFRLFlBQWEsZUFBZSxXQUFwQztBQUNBOzs7NkJBRVUsUSxFQUFVO0FBQ3BCO0FBQ0EsVUFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFFBQWhCLEVBQTBCLFVBQTFCLEtBQXlDLElBQWhEO0FBQ0E7OztpQ0FFYyxTLEVBQVc7QUFBQTs7QUFDekIsT0FBSSxRQUFRLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsU0FBaEIsQ0FBWjtBQUNBLE9BQUksY0FBYyxLQUFLLEtBQUwsQ0FBVyxRQUFYLENBQW9CLFNBQXBCLEVBQStCLE1BQS9CLENBQXNDO0FBQUEsV0FBUSxPQUFLLFFBQUwsQ0FBYyxJQUFkLENBQVI7QUFBQSxJQUF0QyxDQUFsQjs7QUFFQSxPQUFJLFlBQVksTUFBWixLQUF1QixDQUEzQixFQUE4QjtBQUM3QixXQUFPLElBQVA7QUFDQSxTQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLFFBQW5CLENBQTRCO0FBQzNCLDhCQUFzQixNQUFNLEVBQTVCLHFDQUQyQjtBQUUzQixXQUFNLE9BRnFCO0FBRzNCLGVBQVU7QUFDVCxhQUFPLE1BQU0sT0FBTixHQUFnQixNQUFNLE9BQU4sQ0FBYyxRQUE5QixHQUF5QyxDQUR2QztBQUVULFdBQUssTUFBTSxPQUFOLEdBQWdCLE1BQU0sT0FBTixDQUFjLE1BQTlCLEdBQXVDO0FBRm5DO0FBSGlCLEtBQTVCO0FBUUEsV0FBTyxJQUFQO0FBQ0EsSUFYRCxNQVdPLElBQUksWUFBWSxNQUFaLEtBQXVCLENBQXZCLElBQTRCLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsWUFBWSxDQUFaLENBQWhCLEVBQWdDLFVBQWhFLEVBQTRFO0FBQ2xGLFdBQU8sS0FBSyxjQUFMLENBQW9CLFlBQVksQ0FBWixDQUFwQixDQUFQO0FBQ0E7O0FBRUQsVUFBTyxXQUFQO0FBQ0E7OztnQ0FFYSxTLEVBQVc7QUFBQTs7QUFDeEIsV0FBUSxHQUFSLENBQVksU0FBWjtBQUNBLE9BQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFNBQWhCLENBQVo7QUFDQSxPQUFJLGFBQWEsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixTQUFwQixFQUErQixNQUEvQixDQUFzQztBQUFBLFdBQVEsT0FBSyxPQUFMLENBQWEsSUFBYixDQUFSO0FBQUEsSUFBdEMsQ0FBakI7QUFDQSxXQUFRLEdBQVIsQ0FBWSxVQUFaOztBQUVBLE9BQUksV0FBVyxNQUFYLEtBQXNCLENBQTFCLEVBQTZCO0FBQzVCLFdBQU8sSUFBUDtBQUNBLFNBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsUUFBbkIsQ0FBNEI7QUFDM0IsOEJBQXNCLE1BQU0sRUFBNUIscUNBRDJCO0FBRTNCLFdBQU0sT0FGcUI7QUFHM0IsZUFBVTtBQUNULGFBQU8sTUFBTSxPQUFOLEdBQWdCLE1BQU0sT0FBTixDQUFjLFFBQTlCLEdBQXlDLENBRHZDO0FBRVQsV0FBTSxNQUFNLE9BQU4sR0FBZ0IsTUFBTSxPQUFOLENBQWMsTUFBOUIsR0FBdUM7QUFGcEM7QUFIaUIsS0FBNUI7QUFRQSxXQUFPLElBQVA7QUFDQSxJQVhELE1BV08sSUFBSSxXQUFXLE1BQVgsS0FBc0IsQ0FBdEIsSUFBMkIsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixXQUFXLENBQVgsQ0FBaEIsRUFBK0IsVUFBOUQsRUFBMEU7QUFDaEYsV0FBTyxLQUFLLGFBQUwsQ0FBbUIsV0FBVyxDQUFYLENBQW5CLENBQVA7QUFDQTs7QUFFRCxVQUFPLFVBQVA7QUFDQTs7OzBCQUVPLFEsRUFBVSxNLEVBQVE7QUFDekIsV0FBUSxJQUFSLDJCQUFvQyxRQUFwQyxnQkFBcUQsTUFBckQ7QUFDQSxPQUFJLFdBQUo7O0FBRUEsT0FBSSxPQUFPLFFBQVAsS0FBb0IsUUFBeEIsRUFBa0M7QUFDakMsUUFBSSxLQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsQ0FBSixFQUErQjtBQUM5QixtQkFBYyxLQUFLLGNBQUwsQ0FBb0IsUUFBcEIsQ0FBZDtBQUNBLEtBRkQsTUFFTztBQUNOLG1CQUFjLENBQUMsUUFBRCxDQUFkO0FBQ0E7QUFDRCxJQU5ELE1BTU8sSUFBSSxNQUFNLE9BQU4sQ0FBYyxRQUFkLENBQUosRUFBNkI7QUFDbkMsa0JBQWMsUUFBZDtBQUNBOztBQUVELE9BQUksV0FBSjs7QUFFQSxPQUFJLE9BQU8sTUFBUCxLQUFrQixRQUF0QixFQUFnQztBQUMvQixRQUFJLEtBQUssVUFBTCxDQUFnQixNQUFoQixDQUFKLEVBQTZCO0FBQzVCLG1CQUFjLEtBQUssYUFBTCxDQUFtQixNQUFuQixDQUFkO0FBQ0EsS0FGRCxNQUVPO0FBQ04sbUJBQWMsQ0FBQyxNQUFELENBQWQ7QUFDQTtBQUNELElBTkQsTUFNTyxJQUFJLE1BQU0sT0FBTixDQUFjLE1BQWQsQ0FBSixFQUEyQjtBQUNqQyxrQkFBYyxNQUFkO0FBQ0E7O0FBRUQsUUFBSyxZQUFMLENBQWtCLFdBQWxCLEVBQStCLFdBQS9CO0FBQ0E7OzsrQkFFWSxXLEVBQWEsVyxFQUFhO0FBQUE7O0FBRXRDLE9BQUksZ0JBQWdCLElBQWhCLElBQXdCLGdCQUFnQixJQUE1QyxFQUFrRDtBQUNqRDtBQUNBOztBQUVELE9BQUksWUFBWSxNQUFaLEtBQXVCLFlBQVksTUFBdkMsRUFBK0M7QUFDOUMsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFlBQVksTUFBaEMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDNUMsU0FBSSxZQUFZLENBQVosS0FBa0IsWUFBWSxDQUFaLENBQXRCLEVBQXNDO0FBQ3JDLFdBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsWUFBWSxDQUFaLENBQW5CLEVBQW1DLFlBQVksQ0FBWixDQUFuQyxFQUFtRCxFQUFuRDtBQUNBO0FBQ0Q7QUFDRCxJQU5ELE1BTU87QUFDTixRQUFJLFlBQVksTUFBWixLQUF1QixDQUEzQixFQUE4QjtBQUM3QixpQkFBWSxPQUFaLENBQW9CO0FBQUEsYUFBYyxPQUFLLE9BQUwsQ0FBYSxVQUFiLEVBQXlCLFlBQVksQ0FBWixDQUF6QixDQUFkO0FBQUEsTUFBcEI7QUFDQSxLQUZELE1BRU8sSUFBSSxZQUFZLE1BQVosS0FBdUIsQ0FBM0IsRUFBOEI7QUFDcEMsaUJBQVksT0FBWixDQUFvQjtBQUFBLGFBQWMsT0FBSyxPQUFMLENBQWEsWUFBWSxDQUFaLENBQWIsRUFBNkIsVUFBN0IsQ0FBZDtBQUFBLE1BQXBCO0FBQ0EsS0FGTSxNQUVBO0FBQ04sVUFBSyxNQUFMLENBQVksTUFBWixDQUFtQixRQUFuQixDQUE0QjtBQUMzQixxREFBNkMsWUFBWSxNQUF6RCxjQUF3RSxZQUFZLE1BQXBGLE1BRDJCO0FBRTNCLFlBQU0sT0FGcUI7QUFHM0IsZ0JBQVU7QUFDVDtBQUNBO0FBRlM7QUFIaUIsTUFBNUI7QUFRQTtBQUNEO0FBRUQ7OzswQkFFTyxRLEVBQVU7QUFDakIsVUFBTyxLQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLFFBQW5CLENBQVA7QUFDQTs7OzZCQUVVO0FBQ1Y7QUFDQSxVQUFPLEtBQUssS0FBWjtBQUNBOzs7aUNBRWM7QUFDZCxVQUFPLEtBQUssU0FBWjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7SUMzVkksTTs7O0FBQ0Ysb0JBQVksS0FBWixFQUFtQjtBQUFBOztBQUFBLG9IQUNULEtBRFM7O0FBRWYsY0FBSyxRQUFMLEdBQWdCLE1BQUssUUFBTCxDQUFjLElBQWQsT0FBaEI7QUFDQSxjQUFLLE1BQUwsR0FBYyxJQUFkO0FBQ0EsY0FBSyxPQUFMLEdBQWUsRUFBZjtBQUplO0FBS2xCOzs7O21DQUVVO0FBQ1AsaUJBQUssYUFBTDs7QUFFQSxnQkFBSSxLQUFLLEtBQUwsQ0FBVyxRQUFmLEVBQXlCO0FBQ3JCLG9CQUFJLFdBQVcsS0FBSyxNQUFMLENBQVksUUFBWixFQUFmO0FBQ0EscUJBQUssS0FBTCxDQUFXLFFBQVgsQ0FBb0IsUUFBcEI7QUFDSDtBQUNKOzs7NkJBRUksTyxFQUFTO0FBQ1YsaUJBQUssU0FBTCxHQUFpQixPQUFqQjtBQUNIOzs7aUNBRVEsSyxFQUFPO0FBQ1osaUJBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsS0FBckIsRUFBNEIsQ0FBQyxDQUE3QjtBQUNIOzs7d0NBRWU7QUFBQTs7QUFDWixpQkFBSyxPQUFMLENBQWEsR0FBYixDQUFpQjtBQUFBLHVCQUFVLE9BQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsWUFBcEIsQ0FBaUMsTUFBakMsQ0FBVjtBQUFBLGFBQWpCO0FBQ0EsaUJBQUssT0FBTCxHQUFlLEVBQWY7QUFDSDs7O2dEQUV1QixLLEVBQU8sUyxFQUFXO0FBQ3RDLGdCQUFJLElBQUksS0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixVQUFwQixFQUFSO0FBQ0EsZ0JBQUksSUFBSSxVQUFVLFNBQVYsRUFBUjtBQUNBLGdCQUFJLFVBQVUsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQjtBQUFBLHVCQUFNLEVBQUUsRUFBRixDQUFOO0FBQUEsYUFBakIsQ0FBZDtBQUNBLGdCQUFJLG1CQUFtQixRQUFRLEdBQVIsQ0FBWTtBQUFBLHVCQUFVLE9BQU8sS0FBUCxDQUFhLFFBQWIsQ0FBc0IsRUFBRSxHQUF4QixFQUE2QixFQUFFLE1BQS9CLENBQVY7QUFBQSxhQUFaLEVBQThELE1BQTlELENBQXNFLFVBQUMsSUFBRCxFQUFPLElBQVA7QUFBQSx1QkFBZ0IsUUFBUSxJQUF4QjtBQUFBLGFBQXRFLEVBQW9HLEtBQXBHLENBQXZCOztBQUVBLGdCQUFJLGdCQUFKLEVBQXNCO0FBQ2xCLHFCQUFLLE1BQUwsQ0FBWSxXQUFaLENBQXdCLGVBQXhCO0FBQ0g7QUFDSjs7OzRDQUVtQjtBQUNoQixpQkFBSyxNQUFMLEdBQWMsSUFBSSxJQUFKLENBQVMsS0FBSyxTQUFkLENBQWQ7QUFDQSxpQkFBSyxNQUFMLENBQVksVUFBWixHQUF5QixPQUF6QixDQUFpQyxjQUFjLEtBQUssS0FBTCxDQUFXLElBQTFEO0FBQ0EsaUJBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsZUFBZSxLQUFLLEtBQUwsQ0FBVyxLQUEvQztBQUNBLGlCQUFLLE1BQUwsQ0FBWSxrQkFBWixDQUErQixLQUEvQjtBQUNBLGlCQUFLLE1BQUwsQ0FBWSxVQUFaLENBQXVCO0FBQ25CLDJDQUEyQixJQURSO0FBRW5CLGdDQUFnQixJQUZHO0FBR25CLDBDQUEwQixLQUhQO0FBSW5CLHNCQUFNLElBSmE7QUFLbkIsMENBQTBCLElBTFA7QUFNbkIsNEJBQVksV0FOTztBQU9uQixpQ0FBaUIsSUFQRTtBQVFuQiw0QkFBWTtBQVJPLGFBQXZCO0FBVUEsaUJBQUssTUFBTCxDQUFZLGVBQVosR0FBOEIsUUFBOUI7QUFDQSxpQkFBSyxNQUFMLENBQVksU0FBWixDQUFzQixLQUF0QixDQUE0QixVQUE1QixHQUF5QyxHQUF6Qzs7QUFFQSxnQkFBSSxLQUFLLEtBQUwsQ0FBVyxZQUFmLEVBQTRCO0FBQ3hCLHFCQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLEtBQUssS0FBTCxDQUFXLFlBQWhDLEVBQThDLENBQUMsQ0FBL0M7QUFDSDs7QUFFRCxpQkFBSyxNQUFMLENBQVksRUFBWixDQUFlLFFBQWYsRUFBeUIsS0FBSyxRQUE5QjtBQUNBLGlCQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLEVBQXRCLENBQXlCLGNBQXpCLEVBQXlDLEtBQUssdUJBQUwsQ0FBNkIsSUFBN0IsQ0FBa0MsSUFBbEMsQ0FBekM7QUFDSDs7O3lEQUVnQyxTLEVBQVc7QUFBQTs7QUFDeEMsZ0JBQUksVUFBVSxNQUFkLEVBQXNCO0FBQ2xCLG9CQUFJLGNBQWMsVUFBVSxNQUFWLENBQWlCLEdBQWpCLENBQXFCLGlCQUFTO0FBQzVDLHdCQUFJLFdBQVcsT0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixHQUFwQixDQUF3QixlQUF4QixDQUF3QyxNQUFNLFFBQU4sQ0FBZSxLQUF2RCxDQUFmO0FBQ0EsMkJBQU87QUFDSCw2QkFBSyxTQUFTLEdBRFg7QUFFSCxnQ0FBUSxTQUFTLE1BRmQ7QUFHSCw4QkFBTSxNQUFNLE9BSFQ7QUFJSCw4QkFBTSxNQUFNO0FBSlQscUJBQVA7QUFNSCxpQkFSaUIsQ0FBbEI7O0FBVUEscUJBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsY0FBcEIsQ0FBbUMsV0FBbkM7QUFDQTs7QUFFQSxvQkFBSSxRQUFRLFFBQVEsV0FBUixFQUFxQixLQUFqQzs7QUFFQSxxQkFBSyxhQUFMOztBQUVBLG9CQUFJLFVBQVUsVUFBVSxNQUFWLENBQWlCLEdBQWpCLENBQXFCLGlCQUFTO0FBQ3hDLHdCQUFJLFdBQVc7QUFDWCwrQkFBTyxPQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLEdBQXBCLENBQXdCLGVBQXhCLENBQXdDLE1BQU0sUUFBTixDQUFlLEtBQXZELENBREk7QUFFWCw2QkFBSyxPQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLEdBQXBCLENBQXdCLGVBQXhCLENBQXdDLE1BQU0sUUFBTixDQUFlLEdBQXZEO0FBRk0scUJBQWY7O0FBS0Esd0JBQUksUUFBUSxJQUFJLEtBQUosQ0FBVSxTQUFTLEtBQVQsQ0FBZSxHQUF6QixFQUE4QixTQUFTLEtBQVQsQ0FBZSxNQUE3QyxFQUFxRCxTQUFTLEdBQVQsQ0FBYSxHQUFsRSxFQUF1RSxTQUFTLEdBQVQsQ0FBYSxNQUFwRixDQUFaOztBQUVBLDJCQUFLLE9BQUwsQ0FBYSxJQUFiLENBQWtCLE9BQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsU0FBcEIsQ0FBOEIsS0FBOUIsRUFBcUMsY0FBckMsRUFBcUQsTUFBckQsQ0FBbEI7QUFDSCxpQkFUYSxDQUFkO0FBVUgsYUE1QkQsTUE0Qk87QUFDSCxxQkFBSyxNQUFMLENBQVksT0FBWixDQUFvQixnQkFBcEI7QUFDQSxxQkFBSyxNQUFMLENBQVksV0FBWixDQUF3QixlQUF4QjtBQUNIOztBQUVELGdCQUFJLFVBQVUsS0FBZCxFQUFxQjtBQUNqQixxQkFBSyxNQUFMLENBQVksUUFBWixDQUFxQixVQUFVLEtBQS9CLEVBQXNDLENBQUMsQ0FBdkM7QUFDSDtBQUNKOzs7aUNBRVE7QUFBQTs7QUFDTCxtQkFBTyw2QkFBSyxLQUFNLGFBQUMsT0FBRDtBQUFBLDJCQUFhLE9BQUssSUFBTCxDQUFVLE9BQVYsQ0FBYjtBQUFBLGlCQUFYLEdBQVA7QUFDSDs7OztFQTVHZ0IsTUFBTSxTOzs7Ozs7O0lDQXJCLFc7QUFNTCxzQkFBWSxRQUFaLEVBQXNCO0FBQUE7O0FBQUEsT0FMdEIsYUFLc0IsR0FMTixFQUtNO0FBQUEsT0FKdEIsZUFJc0IsR0FKSixDQUlJO0FBQUEsT0FIdEIsb0JBR3NCLEdBSEMsQ0FHRDs7QUFBQSxPQUZ0QixRQUVzQixHQUZYLFlBQVUsQ0FBRSxDQUVEOztBQUNyQixPQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQTs7Ozt5QkFFTSxLLEVBQU87QUFDYixPQUFNLEtBQUssS0FBSyxXQUFMLEVBQVg7QUFDQSxRQUFLLGFBQUwsQ0FBbUIsRUFBbkIsSUFBeUIsSUFBSSxZQUFKLENBQWlCLEVBQWpCLEVBQXFCLEtBQXJCLEVBQTRCLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUF5QixJQUF6QixDQUE1QixDQUF6QjtBQUNBOzs7dUNBRTJCO0FBQUEsT0FBWixFQUFZLFFBQVosRUFBWTtBQUFBLE9BQVIsS0FBUSxRQUFSLEtBQVE7O0FBQzNCLE9BQUksTUFBTSxLQUFLLG9CQUFmLEVBQXFDO0FBQ3BDLFNBQUssb0JBQUwsR0FBNEIsRUFBNUI7QUFDQSxTQUFLLFFBQUwsQ0FBYyxLQUFkO0FBQ0E7QUFDRDs7O2dDQUVhO0FBQ2IsUUFBSyxlQUFMLElBQXdCLENBQXhCO0FBQ0EsVUFBTyxLQUFLLGVBQVo7QUFDQTs7Ozs7O0lBR0ksWTtBQUdMLHVCQUFZLEVBQVosRUFBZ0IsS0FBaEIsRUFBdUIsVUFBdkIsRUFBbUM7QUFBQTs7QUFBQSxPQUZuQyxFQUVtQyxHQUY5QixDQUU4QjtBQUFBLE9BRG5DLE1BQ21DLEdBRDFCLElBQzBCOztBQUNsQyxPQUFLLEVBQUwsR0FBVSxFQUFWO0FBQ0EsT0FBSyxNQUFMLEdBQWMsSUFBSSxNQUFKLENBQVcsa0NBQVgsQ0FBZDtBQUNBLE9BQUssTUFBTCxDQUFZLGdCQUFaLENBQTZCLFNBQTdCLEVBQXdDLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsSUFBbEIsQ0FBeEM7QUFDQSxPQUFLLFVBQUwsR0FBa0IsVUFBbEI7O0FBRUEsT0FBSyxNQUFMLENBQVksV0FBWixDQUF3QixLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQXhCO0FBQ0E7Ozs7MEJBQ08sTyxFQUFTO0FBQ2hCLFFBQUssTUFBTCxDQUFZLFNBQVo7QUFDQSxRQUFLLFVBQUwsQ0FBZ0I7QUFDZixRQUFJLEtBQUssRUFETTtBQUVmLFdBQU8sS0FBSyxNQUFMLENBQVksUUFBUSxJQUFwQjtBQUZRLElBQWhCO0FBSUE7Ozt5QkFDTSxLLEVBQU87QUFDYixVQUFPLFNBQVMsSUFBVCxDQUFjLEtBQWQsQ0FBb0IsS0FBcEIsQ0FBUDtBQUNHOzs7eUJBRU0sSSxFQUFNO0FBQ2YsVUFBTyxTQUFTLElBQVQsQ0FBYyxJQUFkLENBQW1CLElBQW5CLENBQVA7QUFDRzs7Ozs7Ozs7Ozs7Ozs7O0FDcERMLElBQU0sTUFBTSxRQUFRLFVBQVIsRUFBb0IsV0FBaEM7QUFDQSxJQUFNLEtBQUssUUFBUSxJQUFSLENBQVg7O0lBRU0sRzs7O0FBT0wsY0FBWSxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsd0dBQ1osS0FEWTs7QUFBQSxRQU5uQixNQU1tQixHQU5WLElBQUksTUFBSixFQU1VO0FBQUEsUUFMbkIsV0FLbUIsR0FMTCxJQUFJLFdBQUosRUFLSztBQUFBLFFBSm5CLFNBSW1CLEdBSlAsSUFBSSxnQkFBSixFQUlPO0FBQUEsUUFGbkIsSUFFbUIsR0FGWixJQUVZOzs7QUFHbEIsUUFBSyxLQUFMLEdBQWE7QUFDWjtBQUNBO0FBQ0E7QUFDQSx3QkFBcUIsRUFKVDtBQUtaLFVBQU8sSUFMSztBQU1aLGFBQVUsSUFORTtBQU9aLGFBQVUsU0FQRTtBQVFaLG9CQUFpQjtBQVJMLEdBQWI7O0FBV0EsTUFBSSxFQUFKLENBQU8sTUFBUCxFQUFlLFVBQVMsS0FBVCxFQUFnQixPQUFoQixFQUF5QjtBQUN2QyxNQUFHLFNBQUgsQ0FBYSxRQUFRLE1BQVIsR0FBaUIsYUFBOUIsRUFBNkMsS0FBSyxLQUFMLENBQVcsaUJBQXhELEVBQTJFLFVBQVMsR0FBVCxFQUFjO0FBQ3ZGLFFBQUksR0FBSixFQUFTLE1BQU0sSUFBTjtBQUNWLElBRkQ7QUFHQSxNQUFHLFNBQUgsQ0FBYSxRQUFRLE1BQVIsR0FBaUIsa0JBQTlCLEVBQWtELEtBQUssU0FBTCxDQUFlLEtBQUssS0FBTCxDQUFXLEdBQTFCLEVBQStCLElBQS9CLEVBQXFDLENBQXJDLENBQWxELEVBQTJGLFVBQVMsR0FBVCxFQUFjO0FBQ3ZHLFFBQUksR0FBSixFQUFTLE1BQU0sSUFBTjtBQUNWLElBRkQ7QUFHQSxNQUFHLFNBQUgsQ0FBYSxRQUFRLE1BQVIsR0FBaUIsWUFBOUIsRUFBNEMsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCLFNBQTFFLEVBQXFGLFVBQVMsR0FBVCxFQUFjO0FBQ2pHLFFBQUksR0FBSixFQUFTLE1BQU0sSUFBTjtBQUNWLElBRkQ7QUFHQSxNQUFHLFNBQUgsQ0FBYSxRQUFRLE1BQVIsR0FBaUIsYUFBOUIsRUFBNkMsS0FBSyxTQUFMLENBQWUsTUFBTSxRQUFOLENBQWUsSUFBZixDQUFvQixLQUFwQixDQUEwQixLQUFLLEtBQUwsQ0FBVyxLQUFyQyxDQUFmLEVBQTRELElBQTVELEVBQWtFLENBQWxFLENBQTdDLEVBQW1ILFVBQVMsR0FBVCxFQUFjO0FBQy9ILFFBQUksR0FBSixFQUFTLE1BQU0sSUFBTjtBQUNWLElBRkQ7QUFHQSxNQUFHLFNBQUgsQ0FBYSxRQUFRLE1BQVIsR0FBaUIscUJBQTlCLEVBQXFELEtBQUssS0FBTCxDQUFXLGFBQWhFLEVBQStFLFVBQVMsR0FBVCxFQUFjO0FBQzNGLFFBQUksR0FBSixFQUFTLE1BQU0sSUFBTjtBQUNWLElBRkQ7O0FBSUEsT0FBSSxtQkFBbUIsSUFBSSxZQUFKLENBQWlCLGNBQWpCLEVBQWlDO0FBQ3ZELHVDQUR1RDtBQUV2RCxZQUFRO0FBRitDLElBQWpDLENBQXZCOztBQWpCdUMsa0JBcUJyQixRQUFRLFVBQVIsQ0FyQnFCO0FBQUEsT0FxQi9CLEtBckIrQixZQXFCL0IsS0FyQitCOztBQXVCdkMsb0JBQWlCLE9BQWpCLEdBQTJCLFlBQU07QUFDaEMsVUFBTSxnQkFBTixDQUF1QixRQUFRLE1BQS9CO0FBQ0EsSUFGRDtBQUdBLEdBMUJjLENBMEJiLElBMUJhLE9BQWY7O0FBNEJBLE1BQUksRUFBSixDQUFPLGNBQVAsRUFBdUIsVUFBQyxDQUFELEVBQUksQ0FBSixFQUFVO0FBQ2hDLFNBQUssWUFBTDtBQUNBLEdBRkQ7O0FBSUEsTUFBSSxFQUFKLENBQU8sTUFBUCxFQUFlLFVBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUN4QixTQUFLLFFBQUwsQ0FBYyxFQUFFLFFBQWhCO0FBQ0EsR0FGRDs7QUFJQSxNQUFJLFNBQVMsT0FBTyxZQUFQLENBQW9CLE9BQXBCLENBQTRCLFFBQTVCLENBQWI7QUFDQSxNQUFJLE1BQUosRUFBWTtBQUNYLE9BQUksVUFBVSxTQUFWLElBQXVCLFVBQVUsTUFBckMsRUFBNkM7QUFDNUMsVUFBSyxLQUFMLENBQVcsTUFBWCxHQUFvQixNQUFwQjtBQUNBLElBRkQsTUFFTztBQUNOLFVBQUssV0FBTCxDQUFpQixNQUFqQixDQUF3QixRQUF4QixDQUFpQztBQUNoQyxXQUFNLFNBRDBCO0FBRWhDO0FBRmdDLEtBQWpDO0FBSUE7QUFDRDs7QUFFRCxRQUFLLHVCQUFMLEdBQStCLE1BQUssdUJBQUwsQ0FBNkIsSUFBN0IsT0FBL0I7QUFDQSxRQUFLLDhCQUFMLEdBQXNDLE1BQUssOEJBQUwsQ0FBb0MsSUFBcEMsT0FBdEM7QUEvRGtCO0FBZ0VsQjs7OzsyQkFFUSxRLEVBQVU7QUFDbEIsV0FBUSxHQUFSLENBQVksVUFBWixFQUF3QixRQUF4QjtBQUNBLE9BQUksY0FBYyxHQUFHLFlBQUgsQ0FBZ0IsUUFBaEIsRUFBMEIsTUFBMUIsQ0FBbEI7QUFDQSxRQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLFdBQXJCLENBQWtDO0FBQWxDLEtBQ0EsS0FBSyxRQUFMLENBQWM7QUFDYix1QkFBbUI7QUFETixJQUFkO0FBR0E7Ozs4QkFFVyxFLEVBQUk7QUFDZixPQUFJLGNBQWMsR0FBRyxZQUFILENBQW1CLFNBQW5CLGtCQUF5QyxFQUF6QyxXQUFtRCxNQUFuRCxDQUFsQjtBQUNBLFFBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsV0FBckIsQ0FBa0M7QUFBbEMsS0FDQSxLQUFLLFFBQUwsQ0FBYztBQUNiLHVCQUFtQjtBQUROLElBQWQ7QUFHQTs7O3NDQUVtQjtBQUNuQixRQUFLLFdBQUwsQ0FBaUIsb0JBQWpCO0FBQ0E7OztpREFFOEIsSyxFQUFPO0FBQUE7O0FBQ3JDLE9BQUksS0FBSyxJQUFULEVBQWU7QUFBRSxpQkFBYSxLQUFLLElBQWxCO0FBQTBCO0FBQzNDLFFBQUssSUFBTCxHQUFZLFdBQVcsWUFBTTtBQUFFLFdBQUssdUJBQUwsQ0FBNkIsS0FBN0I7QUFBc0MsSUFBekQsRUFBMkQsR0FBM0QsQ0FBWjtBQUNBOzs7MENBRXVCLEssRUFBTTtBQUM3QixXQUFRLElBQVIsQ0FBYSx5QkFBYjtBQUNBLE9BQUksU0FBUyxLQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLEtBQWpCLENBQWI7O0FBRUEsT0FBSSxPQUFPLEdBQVgsRUFBZ0I7QUFDZixTQUFLLFdBQUwsQ0FBaUIsT0FBakIsQ0FBeUIsT0FBTyxHQUFoQztBQUNBLFFBQUksUUFBUSxLQUFLLFdBQUwsQ0FBaUIscUJBQWpCLEVBQVo7QUFDQSxRQUFJLGNBQWMsS0FBSyxXQUFMLENBQWlCO0FBQ25DOztBQURrQixNQUFsQixDQUdBLEtBQUssUUFBTCxDQUFjO0FBQ2Isd0JBQW1CLEtBRE47QUFFYixVQUFLLE9BQU8sR0FGQztBQUdiLFlBQU8sS0FITTtBQUliLG9CQUFlLEtBQUssU0FBTCxDQUFlLFlBQWYsQ0FBNEIsS0FBNUIsRUFBbUMsV0FBbkMsQ0FKRjtBQUtiLGFBQVEsS0FBSyxXQUFMLENBQWlCLFNBQWpCO0FBTEssS0FBZDtBQU9BLElBYkQsTUFhTztBQUNOO0FBQ0EsU0FBSyxRQUFMLENBQWM7QUFDYix3QkFBbUIsS0FETjtBQUViLFVBQUssSUFGUTtBQUdiLFlBQU8sSUFITTtBQUliLGFBQVEsQ0FBQztBQUNSLGdCQUFVO0FBQ1QsY0FBTyxPQUFPLFFBQVAsR0FBa0IsQ0FEaEI7QUFFVCxZQUFLLE9BQU87QUFGSCxPQURGO0FBS1IsZUFBUyxjQUFjLE9BQU8sUUFBckIsR0FBZ0MsR0FMakM7QUFNUixZQUFNO0FBTkUsTUFBRDtBQUpLLEtBQWQ7QUFhQTtBQUNELFdBQVEsT0FBUixDQUFnQix5QkFBaEI7QUFDQTs7O2lDQUVjO0FBQ2QsUUFBSyxRQUFMLENBQWM7QUFDYixZQUFTLEtBQUssS0FBTCxDQUFXLE1BQVgsS0FBc0IsU0FBdkIsR0FBb0MsTUFBcEMsR0FBNkM7QUFEeEMsSUFBZDtBQUdBLGNBQVcsWUFBTTtBQUNoQixXQUFPLGFBQVAsQ0FBcUIsSUFBSSxLQUFKLENBQVUsUUFBVixDQUFyQjtBQUNBLElBRkQsRUFFRyxHQUZIO0FBR0E7OzsyQkFFUTtBQUFBOztBQUNSLE9BQUksa0JBQWtCLEtBQUssS0FBTCxDQUFXLE1BQWpDO0FBQ0EsT0FBSSxjQUFjLEtBQUssS0FBTCxDQUFXLE1BQVgsS0FBc0IsU0FBdEIsR0FBa0MsSUFBbEMsR0FBeUMsSUFBM0Q7O0FBRUcsVUFBTztBQUFBO0FBQUEsTUFBSyxJQUFHLFdBQVIsRUFBb0IsMEJBQXdCLGVBQTVDO0FBQ047QUFBQyxVQUFEO0FBQUEsT0FBTyxJQUFHLFlBQVY7QUFDQyx5QkFBQyxNQUFEO0FBQ0MsV0FBSyxhQUFDLElBQUQ7QUFBQSxjQUFTLE9BQUssTUFBTCxHQUFjLElBQXZCO0FBQUEsT0FETjtBQUVDLFlBQUssUUFGTjtBQUdDLGFBQU0sU0FIUDtBQUlDLGNBQVEsS0FBSyxLQUFMLENBQVcsTUFKcEI7QUFLQyxnQkFBVSxLQUFLLDhCQUxoQjtBQU1DLG9CQUFjLEtBQUssS0FBTCxDQUFXO0FBTjFCO0FBREQsS0FETTtBQVlOO0FBQUMsVUFBRDtBQUFBLE9BQU8sSUFBRyxlQUFWO0FBQ0MseUJBQUMsV0FBRCxJQUFhLE9BQU8sS0FBSyxLQUFMLENBQVcsS0FBL0IsRUFBc0MsUUFBUSxXQUE5QztBQUREO0FBWk0sSUFBUDtBQXFDRDs7OztFQXpMYyxNQUFNLFM7Ozs7Ozs7Ozs7Ozs7QUNIeEI7Ozs7QUFJQSxJQUFNLGFBQWEsUUFBUSxvQkFBUixDQUFuQjs7SUFFTSxXOztBQUtMOztBQUpBO0FBU0Esd0JBQWM7QUFBQTs7QUFBQSxPQVJkLE1BUWMsR0FSTCxJQUFJLE1BQUosRUFRSztBQUFBLE9BUGQsS0FPYyxHQVBOLElBQUksa0JBQUosQ0FBdUIsSUFBdkIsQ0FPTTtBQUFBLE9BSmQsU0FJYyxHQUpGLElBQUksZ0JBQUosRUFJRTtBQUFBLE9BRmQsV0FFYyxHQUZBLEVBRUE7O0FBQ2IsT0FBSyxVQUFMO0FBQ0E7Ozs7K0JBRVk7QUFDWixRQUFLLEtBQUwsQ0FBVyxVQUFYO0FBQ0EsUUFBSyxNQUFMLENBQVksS0FBWjs7QUFFQSxRQUFLLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxRQUFLLHFCQUFMO0FBQ0EsUUFBSyxLQUFMLEdBQWEsQ0FBYjtBQUNBOzs7MENBRXVCO0FBQUE7O0FBQ3ZCO0FBQ0EsT0FBTSxxQkFBcUIsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixPQUFsQixFQUEyQixRQUEzQixFQUFxQyxhQUFyQyxFQUFvRCxVQUFwRCxFQUFnRSxVQUFoRSxFQUE0RSxVQUE1RSxFQUF3RixhQUF4RixFQUF1RyxPQUF2RyxFQUFnSCxZQUFoSCxFQUE4SCxvQkFBOUgsRUFBb0osZUFBcEosRUFBcUssZ0JBQXJLLEVBQXVMLHdCQUF2TCxFQUFpTixvQkFBak4sRUFBdU8sY0FBdk8sRUFBdVAsNEJBQXZQLEVBQXFSLCtCQUFyUixFQUFzVCwwQkFBdFQsRUFBa1YsK0JBQWxWLEVBQW1YLFlBQW5YLEVBQWlZLFdBQWpZLEVBQThZLFVBQTlZLEVBQTBaLFlBQTFaLEVBQXdhLFlBQXhhLEVBQXNiLFlBQXRiLEVBQW9jLFlBQXBjLEVBQWtkLFNBQWxkLEVBQTZkLFNBQTdkLEVBQXdlLFVBQXhlLEVBQW9mLFVBQXBmLEVBQWdnQixVQUFoZ0IsRUFBNGdCLHFCQUE1Z0IsRUFBbWlCLFNBQW5pQixFQUE4aUIsdUJBQTlpQixFQUF1a0IsTUFBdmtCLEVBQStrQixVQUEva0IsRUFBMmxCLFdBQTNsQixFQUF3bUIsU0FBeG1CLEVBQW1uQixnQkFBbm5CLEVBQXFvQixTQUFyb0IsRUFBZ3BCLFNBQWhwQixFQUEycEIsUUFBM3BCLEVBQXFxQixTQUFycUIsRUFBZ3JCLFFBQWhyQixFQUEwckIsU0FBMXJCLEVBQXFzQixjQUFyc0IsRUFBcXRCLGFBQXJ0QixFQUFvdUIsY0FBcHVCLEVBQW92Qiw2QkFBcHZCLEVBQW14QixZQUFueEIsQ0FBM0I7QUFDQSxzQkFBbUIsT0FBbkIsQ0FBMkI7QUFBQSxXQUFjLE1BQUssYUFBTCxDQUFtQixVQUFuQixDQUFkO0FBQUEsSUFBM0I7QUFDQTs7O2dDQUVhLGMsRUFBZ0I7QUFDN0IsUUFBSyxXQUFMLENBQWlCLGNBQWpCLElBQW1DO0FBQ2xDLFVBQU0sY0FENEI7QUFFbEMsV0FBTyxLQUFLLFNBQUwsQ0FBZSxHQUFmLENBQW1CLGNBQW5CO0FBRjJCLElBQW5DO0FBSUE7OzswQkFFTyxHLEVBQUs7QUFDWixPQUFNLFFBQVE7QUFDYixXQUFPLElBQUksa0JBQUosQ0FBdUIsSUFBdkIsQ0FETTtBQUViLFlBQVEsSUFBSSxNQUFKO0FBRkssSUFBZDtBQUlBLFFBQUssVUFBTDtBQUNBLFFBQUssT0FBTCxDQUFhLEdBQWIsRUFBa0IsS0FBbEI7QUFDQSxXQUFRLEdBQVIsQ0FBWSxjQUFaLEVBQTRCLEtBQTVCO0FBQ0E7OzswQkFFTyxLLEVBQU8sSyxFQUFPO0FBQ3JCLE9BQUksQ0FBQyxLQUFMLEVBQVk7QUFBRSxZQUFRLEtBQVIsQ0FBYyxZQUFkLEVBQTZCO0FBQVM7QUFDcEQsUUFBSyxLQUFMLElBQWMsQ0FBZDtBQUNBLE9BQU0sTUFBTSxNQUFNLElBQU4sQ0FBVyxFQUFDLFFBQVEsS0FBSyxLQUFkLEVBQVgsRUFBaUMsSUFBakMsQ0FBc0MsR0FBdEMsRUFBMkMsTUFBM0MsQ0FBa0QsVUFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLFdBQVUsSUFBSSxDQUFkO0FBQUEsSUFBbEQsRUFBbUU7QUFDL0U7O0FBRFksSUFBWixDQUdBLElBQU0sU0FBUyxNQUFNLE1BQU0sSUFBM0I7QUFDQSxPQUFNLEtBQUssS0FBSyxNQUFMLEtBQWdCLEtBQUssYUFBaEM7QUFDQSxPQUFNLGNBQWMsR0FBRyxJQUFILENBQVEsSUFBUixFQUFjLEtBQWQsRUFBcUIsS0FBckIsQ0FBcEI7QUFDQSxRQUFLLEtBQUwsSUFBYyxDQUFkOztBQUVBLFVBQU8sV0FBUDtBQUNBOzs7eUJBRU0sSyxFQUFPLEssRUFBTztBQUFBOztBQUNwQixTQUFNLFdBQU4sQ0FBa0IsT0FBbEIsQ0FBMEI7QUFBQSxXQUFjLE9BQUssT0FBTCxDQUFhLFVBQWIsRUFBeUIsS0FBekIsQ0FBZDtBQUFBLElBQTFCO0FBQ0E7OztrQ0FFZSxjLEVBQWdCLEssRUFBTztBQUN0QztBQUNBLFFBQUssYUFBTCxDQUFtQixlQUFlLElBQWxDO0FBQ0EsT0FBSSxlQUFlLElBQW5CLEVBQXlCO0FBQ3hCLFVBQU0sS0FBTixDQUFZLGtCQUFaLENBQStCLGVBQWUsSUFBOUM7QUFDQSxTQUFLLEtBQUwsQ0FBVyxrQkFBWCxDQUE4QixlQUFlLElBQTdDO0FBQ0EsU0FBSyxPQUFMLENBQWEsZUFBZSxJQUE1QixFQUFrQyxLQUFsQztBQUNBLFVBQU0sS0FBTixDQUFZLGlCQUFaO0FBQ0EsU0FBSyxLQUFMLENBQVcsaUJBQVg7QUFDQTtBQUNEOzs7eUJBRU0sSyxFQUFPLEssRUFBTztBQUFBOztBQUNwQixTQUFNLEtBQU4sQ0FBWSxjQUFaO0FBQ0EsUUFBSyxLQUFMLENBQVc7QUFDWDtBQURBLE1BRUEsTUFBTSxNQUFOLENBQWEsT0FBYixDQUFxQixnQkFBUTtBQUM1QixVQUFNLEtBQU4sQ0FBWSxlQUFaO0FBQ0EsV0FBSyxLQUFMLENBQVc7QUFDWDtBQURBLE9BRUEsT0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixLQUFuQjtBQUNBLElBTEQ7QUFNQTs7O2tDQUVlLEksRUFBTSxLLEVBQU87QUFDNUI7QUFDQSxPQUFNLGFBQWEsS0FBSyxLQUFMLEdBQWEsS0FBSyxLQUFMLENBQVcsS0FBeEIsR0FBZ0MsS0FBSyxLQUFMLENBQVcsa0JBQVgsQ0FBOEIsVUFBOUIsQ0FBbkQ7O0FBRUEsU0FBTSxLQUFOLENBQVksa0JBQVosQ0FBK0IsVUFBL0I7QUFDQSxRQUFLLEtBQUwsQ0FBVyxrQkFBWCxDQUE4QixVQUE5QjtBQUNBLFFBQUssT0FBTCxDQUFhLEtBQUssSUFBbEIsRUFBd0IsS0FBeEI7QUFDQSxTQUFNLEtBQU4sQ0FBWSxpQkFBWjtBQUNBLFFBQUssS0FBTCxDQUFXLGlCQUFYOztBQUVBLFFBQUssS0FBTCxDQUFXLGNBQVgsQ0FBMEIsVUFBMUIsRUFBc0M7QUFDckMscUJBQWlCLEtBQUssS0FBTCxHQUFhLEtBQUssS0FBTCxDQUFXLEtBQXhCLEdBQWdDLFNBRFo7QUFFckMsUUFBSSxVQUZpQztBQUdyQyxXQUFPLFVBSDhCO0FBSXJDLGlCQUFhLElBSndCO0FBS3JDLGFBQVMsS0FBSztBQUx1QixJQUF0Qzs7QUFRQSxVQUFPO0FBQ04sUUFBSSxVQURFO0FBRU4sV0FBTyxVQUZEO0FBR04scUJBQWlCLEtBQUssS0FBTCxHQUFhLEtBQUssS0FBTCxDQUFXLEtBQXhCLEdBQWdDLFNBSDNDO0FBSU4sYUFBUyxLQUFLO0FBSlIsSUFBUDtBQU1BOzs7NEJBRVMsUSxFQUFVLEssRUFBTztBQUFBOztBQUMxQjtBQUNBLFlBQVMsV0FBVCxDQUFxQixPQUFyQixDQUE2QjtBQUFBLFdBQWMsT0FBSyxPQUFMLENBQWEsVUFBYixFQUF5QixLQUF6QixDQUFkO0FBQUEsSUFBN0I7QUFDQTs7O3dCQUdLLEksRUFBTSxLLEVBQU87QUFDbEIsT0FBTSxpQkFBaUIsS0FBSyxPQUFMLGNBQ25CLEtBQUssSUFEYztBQUV0QixXQUFPLEtBQUs7QUFGVSxPQUdwQjs7QUFFSDtBQUx1QixJQUF2QjtBQU1BOztBQUVEOzs7OytCQUNhLFEsRUFBVSxLLEVBQU87O0FBRTdCLE9BQU0sVUFBVTtBQUNmLFFBQUksRUFEVztBQUVmLFdBQU8sRUFGUTtBQUdmLGtCQUFjLEVBSEM7QUFJZiwyQkFBdUIsSUFBRSxDQUpWO0FBS2YsbUJBQWU7QUFMQSxJQUFoQjs7QUFRQSxPQUFNLE9BQU87QUFDWixRQUFJLFNBRFE7QUFFWixXQUFPLFNBRks7QUFHWixXQUFPLFVBSEs7QUFJWixZQUFRLElBQUksUUFBUSxhQUFaLEdBQTRCLFFBQVEsS0FKaEM7QUFLWixXQUFPLEdBTEs7QUFNWixnQkFBWSxTQUFTLFVBQVQsQ0FBb0IsR0FBcEIsQ0FBd0I7QUFBQSxZQUFLLENBQUMsRUFBRSxJQUFILEVBQVMsRUFBRSxLQUFGLENBQVEsS0FBakIsQ0FBTDtBQUFBLEtBQXhCLENBTkE7O0FBUVosYUFBUztBQVJHLElBQWI7O0FBV0EsT0FBSSxjQUFjLEtBQUssOEJBQUwsQ0FBb0MsU0FBUyxJQUFULENBQWM7QUFDcEU7O0FBRGtCLElBQWxCLENBR0EsSUFBSSxZQUFZLE1BQVosS0FBdUIsQ0FBM0IsRUFBOEI7QUFDN0IsU0FBSyxLQUFMLEdBQWEsU0FBUyxJQUFULENBQWMsS0FBM0I7QUFDQSxTQUFLLFdBQUwsR0FBbUIsSUFBbkI7O0FBRUEsU0FBSyxRQUFMLENBQWM7QUFDYiw0Q0FBb0MsU0FBUyxJQUFULENBQWMsS0FBbEQsbUNBRGE7QUFFYixlQUFVO0FBQ1QsYUFBUSxTQUFTLElBQVQsQ0FBYyxPQUFkLENBQXNCLFFBRHJCO0FBRVQsV0FBTSxTQUFTLElBQVQsQ0FBYyxPQUFkLENBQXNCO0FBRm5CLE1BRkc7QUFNYixXQUFNO0FBTk8sS0FBZDtBQVFBLElBWkQsTUFZTyxJQUFJLFlBQVksTUFBWixLQUF1QixDQUEzQixFQUE4QjtBQUNwQyxRQUFJLGFBQWEsWUFBWSxDQUFaLENBQWpCO0FBQ0EsUUFBSSxVQUFKLEVBQWdCO0FBQ2YsVUFBSyxLQUFMLEdBQWEsV0FBVyxLQUF4QjtBQUNBLFVBQUssS0FBTCxHQUFhLFdBQVcsSUFBeEI7QUFDQTtBQUNELElBTk0sTUFNQTtBQUNOLFNBQUssS0FBTCxHQUFhLFNBQVMsSUFBVCxDQUFjLEtBQTNCO0FBQ0EsU0FBSyxRQUFMLENBQWM7QUFDYiw0Q0FBb0MsU0FBUyxJQUFULENBQWMsS0FBbEQsOEJBQStFLFlBQVksR0FBWixDQUFnQjtBQUFBLG9CQUFXLElBQUksSUFBZjtBQUFBLE1BQWhCLEVBQXdDLElBQXhDLENBQTZDLElBQTdDLENBQS9FLE1BRGE7QUFFYixlQUFVO0FBQ1QsYUFBUSxTQUFTLElBQVQsQ0FBYyxPQUFkLENBQXNCLFFBRHJCO0FBRVQsV0FBTSxTQUFTLElBQVQsQ0FBYyxPQUFkLENBQXNCO0FBRm5CLE1BRkc7QUFNYixXQUFNO0FBTk8sS0FBZDtBQVFBOztBQUVELE9BQUksQ0FBQyxTQUFTLEtBQWQsRUFBcUI7QUFDcEIsU0FBSyxFQUFMLEdBQVUsS0FBSyxLQUFMLENBQVcsa0JBQVgsQ0FBOEIsS0FBSyxLQUFuQyxDQUFWO0FBQ0EsSUFGRCxNQUVPO0FBQ04sU0FBSyxFQUFMLEdBQVUsU0FBUyxLQUFULENBQWUsS0FBekI7QUFDQSxTQUFLLGVBQUwsR0FBdUIsU0FBUyxLQUFULENBQWUsS0FBdEM7QUFDQSxTQUFLLE1BQUwsSUFBZSxRQUFRLEVBQXZCO0FBQ0E7O0FBRUQsT0FBSSxLQUFLLFVBQUwsQ0FBZ0IsTUFBaEIsR0FBeUIsQ0FBN0IsRUFBZ0M7QUFDL0IsU0FBSyxNQUFMLElBQWUsUUFBUSxxQkFBUixHQUFpQyxLQUFLLFVBQUwsQ0FBZ0IsTUFBaEIsR0FBeUIsUUFBUSxZQUFqRjtBQUNBOztBQUVEO0FBQ0EsT0FBSSxPQUFPLElBQVAsQ0FBWSxLQUFLLEtBQUwsQ0FBVyxTQUF2QixFQUFrQyxRQUFsQyxDQUEyQyxLQUFLLEtBQWhELENBQUosRUFBNEQ7QUFDM0QsUUFBSSxRQUFRLEdBQUcsS0FBSCxDQUFTLEtBQUssS0FBZCxDQUFaO0FBQ0EsVUFBTSxPQUFOLEdBQWdCLEdBQWhCO0FBQ0EsU0FBSyxLQUFMLENBQVcsY0FBWCxDQUEwQixLQUFLLEVBQS9CLGVBQ0ksSUFESjtBQUVDLFlBQU8sRUFBQyxRQUFRLE1BQU0sUUFBTixFQUFUO0FBRlI7QUFJQSx3QkFDSSxJQURKO0FBRUMsWUFBTyxFQUFFLFFBQVEsTUFBTSxRQUFOLEVBQVY7QUFGUjtBQUlBOztBQUVELE9BQU0sT0FBTyxLQUFLLEdBQUwsZ0NBQVksS0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CO0FBQUE7QUFBQSxRQUFFLEdBQUY7QUFBQSxRQUFPLEtBQVA7O0FBQUEsV0FBa0IsV0FBVyxHQUFYLEVBQWdCLEVBQUUsTUFBSyxFQUFQLEVBQWhCLENBQWxCO0FBQUEsSUFBcEIsQ0FBWixFQUFiO0FBQ0EsT0FBTSxRQUFRLEtBQUssR0FBTCxnQ0FBWSxLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0I7QUFBQTtBQUFBLFFBQUUsR0FBRjtBQUFBLFFBQU8sS0FBUDs7QUFBQSxXQUFrQixXQUFXLEtBQVgsRUFBa0IsRUFBRSxNQUFLLEVBQVAsRUFBbEIsQ0FBbEI7QUFBQSxJQUFwQixDQUFaLEVBQWQ7QUFDQSxPQUFNLGNBQWMsT0FBTyxLQUEzQjs7QUFFQSxPQUFNLGFBQWEsS0FBSyxHQUFMLGdDQUFZLENBQUMsS0FBSyxLQUFOLEVBQWEsS0FBSyxlQUFMLEdBQXVCLEtBQUssZUFBNUIsR0FBOEMsRUFBM0QsRUFBK0QsR0FBL0QsQ0FBbUU7QUFBQSxXQUFVLFdBQVcsTUFBWCxFQUFtQixFQUFDLE1BQU0sRUFBUCxFQUFuQixDQUFWO0FBQUEsSUFBbkUsQ0FBWixFQUFuQjs7QUFFQSxPQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUwsQ0FBUyxXQUFULEVBQXNCLFVBQXRCLENBQW5COztBQUVBLFFBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsS0FBSyxFQUEzQixlQUNJLElBREo7QUFFQyxXQUFPLEVBQUMsTUFBTSxLQUFLLEtBQVosRUFGUjtBQUdDO0FBSEQ7O0FBTUEsdUJBQ0ksSUFESjtBQUVDLFdBQU8sRUFBQyxNQUFNLEtBQUssS0FBWixFQUZSO0FBR0M7QUFIRDtBQUtBOzs7d0JBRUssSSxFQUFNLEssRUFBTztBQUFBOztBQUNsQixRQUFLLElBQUwsQ0FBVSxPQUFWLENBQWtCO0FBQUEsV0FBUSxPQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLEtBQW5CLENBQVI7QUFBQSxJQUFsQjtBQUNBOzs7OEJBRVcsVSxFQUFZO0FBQ3ZCLFFBQUssS0FBTCxDQUFXLGFBQVgsQ0FBeUIsV0FBVyxLQUFwQztBQUNBOzs7aURBRThCLEssRUFBTztBQUFBOztBQUNyQyxPQUFJLGNBQWMsT0FBTyxJQUFQLENBQVksS0FBSyxXQUFqQixDQUFsQjtBQUNBLE9BQUksaUJBQWlCLFlBQVksY0FBWixDQUEyQixLQUEzQixFQUFrQztBQUN2RDtBQURxQixJQUFyQixDQUVBLElBQUkscUJBQXFCLGVBQWUsR0FBZixDQUFtQjtBQUFBLFdBQU8sT0FBSyxXQUFMLENBQWlCLEdBQWpCLENBQVA7QUFBQSxJQUFuQixDQUF6QjtBQUNBLFVBQU8sa0JBQVA7QUFDQTs7OzBDQUV1QjtBQUN2QixVQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsRUFBUDtBQUNBOzs7NENBRXlCO0FBQ3pCLFVBQU8sS0FBSyxLQUFMLENBQVcsWUFBWCxFQUFQO0FBQ0E7Ozs4QkFFVztBQUNYLFVBQU8sS0FBSyxNQUFMLENBQVksU0FBWixFQUFQO0FBQ0E7OzsyQkFFUSxLLEVBQU87QUFDZixRQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLEtBQXJCO0FBQ0E7OztnQ0FrQmEsSyxFQUFPO0FBQ3BCLFdBQVEsSUFBUixDQUFhLGlDQUFiLEVBQWdELEtBQWhEO0FBQ0E7OztpQ0FsQnFCLE8sRUFBUyxJLEVBQU07QUFDcEMsT0FBSSxhQUFhLGNBQWpCO0FBQ0csT0FBSSxlQUFlLFFBQVEsS0FBUixDQUFjLFVBQWQsQ0FBbkI7QUFDQSxPQUFJLFlBQVksS0FBSyxHQUFMLENBQVM7QUFBQSxXQUFjLFdBQVcsS0FBWCxDQUFpQixVQUFqQixDQUFkO0FBQUEsSUFBVCxDQUFoQjtBQUNBLE9BQUksU0FBUyxVQUFVLE1BQVYsQ0FBaUI7QUFBQSxXQUFpQixZQUFZLGFBQVosQ0FBMEIsWUFBMUIsRUFBd0MsYUFBeEMsQ0FBakI7QUFBQSxJQUFqQixDQUFiO0FBQ0EsWUFBUyxPQUFPLEdBQVAsQ0FBVztBQUFBLFdBQVEsS0FBSyxJQUFMLENBQVUsRUFBVixDQUFSO0FBQUEsSUFBWCxDQUFUO0FBQ0EsVUFBTyxNQUFQO0FBQ0g7OztnQ0FFb0IsSSxFQUFNLE0sRUFBUTtBQUMvQixPQUFJLEtBQUssTUFBTCxLQUFnQixPQUFPLE1BQTNCLEVBQW1DO0FBQUUsV0FBTyxLQUFQO0FBQWM7QUFDbkQsT0FBSSxJQUFJLENBQVI7QUFDQSxVQUFNLElBQUksS0FBSyxNQUFULElBQW1CLE9BQU8sQ0FBUCxFQUFVLFVBQVYsQ0FBcUIsS0FBSyxDQUFMLENBQXJCLENBQXpCLEVBQXdEO0FBQUUsU0FBSyxDQUFMO0FBQVE7QUFDbEUsVUFBUSxNQUFNLEtBQUssTUFBbkIsQ0FKK0IsQ0FJSjtBQUM5Qjs7Ozs7Ozs7Ozs7SUMzUkksTTs7OztPQUNMLE0sR0FBUyxFOzs7OzswQkFFRDtBQUNQLFFBQUssTUFBTCxHQUFjLEVBQWQ7QUFDQTs7OzhCQUVXO0FBQ1gsVUFBTyxLQUFLLE1BQVo7QUFDQTs7OzJCQUVRLEssRUFBTztBQUNmLE9BQUksSUFBSSxJQUFSO0FBQ0EsV0FBTyxNQUFNLElBQWI7QUFDQyxTQUFLLE9BQUw7QUFBYyxTQUFJLFFBQVEsS0FBWixDQUFtQjtBQUNqQyxTQUFLLFNBQUw7QUFBZ0IsU0FBSSxRQUFRLElBQVosQ0FBa0I7QUFDbEMsU0FBSyxNQUFMO0FBQWEsU0FBSSxRQUFRLElBQVosQ0FBa0I7QUFDL0I7QUFBUyxTQUFJLFFBQVEsR0FBWixDQUFpQjtBQUozQjtBQU1BLEtBQUUsTUFBTSxPQUFSO0FBQ0EsUUFBSyxNQUFMLENBQVksSUFBWixDQUFpQixLQUFqQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7SUNyQkksSzs7Ozs7Ozs7Ozs7NkJBQ0s7QUFDUCxhQUFPO0FBQUE7QUFBQSxVQUFLLElBQUksS0FBSyxLQUFMLENBQVcsRUFBcEIsRUFBd0IsV0FBVSxPQUFsQztBQUNMLGFBQUssS0FBTCxDQUFXO0FBRE4sT0FBUDtBQUdEOzs7O0VBTGlCLE1BQU0sUzs7Ozs7OztBQ0ExQixJQUFNLEtBQUssUUFBUSxJQUFSLENBQVg7QUFDQSxJQUFNLE1BQU0sUUFBUSxRQUFSLENBQVo7O0lBRU0sTTtBQStHTCxtQkFBYztBQUFBOztBQUFBLE9BOUdkLFFBOEdjLEdBOUdILElBOEdHO0FBQUEsT0E3R2QsT0E2R2MsR0E3R0osSUE2R0k7QUFBQSxPQTNHZCxhQTJHYyxHQTNHRTtBQUNmLFVBQU8sZUFBQyxXQUFEO0FBQUEsV0FBbUI7QUFDekIsV0FBTSxPQURtQjtBQUV6QixrQkFBYSxZQUFZLElBQVo7QUFGWSxLQUFuQjtBQUFBLElBRFE7QUFLZixtQkFBZ0Isd0JBQVMsQ0FBVCxFQUFZLFNBQVosRUFBdUIsTUFBdkIsRUFBK0IsSUFBL0IsRUFBcUM7QUFDcEQsV0FBTztBQUNOLFdBQU0sZ0JBREE7QUFFTixXQUFNLFVBQVUsTUFBVixDQUFpQixRQUZqQjtBQUdOLFdBQU0sS0FBSyxJQUFMLEdBQVksQ0FBWjtBQUhBLEtBQVA7QUFLQSxJQVhjO0FBWWYsbUJBQWdCLHdCQUFTLElBQVQsRUFBZTtBQUM5QixXQUFPO0FBQ04sV0FBTSxnQkFEQTtBQUVOLFdBQU0sS0FBSyxJQUFMLEVBRkE7QUFHTixjQUFTLEtBQUs7QUFIUixLQUFQO0FBS0EsSUFsQmM7QUFtQmYsYUFBVSxrQkFBUyxDQUFULEVBQVksSUFBWixFQUFrQixFQUFsQixFQUFzQjtBQUMvQixRQUFJLGNBQWMsS0FBSyxJQUFMLEVBQWxCO0FBQ0EsV0FBTztBQUNOLFdBQU0sVUFEQTtBQUVOLGtCQUFhLFlBQVk7QUFGbkIsS0FBUDtBQUlBLElBekJjO0FBMEJmLFVBQU8sZUFBUyxJQUFULEVBQWU7QUFDckIsV0FBTztBQUNOLFdBQU0sT0FEQTtBQUVOLGFBQVEsS0FBSyxJQUFMO0FBRkYsS0FBUDtBQUlBLElBL0JjO0FBZ0NmLFNBQU0sY0FBUyxFQUFULEVBQWEsQ0FBYixFQUFnQixJQUFoQixFQUFzQjtBQUMzQixXQUFPO0FBQ04sV0FBTSxNQURBO0FBRU4sV0FBTSxLQUFLLElBQUwsRUFGQTtBQUdOLFlBQU8sR0FBRyxJQUFILEdBQVUsQ0FBVixDQUhEO0FBSU4sY0FBUyxLQUFLO0FBSlIsS0FBUDtBQU1BLElBdkNjO0FBd0NmLGdCQUFhLHFCQUFTLElBQVQsRUFBZSxNQUFmLEVBQXVCO0FBQ25DLFdBQU87QUFDTixXQUFNLGFBREE7QUFFTixXQUFNLEtBQUssSUFBTCxFQUZBO0FBR04saUJBQVksT0FBTyxJQUFQO0FBSE4sS0FBUDtBQUtBLElBOUNjO0FBK0NmOzs7OztBQUtBLFNBQU0sY0FBUyxDQUFULEVBQVksSUFBWixFQUFrQixFQUFsQixFQUFzQjtBQUMzQixXQUFPO0FBQ04sV0FBTSxNQURBO0FBRU4sV0FBTSxLQUFLLElBQUw7QUFGQSxLQUFQO0FBSUEsSUF6RGM7QUEwRGYsb0JBQWlCLHlCQUFTLENBQVQsRUFBWSxNQUFaLEVBQW9CLEVBQXBCLEVBQXdCO0FBQ3hDLFFBQU0sSUFBSSxPQUFPLElBQVAsRUFBVjtBQUNBLFdBQU8sRUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLENBQVAsR0FBYyxDQUFyQjtBQUNBLElBN0RjO0FBOERmLGNBQVcsbUJBQVMsSUFBVCxFQUFlLENBQWYsRUFBa0IsS0FBbEIsRUFBeUI7QUFDbkMsV0FBTztBQUNOLFdBQU0sV0FEQTtBQUVOLFdBQU0sS0FBSyxNQUFMLENBQVksUUFGWjtBQUdOLFlBQU8sTUFBTSxJQUFOO0FBSEQsS0FBUDtBQUtBLElBcEVjO0FBcUVmLFVBQU8sZUFBUyxHQUFULEVBQWM7QUFDcEIsV0FBTztBQUNOLFdBQU0sT0FEQTtBQUVOLFlBQU8sSUFBSSxNQUFKLENBQVc7QUFGWixLQUFQO0FBSUEsSUExRWM7QUEyRWYsbUJBQWdCLHdCQUFTLENBQVQsRUFBWSxDQUFaLEVBQWUsRUFBZixFQUFtQjtBQUNsQyxXQUFPLENBQUMsRUFBRSxJQUFGLEVBQUQsRUFBVyxNQUFYLENBQWtCLEdBQUcsSUFBSCxFQUFsQixDQUFQO0FBQ0EsSUE3RWM7QUE4RWYsZ0JBQWEsdUJBQVc7QUFDdkIsV0FBTyxFQUFQO0FBQ0EsSUFoRmM7QUFpRmYsU0FBTSxjQUFTLElBQVQsRUFBZTtBQUNwQixXQUFPO0FBQ04sV0FBTSxZQURBO0FBRU4sWUFBTyxLQUFLLE1BQUwsQ0FBWSxRQUZiO0FBR04sY0FBUyxLQUFLO0FBSFIsS0FBUDtBQUtBLElBdkZjO0FBd0ZmLGtCQUFlLHVCQUFTLENBQVQsRUFBWTtBQUMxQixXQUFPLEVBQUUsTUFBRixDQUFTLFFBQWhCO0FBQ0EsSUExRmM7QUEyRmYsYUFBVSxrQkFBUyxDQUFULEVBQVksRUFBWixFQUFnQjtBQUN6QixXQUFPO0FBQ04sV0FBTSxVQURBO0FBRU4sWUFBTyxLQUFLLE1BQUwsQ0FBWSxRQUZiO0FBR04sY0FBUyxLQUFLO0FBSFIsS0FBUDtBQUtBLElBakdjO0FBa0dmLGVBQVksb0JBQVMsQ0FBVCxFQUFZLEVBQVosRUFBZ0I7QUFDM0IsV0FBTztBQUNOLFdBQU0sWUFEQTtBQUVOLFlBQU8sS0FBSyxNQUFMLENBQVksUUFGYjtBQUdOLGNBQVMsS0FBSztBQUhSLEtBQVA7QUFLQTtBQXhHYyxHQTJHRjs7QUFDYixPQUFLLFFBQUwsR0FBZ0IsR0FBRyxZQUFILENBQWdCLFlBQVksaUJBQTVCLEVBQStDLE1BQS9DLENBQWhCO0FBQ0EsT0FBSyxPQUFMLEdBQWUsSUFBSSxPQUFKLENBQVksS0FBSyxRQUFqQixDQUFmO0FBQ0EsT0FBSyxTQUFMLEdBQWlCLEtBQUssT0FBTCxDQUFhLGVBQWIsR0FBK0IsWUFBL0IsQ0FBNEMsTUFBNUMsRUFBb0QsS0FBSyxhQUF6RCxDQUFqQjtBQUNBOzs7O3VCQUVJLE0sRUFBUTtBQUNaLE9BQUksU0FBUyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQW1CLE1BQW5CLENBQWI7O0FBRUEsT0FBSSxPQUFPLFNBQVAsRUFBSixFQUF3QjtBQUN2QixRQUFJLE1BQU0sS0FBSyxTQUFMLENBQWUsTUFBZixFQUF1QixJQUF2QixFQUFWO0FBQ0EsV0FBTztBQUNOO0FBRE0sS0FBUDtBQUdBLElBTEQsTUFLTztBQUNOLFFBQUksV0FBVyxPQUFPLGVBQVAsRUFBZjtBQUNBLFFBQUksV0FBVyxPQUFPLDJCQUFQLEVBQWY7QUFDQSxXQUFPO0FBQ04sdUJBRE07QUFFTjtBQUZNLEtBQVA7QUFJQTtBQUNEOzs7Ozs7Ozs7OztJQ3hJSSxnQjtBQUNMLDZCQUFjO0FBQUE7O0FBQ2IsT0FBSyxRQUFMLEdBQWdCLENBQUMsaUJBQUQsRUFBb0IsZ0JBQXBCLEVBQXNDLGdCQUF0QyxFQUF3RCxlQUF4RCxFQUF5RSxpQkFBekUsRUFBNEYsaUJBQTVGLEVBQStHLGFBQS9HLEVBQThILGNBQTlILEVBQThJLG1CQUE5SSxFQUFtSyx3QkFBbkssRUFBNkwsaUJBQTdMLEVBQWdOLHdCQUFoTixFQUEwTyxzQkFBMU8sRUFBa1Esb0JBQWxRLEVBQXdSLFVBQXhSLEVBQW9TLFVBQXBTLEVBQWdULGtCQUFoVCxFQUFvVSxXQUFwVSxFQUFpVixPQUFqVixFQUEwVixpQkFBMVYsRUFBNlcsbUJBQTdXLEVBQWtZLG9CQUFsWSxFQUF3WixlQUF4WixFQUF5YSxlQUF6YSxFQUEwYixTQUExYixFQUFxYyxhQUFyYyxFQUFvZCxlQUFwZCxFQUFxZSxrQkFBcmUsRUFBeWYsWUFBemYsRUFBdWdCLGtCQUF2Z0IsRUFBMmhCLG1CQUEzaEIsRUFBZ2pCLFVBQWhqQixFQUE0akIsbUJBQTVqQixFQUFpbEIsYUFBamxCLEVBQWdtQixhQUFobUIsRUFBK21CLHFCQUEvbUIsRUFBc29CLFdBQXRvQixFQUFtcEIsTUFBbnBCLEVBQTJwQixvQkFBM3BCLEVBQWlyQixnQkFBanJCLEVBQW1zQixxQkFBbnNCLEVBQTB0QixTQUExdEIsRUFBcXVCLGVBQXJ1QixFQUFzdkIsMkJBQXR2QixFQUFteEIsaUJBQW54QixFQUFzeUIsb0JBQXR5QixFQUE0ekIsZ0JBQTV6QixFQUE4MEIsZ0JBQTkwQixFQUFnMkIsaUJBQWgyQixFQUFtM0IsY0FBbjNCLEVBQW00QixnQkFBbjRCLEVBQXE1QixvQkFBcjVCLEVBQTI2QixlQUEzNkIsRUFBNDdCLGFBQTU3QixFQUEyOEIsZUFBMzhCLEVBQTQ5QixhQUE1OUIsRUFBMitCLFlBQTMrQixFQUF5L0IsVUFBei9CLEVBQXFnQyxjQUFyZ0MsRUFBcWhDLE1BQXJoQyxFQUE2aEMsV0FBN2hDLEVBQTBpQyxtQkFBMWlDLEVBQStqQyxvQkFBL2pDLEVBQXFsQyxvQkFBcmxDLEVBQTJtQyxjQUEzbUMsRUFBMm5DLHVCQUEzbkMsRUFBb3BDLGdCQUFwcEMsRUFBc3FDLGFBQXRxQyxFQUFxckMsWUFBcnJDLEVBQW1zQyxTQUFuc0MsRUFBOHNDLG1CQUE5c0MsRUFBbXVDLGlCQUFudUMsRUFBc3ZDLFdBQXR2QyxFQUFtd0MsU0FBbndDLEVBQTh3QyxZQUE5d0MsRUFBNHhDLFlBQTV4QyxFQUEweUMsVUFBMXlDLEVBQXN6QyxhQUF0ekMsRUFBcTBDLFVBQXIwQyxFQUFpMUMsS0FBajFDLEVBQXcxQyxLQUF4MUMsRUFBKzFDLEtBQS8xQyxFQUFzMkMsT0FBdDJDLEVBQSsyQyxLQUEvMkMsRUFBczNDLE1BQXQzQyxFQUE4M0MsV0FBOTNDLEVBQTI0QyxPQUEzNEMsRUFBbzVDLFVBQXA1QyxFQUFnNkMsS0FBaDZDLEVBQXU2QyxhQUF2NkMsRUFBczdDLFNBQXQ3QyxFQUFpOEMsU0FBajhDLEVBQTQ4QyxXQUE1OEMsRUFBeTlDLFNBQXo5QyxFQUFvK0MsU0FBcCtDLEVBQSsrQyxNQUEvK0MsRUFBdS9DLEtBQXYvQyxFQUE4L0MsUUFBOS9DLEVBQXdnRCxXQUF4Z0QsRUFBcWhELE1BQXJoRCxFQUE2aEQsTUFBN2hELEVBQXFpRCxNQUFyaUQsRUFBNmlELFFBQTdpRCxFQUF1akQsT0FBdmpELEVBQWdrRCxRQUFoa0QsRUFBMGtELFdBQTFrRCxFQUF1bEQsU0FBdmxELEVBQWttRCxTQUFsbUQsRUFBNm1ELFNBQTdtRCxFQUF3bkQsTUFBeG5ELEVBQWdvRCxNQUFob0QsRUFBd29ELEtBQXhvRCxFQUErb0QsSUFBL29ELEVBQXFwRCxPQUFycEQsRUFBOHBELEtBQTlwRCxFQUFxcUQsWUFBcnFELEVBQW1yRCxZQUFuckQsRUFBaXNELE1BQWpzRCxFQUF5c0QsS0FBenNELEVBQWd0RCxTQUFodEQsRUFBMnRELE1BQTN0RCxFQUFtdUQsUUFBbnVELEVBQTZ1RCxLQUE3dUQsRUFBb3ZELEtBQXB2RCxFQUEydkQsWUFBM3ZELEVBQXl3RCxLQUF6d0QsRUFBZ3hELE1BQWh4RCxFQUF3eEQsUUFBeHhELEVBQWt5RCxLQUFseUQsRUFBeXlELE1BQXp5RCxFQUFpekQsS0FBanpELEVBQXd6RCxLQUF4ekQsRUFBK3pELE9BQS96RCxFQUF3MEQsVUFBeDBELEVBQW8xRCxNQUFwMUQsRUFBNDFELE9BQTUxRCxFQUFxMkQsTUFBcjJELEVBQTYyRCxVQUE3MkQsRUFBeTNELE9BQXozRCxFQUFrNEQsS0FBbDRELEVBQXk0RCxTQUF6NEQsRUFBbzVELE9BQXA1RCxFQUE2NUQsUUFBNzVELEVBQXU2RCxjQUF2NkQsRUFBdTdELEtBQXY3RCxFQUE4N0QsS0FBOTdELEVBQXE4RCxPQUFyOEQsRUFBODhELE9BQTk4RCxFQUF1OUQsTUFBdjlELEVBQSs5RCxNQUEvOUQsRUFBdStELEtBQXYrRCxDQUFoQjtBQUNBLE9BQUssUUFBTCxHQUFnQixDQUFDLEtBQUQsRUFBUSxJQUFSLEVBQWMsUUFBZCxFQUF3QixPQUF4QixFQUFpQyxPQUFqQyxFQUEwQyxVQUExQyxFQUFzRCxLQUF0RCxFQUE2RCxLQUE3RCxFQUFvRSxNQUFwRSxFQUE0RSxNQUE1RSxFQUFvRixRQUFwRixFQUE4RixNQUE5RixFQUFzRyxTQUF0RyxFQUFpSCxLQUFqSCxFQUF3SCxNQUF4SCxFQUFnSSxRQUFoSSxFQUEwSSxJQUExSSxFQUFnSixRQUFoSixFQUEwSixJQUExSixFQUFnSyxJQUFoSyxFQUFzSyxRQUF0SyxFQUFnTCxLQUFoTCxFQUF1TCxJQUF2TCxFQUE2TCxNQUE3TCxFQUFxTSxPQUFyTSxFQUE4TSxPQUE5TSxFQUF1TixRQUF2TixFQUFpTyxLQUFqTyxFQUF3TyxPQUF4TyxFQUFpUCxNQUFqUCxFQUF5UCxPQUF6UCxDQUFoQjtBQUNBOzs7OzJCQUVXLEUsRUFBSTtBQUNmLE9BQUksY0FBYyxFQUFsQjtBQUNBLE9BQUksS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixXQUF2QixLQUF1QyxLQUFLLFFBQUwsQ0FBYyxRQUFkLENBQXVCLFdBQXZCLENBQTNDLEVBQWdGO0FBQy9FLGtCQUFjLE1BQU0sV0FBcEI7QUFDQTtBQUNELGlCQUFjLFlBQVksT0FBWixDQUFvQixLQUFwQixFQUEyQixNQUEzQixDQUFkO0FBQ0EsaUJBQWMsWUFBWSxPQUFaLENBQW9CLEtBQXBCLEVBQTJCLEdBQTNCLENBQWQ7QUFDQSxVQUFPLFdBQVA7QUFDQTs7O2dDQUVhLFEsRUFBVTtBQUN2QixPQUFJLG1CQUFtQjtBQUN0QixtQkFBZSxVQURPO0FBRXRCLHFCQUFpQixvQkFGSztBQUd0QixzQkFBa0IsY0FISTtBQUl0Qiw4QkFBMEIsdUJBSko7QUFLdEIsa0JBQWMsY0FMUTtBQU10QiwwQkFBc0IsdUJBTkE7QUFPdEIsb0JBQWdCLGdCQVBNO0FBUXRCLDJCQUF1QixRQVJEO0FBU3RCLDZCQUF5QixPQVRIO0FBVXRCLHFDQUFpQyxTQVZYO0FBV3RCLGdDQUE0QixjQVhOO0FBWXRCLHFDQUFpQyxTQVpYO0FBYXRCLGVBQVcsV0FiVztBQWN0QixrQkFBYyxjQWRRO0FBZXRCLGlCQUFhLGFBZlM7QUFnQnRCLGdCQUFZLFlBaEJVO0FBaUJ0QixZQUFRLFFBakJjO0FBa0J0QixrQkFBYyxjQWxCUTtBQW1CdEIsa0JBQWMsY0FuQlE7QUFvQnRCLGtCQUFjLGVBcEJRO0FBcUJ0QixrQkFBYyxjQXJCUTtBQXNCdEIsZUFBVyxXQXRCVztBQXVCdEIsZUFBVyxXQXZCVztBQXdCdEIsZ0JBQVksWUF4QlU7QUF5QnRCLGdCQUFZLFlBekJVO0FBMEJ0QiwwQkFBc0IsY0ExQkE7QUEyQnRCLGNBQVUsVUEzQlk7QUE0QnRCLGVBQVcsV0E1Qlc7QUE2QnRCLHdCQUFvQixxQkE3QkU7QUE4QnRCLG9CQUFnQixpQkE5Qk07QUErQnRCLDBCQUFzQix3QkEvQkE7QUFnQ3RCLHFDQUFpQyxVQWhDWDtBQWlDdEIsV0FBTyxPQWpDZTtBQWtDdEIsZ0JBQVksYUFsQ1U7QUFtQ3RCLG9CQUFnQixTQW5DTTtBQW9DdEIsY0FBVTtBQXBDWSxJQUF2Qjs7QUF1Q0EsVUFBTyxpQkFBaUIsY0FBakIsQ0FBZ0MsUUFBaEMsSUFBNEMsaUJBQWlCLFFBQWpCLENBQTVDLEdBQXlFLFFBQWhGO0FBRUE7Ozt5QkFFTSxJLEVBQTBDO0FBQUEsT0FBcEMsS0FBb0MsdUVBQTVCLENBQTRCO0FBQUEsT0FBekIsY0FBeUIsdUVBQVIsTUFBUTs7QUFDaEQsT0FBSSxTQUFTLGVBQWUsTUFBZixDQUFzQixLQUF0QixDQUFiO0FBQ0EsVUFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQWlCLEdBQWpCLENBQXFCO0FBQUEsV0FBUSxTQUFTLElBQWpCO0FBQUEsSUFBckIsRUFBNEMsSUFBNUMsQ0FBaUQsSUFBakQsQ0FBUDtBQUNBOzs7K0JBRVksSyxFQUFPLFcsRUFBYTtBQUFBOztBQUNoQyxPQUFJLDJGQUFKOztBQUtBLE9BQUksb0JBQW9CLE9BQU8sSUFBUCxDQUFZLFdBQVosRUFBeUIsR0FBekIsQ0FBNkIsMEJBQWtCO0FBQ3RFLFFBQUksbUJBQW1CLE1BQXZCLEVBQStCO0FBQzlCLFlBQU8sTUFBSyxxQkFBTCxDQUEyQixjQUEzQixFQUEyQyxZQUFZLGNBQVosQ0FBM0MsQ0FBUDtBQUNBLEtBRkQsTUFFTztBQUNOO0FBQ0E7QUFDRCxJQU51QixDQUF4Qjs7QUFRQSxPQUFJLE9BQ0gsT0FERyxZQUdKLGtCQUFrQixJQUFsQixDQUF1QixJQUF2QixDQUhJLE9BQUo7O0FBTUEsVUFBTyxJQUFQO0FBQ0E7Ozt3Q0FFcUIsUyxFQUFXLEssRUFBTztBQUFBOztBQUN2QyxPQUFJLHNCQUFzQixTQUFTLEdBQVQsQ0FBYSxPQUFiLENBQXFCLEtBQXJCLENBQTFCO0FBQ0EsT0FBSSxrQkFBa0IsRUFBdEI7O0FBRUEsdUJBQW9CLEdBQXBCLENBQXdCLGdCQUFRO0FBQy9CO0FBQ0EsUUFBSSxJQUFJLE1BQU0sSUFBTixDQUFXLElBQVgsQ0FBUjtBQUNBLFFBQUksS0FBSyxNQUFNLFFBQU4sQ0FBZSxJQUFmLENBQVQ7O0FBRUEsUUFBSSxDQUFDLENBQUwsRUFBUTtBQUNQO0FBQ0E7QUFDRDs7QUFFQSxRQUFJLEdBQUcsTUFBSCxLQUFjLENBQWxCLEVBQXFCO0FBQ3BCLFNBQUksVUFBVSxNQUFNLE9BQU4sQ0FBYyxJQUFkLEVBQW9CLEdBQXBCLENBQXdCO0FBQUEsYUFBSyxPQUFLLFFBQUwsQ0FBYyxFQUFFLENBQWhCLENBQUw7QUFBQSxNQUF4QixDQUFkO0FBQ0Esd0JBQXNCLE9BQUssUUFBTCxDQUFjLElBQWQsQ0FBdEIsV0FBK0MsT0FBSyxhQUFMLENBQW1CLEVBQUUsS0FBckIsQ0FBL0MsU0FBOEUsUUFBUSxJQUFSLENBQWEsSUFBYixDQUE5RTtBQUNBO0FBQ0QsSUFkRCxFQWNHLElBZEg7O0FBZ0JBLE9BQUksd0JBQ0csU0FESCxpR0FHVSxTQUhWLHdKQVFKLEtBQUssTUFBTCxDQUFZLGVBQVosRUFBNkIsQ0FBN0IsQ0FSSSx1REFBSjtBQVdBLFVBQU8sVUFBUDtBQUNBOzs7Ozs7Ozs7OztJQ3hISSxVO0FBR0wsdUJBQXdCO0FBQUEsTUFBWixLQUFZLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEsT0FGeEIsVUFFd0IsR0FGWCxFQUVXOztBQUN2QixNQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUN6QixRQUFLLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxHQUZELE1BRU87QUFDTixXQUFRLEtBQVIsQ0FBYyx3Q0FBZCxFQUF3RCxLQUF4RDtBQUNBO0FBQ0Q7Ozs7K0JBRVk7QUFDWixRQUFLLEtBQUw7QUFDQTs7O3VCQUVJLEssRUFBTztBQUNYLFFBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixLQUFyQjtBQUNBOzs7d0JBRUs7QUFDTCxVQUFPLEtBQUssVUFBTCxDQUFnQixHQUFoQixFQUFQO0FBQ0E7OzswQkFFTztBQUNQLFFBQUssVUFBTCxHQUFrQixFQUFsQjtBQUNBOzs7MkNBRXdCO0FBQ3hCLFVBQU8sS0FBSyxVQUFMLENBQWdCLElBQWhCLENBQXFCLEdBQXJCLENBQVA7QUFDQTs7OzRDQUV5QjtBQUN6QixPQUFJLE9BQU8sTUFBTSxJQUFOLENBQVcsS0FBSyxVQUFoQixDQUFYO0FBQ0EsUUFBSyxHQUFMO0FBQ0EsVUFBTyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQVA7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQ0YsSUFBTSxPQUFPLFFBQVEsU0FBUixDQUFiOztJQUVNLFc7OztBQUNKLHVCQUFZLEtBQVosRUFBbUI7QUFBQTs7QUFBQSwwSEFDWCxLQURXOztBQUdqQixVQUFLLFdBQUwsR0FBbUIsSUFBSSxXQUFKLENBQWdCLE1BQUssU0FBTCxDQUFlLElBQWYsT0FBaEIsQ0FBbkI7QUFDQSxVQUFLLEtBQUwsR0FBYTtBQUNYLGFBQU87QUFESSxLQUFiOztBQUlBLFVBQUssR0FBTCxHQUFXLElBQVg7QUFDQSxVQUFLLEtBQUwsR0FBYSxJQUFiOztBQUVBLFVBQUssV0FBTCxHQUFtQixJQUFuQjtBQVhpQjtBQVlsQjs7Ozs4QkFFUyxLLEVBQU87QUFDZixXQUFLLFFBQUwsQ0FBYyxFQUFFLFlBQUYsRUFBZDtBQUNEOzs7cURBRWdDLFMsRUFBVztBQUMxQyxVQUFJLFVBQVUsS0FBZCxFQUFxQjtBQUNuQixrQkFBVSxLQUFWLENBQWdCLE1BQWhCLENBQXVCLE9BQXZCLEdBQWlDLFVBQVUsTUFBM0M7QUFDQSxhQUFLLFdBQUwsQ0FBaUIsTUFBakIsQ0FBd0IsVUFBVSxLQUFsQztBQUNEO0FBQ0Y7OzswQ0FFcUIsUyxFQUFXLFMsRUFBVztBQUMxQyxhQUFPLEtBQUssS0FBTCxLQUFlLFNBQXRCO0FBQ0Q7OztnQ0FFVyxJLEVBQU07QUFDaEIsVUFBTSxlQUFlLEtBQUssRUFBMUI7QUFDQSxXQUFLLFFBQUwsQ0FBYyxFQUFFLDBCQUFGLEVBQWQ7O0FBRmdCLCtCQUlVLEtBQUssS0FBTCxDQUFXLEtBQVgsQ0FBaUIsS0FBakIsRUFKVjtBQUFBLFVBSVIsS0FKUSxzQkFJUixLQUpRO0FBQUEsVUFJRCxNQUpDLHNCQUlELE1BSkM7O0FBTWhCLFVBQU0sWUFBWSxtQkFBQyxLQUFELEVBQVEsTUFBUixFQUFnQixRQUFoQixFQUEwQixTQUExQixFQUF3QztBQUN4RCxZQUFNLGFBQWEsUUFBUSxRQUEzQjtBQUNBLFlBQU0sY0FBYyxTQUFTLFNBQTdCO0FBQ0EsWUFBTSxZQUFZLGFBQWEsV0FBYixHQUEyQixLQUEzQixHQUFtQyxNQUFyRDtBQUNBO0FBQ0EsZUFBTyxTQUFQO0FBQ0QsT0FORDs7QUFRQSxVQUFJLEtBQUssV0FBTCxLQUFxQixJQUF6QixFQUErQjtBQUM3QixhQUFLLFdBQUwsR0FBbUIsQ0FDakIsUUFBUSxDQURTLEVBRWpCLFNBQVMsQ0FGUSxFQUdqQixVQUFVLEtBQVYsRUFBaUIsTUFBakIsRUFBeUIsS0FBekIsRUFBZ0MsTUFBaEMsQ0FIaUIsQ0FBbkI7QUFLRDtBQUNELFVBQU0sU0FBUyxDQUNiLEtBQUssQ0FEUSxFQUViLEtBQUssQ0FGUSxFQUdiLFVBQVUsS0FBSyxLQUFmLEVBQXNCLEtBQUssTUFBM0IsRUFBbUMsS0FBbkMsRUFBMEMsTUFBMUMsQ0FIYSxDQUFmOztBQU1BLFdBQUssVUFBTCxDQUFnQixLQUFLLFdBQXJCLEVBQWtDLE1BQWxDLEVBQTBDLElBQTFDOztBQUVBLFdBQUssV0FBTCxHQUFtQixNQUFuQjtBQUNEOzs7K0JBRVUsSyxFQUFPLEcsRUFBSyxJLEVBQU07QUFBQSxnQ0FDRCxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEtBQWpCLEVBREM7QUFBQSxVQUNuQixLQURtQix1QkFDbkIsS0FEbUI7QUFBQSxVQUNaLE1BRFksdUJBQ1osTUFEWTs7QUFHM0IsVUFBTSxTQUFTO0FBQ2IsV0FBRyxRQUFRLENBREU7QUFFYixXQUFHLFNBQVM7QUFGQyxPQUFmO0FBSUEsVUFBTSxJQUFJLEdBQUcsZUFBSCxDQUFtQixLQUFuQixFQUEwQixHQUExQixDQUFWOztBQUVBLFVBQU0sWUFBWSxTQUFaLFNBQVksT0FBa0I7QUFBQTtBQUFBLFlBQWhCLENBQWdCO0FBQUEsWUFBYixDQUFhO0FBQUEsWUFBVixJQUFVOztBQUNsQyxZQUFNLFFBQVEsUUFBUSxJQUF0QjtBQUNBLFlBQU0sYUFBYSxPQUFPLENBQVAsR0FBVyxJQUFJLEtBQWxDO0FBQ0EsWUFBTSxhQUFhLE9BQU8sQ0FBUCxHQUFXLElBQUksS0FBbEM7QUFDQSw4QkFBb0IsVUFBcEIsU0FBa0MsVUFBbEMsZUFBc0QsS0FBdEQ7QUFDRCxPQUxEOztBQU9BLFNBQUcsTUFBSCxDQUFVLEtBQUssS0FBZixFQUNHLElBREgsQ0FDUSxXQURSLEVBQ3FCLFVBQVUsS0FBVixDQURyQixFQUVHLFVBRkgsR0FHRyxRQUhILENBR1ksRUFBRSxRQUhkLEVBSUcsU0FKSCxDQUlhLFdBSmIsRUFJMEI7QUFBQSxlQUFNLFVBQUMsQ0FBRDtBQUFBLGlCQUFPLFVBQVUsRUFBRSxDQUFGLENBQVYsQ0FBUDtBQUFBLFNBQU47QUFBQSxPQUoxQjtBQUtEOzs7NkJBRVE7QUFBQTs7QUFDUCxVQUFJLENBQUMsS0FBSyxLQUFMLENBQVcsS0FBaEIsRUFBdUI7QUFDckI7QUFDQSxlQUFPLElBQVA7QUFDRDs7QUFFRCxVQUFNLElBQUksS0FBSyxLQUFMLENBQVcsS0FBckI7O0FBRUEsVUFBTSxRQUFRLEVBQUUsS0FBRixHQUFVLEdBQVYsQ0FBYyxVQUFDLFFBQUQsRUFBYztBQUN4QyxZQUFNLElBQUksRUFBRSxJQUFGLENBQU8sUUFBUCxDQUFWO0FBQ0EsWUFBTSxRQUFRO0FBQ1osZUFBSyxRQURPO0FBRVosZ0JBQU0sQ0FGTTtBQUdaLG1CQUFTLE9BQUssV0FBTCxDQUFpQixJQUFqQjtBQUhHLFNBQWQ7O0FBTUEsWUFBTSxPQUFPLGFBQWEsQ0FBYixDQUFiOztBQUVBLGVBQU8sb0JBQUMsSUFBRCxFQUFVLEtBQVYsQ0FBUDtBQUNELE9BWGEsQ0FBZDs7QUFhQSxVQUFNLFFBQVEsRUFBRSxLQUFGLEdBQVUsR0FBVixDQUFjLFVBQUMsUUFBRCxFQUFjO0FBQ3hDLFlBQU0sSUFBSSxFQUFFLElBQUYsQ0FBTyxRQUFQLENBQVY7QUFDQSxlQUFPLG9CQUFDLElBQUQsSUFBTSxLQUFRLFNBQVMsQ0FBakIsVUFBdUIsU0FBUyxDQUF0QyxFQUEyQyxNQUFNLENBQWpELEdBQVA7QUFDRCxPQUhhLENBQWQ7O0FBckJPLHFCQTBCbUIsRUFBRSxLQUFGLEVBMUJuQjtBQUFBLFVBMEJDLEtBMUJELFlBMEJDLEtBMUJEO0FBQUEsVUEwQlEsTUExQlIsWUEwQlEsTUExQlI7O0FBNEJQLGFBQ0U7QUFBQTtBQUFBO0FBQ0UsZUFBSyxhQUFDLEVBQUQsRUFBUTtBQUNYLG1CQUFLLEdBQUwsR0FBVyxFQUFYO0FBQ0QsV0FISDtBQUlFLGNBQUcsZUFKTDtBQUtFLGlCQUFNLDRCQUxSO0FBTUUsbUJBQVEsS0FOVjtBQU9FLDRCQUFnQixLQUFoQixTQUF5QjtBQVAzQjtBQVNFO0FBQUE7QUFBQTtBQUNHLGFBQUcsWUFBSCxDQUFnQixZQUFZLGlCQUE1QixFQUErQyxPQUEvQyxFQUF3RCxVQUFDLEdBQUQsRUFBUztBQUNoRSxvQkFBUSxHQUFSLENBQVksR0FBWjtBQUNELFdBRkE7QUFESCxTQVRGO0FBY0U7QUFBQTtBQUFBO0FBQ0UsOEJBQUMsS0FBRDtBQURGLFNBZEY7QUFpQkU7QUFBQTtBQUFBO0FBQ0UsZ0JBQUcsT0FETDtBQUVFLGlCQUFLLGFBQUMsRUFBRCxFQUFRO0FBQ1gscUJBQUssS0FBTCxHQUFhLEVBQWI7QUFDRDtBQUpIO0FBTUU7QUFBQTtBQUFBLGNBQUcsSUFBRyxPQUFOO0FBQWU7QUFBZixXQU5GO0FBT0U7QUFBQTtBQUFBLGNBQUcsSUFBRyxPQUFOO0FBQWU7QUFBZjtBQVBGO0FBakJGLE9BREY7QUE2QkQ7Ozs7RUE5SXVCLE1BQU0sUzs7QUFpSmhDLElBQU0sUUFBUSxTQUFSLEtBQVE7QUFBQSxTQUNaO0FBQUE7QUFBQTtBQUNFLFVBQUcsT0FETDtBQUVFLGVBQVEsV0FGVjtBQUdFLFlBQUssSUFIUDtBQUlFLFlBQUssR0FKUDtBQUtFLG1CQUFZLGFBTGQ7QUFNRSxtQkFBWSxJQU5kO0FBT0Usb0JBQWEsS0FQZjtBQVFFLGNBQU87QUFSVDtBQVVFLGtDQUFNLEdBQUUsNkJBQVIsRUFBc0MsV0FBVSxPQUFoRDtBQVZGLEdBRFk7QUFBQSxDQUFkOztJQWVNLEk7OztBQU9KLGdCQUFZLEtBQVosRUFBbUI7QUFBQTs7QUFBQSw2R0FDWCxLQURXOztBQUFBLFdBTm5CLElBTW1CLEdBTlosR0FDSixJQURJLEdBRUosS0FGSSxDQUVFLEdBQUcsVUFGTCxFQUdKLENBSEksQ0FHRixVQUFDLENBQUQ7QUFBQSxhQUFPLEVBQUUsQ0FBVDtBQUFBLEtBSEUsRUFJSixDQUpJLENBSUYsVUFBQyxDQUFEO0FBQUEsYUFBTyxFQUFFLENBQVQ7QUFBQSxLQUpFLENBTVk7O0FBRWpCLFdBQUssS0FBTCxHQUFhO0FBQ1gsc0JBQWdCO0FBREwsS0FBYjtBQUZpQjtBQUtsQjs7OztxREFFZ0MsUyxFQUFXO0FBQzFDLFdBQUssUUFBTCxDQUFjO0FBQ1osd0JBQWdCLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0I7QUFEcEIsT0FBZDtBQUdEOzs7MEJBRUssTyxFQUFTO0FBQ2IsVUFBSSxPQUFKLEVBQWE7QUFDWCxnQkFBUSxZQUFSO0FBQ0Q7QUFDRjs7OzZCQUVRO0FBQ1AsVUFBSSxJQUFJLEtBQUssS0FBTCxDQUFXLElBQW5CO0FBQ0EsVUFBSSxJQUFJLEtBQUssSUFBYjtBQUNBLGFBQ0U7QUFBQTtBQUFBLFVBQUcsV0FBVSxNQUFiLEVBQW9CLFdBQVUsYUFBOUI7QUFDRTtBQUFBO0FBQUEsWUFBTSxHQUFHLEVBQUUsRUFBRSxNQUFKLENBQVQ7QUFDRTtBQUNFLGlCQUFLLEtBQUssS0FEWjtBQUVFLGlCQUFLLEtBQUssTUFBTCxFQUZQO0FBR0UscUJBQVEsUUFIVjtBQUlFLGtCQUFNLEVBQUUsS0FBSyxLQUFMLENBQVcsY0FBYixDQUpSO0FBS0UsZ0JBQUksRUFBRSxFQUFFLE1BQUosQ0FMTjtBQU1FLG1CQUFNLElBTlI7QUFPRSxpQkFBSSxPQVBOO0FBUUUsa0JBQUssUUFSUDtBQVNFLHlCQUFZLEdBVGQ7QUFVRSwyQkFBYztBQVZoQjtBQURGO0FBREYsT0FERjtBQWtCRDs7OztFQS9DZ0IsTUFBTSxTOztBQWtEekIsSUFBTSxlQUFlLFNBQWYsWUFBZSxDQUFDLENBQUQsRUFBTztBQUMxQixNQUFJLE9BQU8sSUFBWDtBQUNBLE1BQUksRUFBRSxVQUFGLEtBQWlCLElBQXJCLEVBQTJCO0FBQ3pCLFFBQUksRUFBRSxXQUFOLEVBQW1CO0FBQ2pCLGFBQU8saUJBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPLFFBQVA7QUFDRDtBQUNGLEdBTkQsTUFNTztBQUNMLFdBQU8sUUFBUDtBQUNEO0FBQ0QsU0FBTyxJQUFQO0FBQ0QsQ0FaRDs7QUFjQSxJQUFNLE9BQU8sU0FBUCxJQUFPLENBQUMsS0FBRCxFQUFXO0FBQ3RCLE1BQU0sSUFBSSxNQUFNLElBQWhCO0FBQ0EsTUFBTSxPQUFPLEVBQUUsVUFBRixHQUFlLFVBQWYsR0FBNEIsTUFBekM7O0FBRUEsTUFBTSxhQUFhLEtBQUssS0FBTCxDQUFXLEVBQUUsQ0FBRixHQUFNLEVBQUUsS0FBRixHQUFVLENBQTNCLENBQW5CO0FBQ0EsTUFBTSxhQUFhLEtBQUssS0FBTCxDQUFXLEVBQUUsQ0FBRixHQUFNLEVBQUUsTUFBRixHQUFXLENBQTVCLENBQW5COztBQUVBLFNBQ0U7QUFBQTtBQUFBO0FBQ0UsaUJBQWMsSUFBZCxTQUFzQixFQUFFO0FBQ3hCO0FBQ0E7QUFIRixRQUlFLDBCQUF3QixVQUF4QixTQUFzQyxVQUF0QztBQUpGO0FBTUU7QUFBQTtBQUFBLFFBQWUsT0FBTyxNQUFNLElBQU4sQ0FBVyxLQUFqQyxFQUF3QyxRQUFRLE1BQU0sSUFBTixDQUFXLE1BQTNEO0FBQ0U7QUFBQTtBQUFBO0FBQ0UsaUJBQU87QUFDTCxtQkFBTyxPQURGO0FBRUwscUJBQVMsTUFGSjtBQUdMLDJCQUFlLFFBSFY7QUFJTCx3QkFBWSxRQUpQO0FBS0wsNEJBQWdCLFFBTFg7QUFNTCxvQkFBUSxNQU5IO0FBT0wsbUJBQU8sTUFQRjtBQVFMLHNCQUFVLFFBUkw7QUFTTCwwQkFBYyxNQVRUO0FBVUwsNkJBQWlCLE1BQU0sSUFBTixDQUFXLEtBQVgsR0FDYixNQUFNLElBQU4sQ0FBVyxLQUFYLENBQWlCLElBREosR0FFYixTQVpDO0FBYUwsdUJBQVc7QUFiTjtBQURUO0FBaUJHLGNBQU07QUFqQlQ7QUFERjtBQU5GLEdBREY7QUE4QkQsQ0FyQ0Q7O0FBdUNBLElBQU0sV0FBVyxTQUFYLFFBQVcsQ0FBQyxLQUFEO0FBQUEsU0FDZjtBQUFDLFFBQUQ7QUFBVSxTQUFWO0FBQUE7QUFBQSxHQURlO0FBQUEsQ0FBakI7O0FBa0JBLElBQU0sb0JBQW9CLFNBQXBCLGlCQUFvQixDQUFDLEtBQUQ7QUFBQSxTQUN4QixvQkFBQyxJQUFELEVBQVUsS0FBVixDQUR3QjtBQUFBLENBQTFCOztBQWNBLElBQU0sV0FBVyxTQUFYLFFBQVcsQ0FBQyxLQUFEO0FBQUEsU0FDZjtBQUFDLFFBQUQ7QUFBVSxTQUFWO0FBQ0Usd0JBQUMsV0FBRCxJQUFhLE1BQU0sTUFBTSxJQUF6QjtBQURGLEdBRGU7QUFBQSxDQUFqQjs7QUFNQSxJQUFNLGNBQWMsU0FBZCxXQUFjLFFBQWM7QUFBQSxNQUFYLElBQVcsU0FBWCxJQUFXOztBQUNoQyxNQUFNLEtBQUssS0FBSyxlQUFoQjtBQUNBLE1BQUksQ0FBQyxLQUFLLGNBQUwsQ0FBb0IsWUFBcEIsQ0FBTCxFQUF3QztBQUN0QyxZQUFRLElBQVIsQ0FBYSxLQUFiLEVBQW9CLElBQXBCO0FBQ0EsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBTSxTQUNKLEtBQUssVUFBTCxDQUFnQixNQUFoQixLQUEyQixDQUEzQixHQUNFO0FBQUE7QUFBQTtBQUNFLGFBQU87QUFDTCxvQkFBWSxvQkFEUDtBQUVMLGtCQUFVLE9BRkw7QUFHTCxrQkFBVSxNQUhMO0FBSUwsZUFBTyxNQUpGO0FBS0wsb0JBQVksS0FMUDtBQU1MLHVCQUFlO0FBTlY7QUFEVDtBQVVFO0FBQUE7QUFBQTtBQUNFLGVBQU87QUFDTCwwQkFBZ0IsVUFEWDtBQUVMLGlCQUFPLE1BRkY7QUFHTCxzQkFBWTtBQUhQO0FBRFQ7QUFPRTtBQUFBO0FBQUE7QUFDRyxhQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsaUJBQWUsQ0FBZjtBQUFBO0FBQUEsY0FBRSxHQUFGO0FBQUEsY0FBTyxLQUFQOztBQUFBLGlCQUNuQjtBQUFBO0FBQUEsY0FBSSxLQUFLLEdBQVQ7QUFDRTtBQUFBO0FBQUE7QUFDRSx1QkFBTztBQUNMLGdDQUFjLFFBRFQ7QUFFTCw4QkFBWSxNQUZQO0FBR0wsNkJBQVc7QUFITjtBQURUO0FBT0c7QUFQSCxhQURGO0FBVUU7QUFBQTtBQUFBLGdCQUFJLE9BQU8sRUFBRSxhQUFhLFFBQWYsRUFBWDtBQUF1QztBQUF2QztBQVZGLFdBRG1CO0FBQUEsU0FBcEI7QUFESDtBQVBGO0FBVkYsR0FERixHQW9DSSxJQXJDTjs7QUF1Q0EsU0FDRTtBQUFDLFNBQUQsQ0FBTyxRQUFQO0FBQUE7QUFDRTtBQUFBO0FBQUE7QUFDRSxlQUFPO0FBQ0wsbUJBQVMsT0FESjtBQUVMLG1CQUFTLE1BRko7QUFHTCx5QkFBZSxRQUhWO0FBSUwsc0JBQVksUUFKUDtBQUtMLDBCQUFnQjtBQUxYO0FBRFQ7QUFTRyxZQUNDO0FBQUE7QUFBQSxVQUFLLFdBQVUsSUFBZixFQUFvQixPQUFPLEVBQUUsWUFBWSxNQUFkLEVBQTNCO0FBQ0c7QUFESCxPQVZKO0FBY0U7QUFBQTtBQUFBO0FBQU0sYUFBSztBQUFYO0FBZEYsS0FERjtBQWlCRztBQWpCSCxHQURGO0FBcUJELENBbkVEOzs7QUMvU0EsU0FBUyxHQUFULEdBQWU7QUFDYixXQUFTLE1BQVQsQ0FBZ0Isb0JBQUMsR0FBRCxPQUFoQixFQUF3QixTQUFTLGNBQVQsQ0FBd0IsUUFBeEIsQ0FBeEI7QUFDRDs7QUFFRCxJQUFNLGVBQWUsQ0FBQyxVQUFELEVBQWEsUUFBYixFQUF1QixhQUF2QixDQUFyQjs7QUFFQSxJQUFJLGFBQWEsUUFBYixDQUFzQixTQUFTLFVBQS9CLEtBQThDLFNBQVMsSUFBM0QsRUFBaUU7QUFDL0Q7QUFDRCxDQUZELE1BRU87QUFDTCxTQUFPLGdCQUFQLENBQXdCLGtCQUF4QixFQUE0QyxHQUE1QyxFQUFpRCxLQUFqRDtBQUNEIiwiZmlsZSI6ImJ1bmRsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIENvbG9ySGFzaFdyYXBwZXJ7XG4gICAgY29sb3JIYXNoID0gbmV3IENvbG9ySGFzaCh7XG4gICAgICAgIHNhdHVyYXRpb246IFswLjldLFxuICAgICAgICBsaWdodG5lc3M6IFswLjQ1XSxcbiAgICAgICAgaGFzaDogdGhpcy5tYWdpY1xuICAgIH0pXG5cbiAgICBjb2xvckhhc2ggPSBuZXcgQ29sb3JIYXNoKHtcbiAgICAgICAgc2F0dXJhdGlvbjogWzAuNSwgMC42LCAwLjddLFxuICAgICAgICBsaWdodG5lc3M6IFswLjQ1XSxcbiAgICB9KVxuXG4gICAgbG9zZUxvc2Uoc3RyKSB7XG4gICAgICAgIHZhciBoYXNoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGhhc2ggKz0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc2hcbiAgICB9XG5cbiAgICBtYWdpYyhzdHIpIHtcbiAgICAgICAgdmFyIGhhc2ggPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiA0NyArIHN0ci5jaGFyQ29kZUF0KGkpICUgMzI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc2hcbiAgICB9XG5cbiAgICBoZXgoc3RyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9ySGFzaC5oZXgoc3RyKVxuICAgIH1cbn0iLCJjbGFzcyBDb21wdXRhdGlvbmFsR3JhcGh7XG5cdG5vZGVDb3VudGVyID0ge31cblx0X25vZGVTdGFjayA9IFtdXG5cdF9wcmV2aW91c05vZGVTdGFjayA9IFtdXG5cblx0c2NvcGVTdGFjayA9IG5ldyBTY29wZVN0YWNrKClcblxuXHRtZXRhbm9kZXMgPSB7fVxuXHRtZXRhbm9kZVN0YWNrID0gW11cblxuXHRnZXQgZ3JhcGgoKSB7XG5cdFx0bGV0IGxhc3RJbmRleCA9IHRoaXMubWV0YW5vZGVTdGFja1t0aGlzLm1ldGFub2RlU3RhY2subGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuIHRoaXMubWV0YW5vZGVzW2xhc3RJbmRleF07XG5cdH1cblxuXHRnZXQgbm9kZVN0YWNrKCkge1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLm1ldGFub2RlU3RhY2tbdGhpcy5tZXRhbm9kZVN0YWNrLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiB0aGlzLl9ub2RlU3RhY2tbbGFzdEluZGV4XVxuXHR9XG5cblx0c2V0IG5vZGVTdGFjayh2YWx1ZSkge1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLm1ldGFub2RlU3RhY2tbdGhpcy5tZXRhbm9kZVN0YWNrLmxlbmd0aCAtIDFdO1xuXHRcdHRoaXMuX25vZGVTdGFja1tsYXN0SW5kZXhdID0gdmFsdWVcblx0fVxuXG5cdGdldCBwcmV2aW91c05vZGVTdGFjaygpIHtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5tZXRhbm9kZVN0YWNrW3RoaXMubWV0YW5vZGVTdGFjay5sZW5ndGggLSAxXTtcblx0XHRyZXR1cm4gdGhpcy5fcHJldmlvdXNOb2RlU3RhY2tbbGFzdEluZGV4XVxuXHR9XG5cblx0c2V0IHByZXZpb3VzTm9kZVN0YWNrKHZhbHVlKSB7XG5cdFx0bGV0IGxhc3RJbmRleCA9IHRoaXMubWV0YW5vZGVTdGFja1t0aGlzLm1ldGFub2RlU3RhY2subGVuZ3RoIC0gMV07XG5cdFx0dGhpcy5fcHJldmlvdXNOb2RlU3RhY2tbbGFzdEluZGV4XSA9IHZhbHVlXG5cdH1cblxuXHRjb25zdHJ1Y3RvcihwYXJlbnQpIHtcblx0XHR0aGlzLmluaXRpYWxpemUoKTtcblx0XHR0aGlzLm1vbmllbCA9IHBhcmVudDtcblx0fVxuXG5cdGluaXRpYWxpemUoKSB7XG5cdFx0dGhpcy5ub2RlQ291bnRlciA9IHt9XG5cdFx0dGhpcy5zY29wZVN0YWNrLmluaXRpYWxpemUoKTtcblx0XHR0aGlzLmNsZWFyTm9kZVN0YWNrKClcblxuXHRcdHRoaXMubm9kZVN0YWNrID0gW11cblx0XHR0aGlzLnByZXZpb3VzTm9kZVN0YWNrID0gW11cblxuXHRcdHRoaXMubWV0YW5vZGVzID0ge31cblx0XHR0aGlzLm1ldGFub2RlU3RhY2sgPSBbXVxuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJNZXRhbm9kZXM6XCIsIHRoaXMubWV0YW5vZGVzKVxuXHRcdC8vIGNvbnNvbGUubG9nKFwiTWV0YW5vZGUgU3RhY2s6XCIsIHRoaXMubWV0YW5vZGVTdGFjaylcblxuICAgICAgICB0aGlzLmFkZE1haW4oKTtcblx0fVxuXG5cdGVudGVyTWV0YW5vZGVTY29wZShuYW1lKSB7XG5cdFx0dGhpcy5tZXRhbm9kZXNbbmFtZV0gPSBuZXcgZ3JhcGhsaWIuR3JhcGgoe1xuXHRcdFx0Y29tcG91bmQ6IHRydWVcblx0XHR9KTtcblx0XHR0aGlzLm1ldGFub2Rlc1tuYW1lXS5zZXRHcmFwaCh7XG5cdFx0XHRuYW1lOiBuYW1lLFxuXHQgICAgICAgIHJhbmtkaXI6ICdCVCcsXG5cdCAgICAgICAgZWRnZXNlcDogMjAsXG5cdCAgICAgICAgcmFua3NlcDogNDAsXG5cdCAgICAgICAgbm9kZVNlcDogMzAsXG5cdCAgICAgICAgbWFyZ2lueDogMjAsXG5cdCAgICAgICAgbWFyZ2lueTogMjAsXG5cdFx0fSk7XG5cdFx0dGhpcy5tZXRhbm9kZVN0YWNrLnB1c2gobmFtZSk7XG5cdFx0Ly8gY29uc29sZS5sb2codGhpcy5tZXRhbm9kZVN0YWNrKVxuXG5cdFx0cmV0dXJuIHRoaXMubWV0YW5vZGVzW25hbWVdO1xuXHR9XG5cblx0ZXhpdE1ldGFub2RlU2NvcGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWV0YW5vZGVTdGFjay5wb3AoKTtcblx0fVxuXG5cdGdlbmVyYXRlSW5zdGFuY2VJZCh0eXBlKSB7XG5cdFx0aWYgKCF0aGlzLm5vZGVDb3VudGVyLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG5cdFx0XHR0aGlzLm5vZGVDb3VudGVyW3R5cGVdID0gMDtcblx0XHR9XG5cdFx0dGhpcy5ub2RlQ291bnRlclt0eXBlXSArPSAxO1xuXHRcdGxldCBpZCA9IFwiYV9cIiArIHR5cGUgKyB0aGlzLm5vZGVDb3VudGVyW3R5cGVdO1xuXHRcdHJldHVybiBpZDtcblx0fVxuXG5cdGFkZE1haW4oKSB7XG5cdFx0dGhpcy5lbnRlck1ldGFub2RlU2NvcGUoXCJtYWluXCIpO1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wdXNoKFwiLlwiKTtcblx0XHRsZXQgaWQgPSB0aGlzLnNjb3BlU3RhY2suY3VycmVudFNjb3BlSWRlbnRpZmllcigpO1xuXG5cdFx0dGhpcy5ncmFwaC5zZXROb2RlKGlkLCB7XG5cdFx0XHRjbGFzczogXCJcIlxuXHRcdH0pO1xuXHR9XG5cblx0dG91Y2hOb2RlKG5vZGVQYXRoKSB7XG5cdFx0Ly8gY29uc29sZS5sb2coYFRvdWNoaW5nIG5vZGUgXCIke25vZGVQYXRofVwiLmApXG5cdFx0aWYgKHRoaXMuZ3JhcGguaGFzTm9kZShub2RlUGF0aCkpIHtcblx0XHRcdHRoaXMubm9kZVN0YWNrLnB1c2gobm9kZVBhdGgpXG5cblx0XHRcdGlmICh0aGlzLnByZXZpb3VzTm9kZVN0YWNrLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHR0aGlzLnNldEVkZ2UodGhpcy5wcmV2aW91c05vZGVTdGFja1swXSwgbm9kZVBhdGgpXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucHJldmlvdXNOb2RlU3RhY2subGVuZ3RoID4gMSkge1xuXHRcdFx0XHR0aGlzLnNldEVkZ2UodGhpcy5wcmV2aW91c05vZGVTdGFjaywgbm9kZVBhdGgpXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUud2FybihgVHJ5aW5nIHRvIHRvdWNoIG5vbi1leGlzdGFudCBub2RlIFwiJHtub2RlUGF0aH1cImApO1xuXHRcdH1cblx0fVxuXG5cdHJlZmVyZW5jZU5vZGUoaWQpIHtcblx0XHR0aGlzLnNjb3BlU3RhY2sucHVzaChpZCk7XG5cdFx0bGV0IG5vZGVQYXRoID0gdGhpcy5zY29wZVN0YWNrLmN1cnJlbnRTY29wZUlkZW50aWZpZXIoKTtcblx0XHRsZXQgc2NvcGUgPSB0aGlzLnNjb3BlU3RhY2sucHJldmlvdXNTY29wZUlkZW50aWZpZXIoKTtcblxuXHRcdHZhciBub2RlID0ge1xuXHRcdFx0dXNlckdlbmVyYXRlZElkOiBpZCxcblx0XHRcdGNsYXNzOiBcInVuZGVmaW5lZFwiLFxuXHRcdFx0aGVpZ2h0OiA1MFxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5ncmFwaC5oYXNOb2RlKG5vZGVQYXRoKSkge1xuXHRcdFx0dGhpcy5ncmFwaC5zZXROb2RlKG5vZGVQYXRoLCB7XG5cdFx0XHRcdC4uLm5vZGUsXG5cdFx0XHRcdHdpZHRoOiBNYXRoLm1heChub2RlLmNsYXNzLmxlbmd0aCwgbm9kZS51c2VyR2VuZXJhdGVkSWQgPyBub2RlLnVzZXJHZW5lcmF0ZWRJZC5sZW5ndGggOiAwKSAqIDEwXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuc2V0UGFyZW50KG5vZGVQYXRoLCBzY29wZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy50b3VjaE5vZGUobm9kZVBhdGgpO1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcblx0fVxuXG5cdGNyZWF0ZU5vZGUoaWQsIG5vZGUpIHtcblx0XHR0aGlzLnNjb3BlU3RhY2sucHVzaChpZClcblx0XHRsZXQgbm9kZVBhdGggPSB0aGlzLnNjb3BlU3RhY2suY3VycmVudFNjb3BlSWRlbnRpZmllcigpXG5cdFx0bGV0IHNjb3BlID0gdGhpcy5zY29wZVN0YWNrLnByZXZpb3VzU2NvcGVJZGVudGlmaWVyKClcblxuXHRcdGlmICh0aGlzLmdyYXBoLmhhc05vZGUobm9kZVBhdGgpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYFJlZGVmaW5pbmcgbm9kZSBcIiR7aWR9XCJgKTtcdFxuXHRcdH1cblxuXHRcdHRoaXMuZ3JhcGguc2V0Tm9kZShub2RlUGF0aCwge1xuXHRcdFx0Li4ubm9kZSxcblx0XHRcdGlkOiBub2RlUGF0aFxuXHRcdH0pO1xuXHRcdHRoaXMuc2V0UGFyZW50KG5vZGVQYXRoLCBzY29wZSk7XG5cblx0XHR0aGlzLnRvdWNoTm9kZShub2RlUGF0aCk7XG5cdFx0dGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuXG5cdFx0cmV0dXJuIG5vZGVQYXRoO1xuXHR9XG5cblx0Y3JlYXRlTWV0YW5vZGUoaWRlbnRpZmllciwgbm9kZSkge1xuXHRcdGNvbnN0IG1ldGFub2RlQ2xhc3MgPSBub2RlLmNsYXNzXG5cdFx0dGhpcy5zY29wZVN0YWNrLnB1c2goaWRlbnRpZmllcilcblx0XHRsZXQgbm9kZVBhdGggPSB0aGlzLnNjb3BlU3RhY2suY3VycmVudFNjb3BlSWRlbnRpZmllcigpXG5cdFx0bGV0IHNjb3BlID0gdGhpcy5zY29wZVN0YWNrLnByZXZpb3VzU2NvcGVJZGVudGlmaWVyKClcblx0XHRcblx0XHR0aGlzLmdyYXBoLnNldE5vZGUobm9kZVBhdGgsIHtcblx0XHRcdC4uLm5vZGUsXG5cdFx0XHRpZDogbm9kZVBhdGgsXG5cdFx0XHRpc01ldGFub2RlOiB0cnVlXG5cdFx0fSk7XG5cblx0XHR0aGlzLmdyYXBoLnNldFBhcmVudChub2RlUGF0aCwgc2NvcGUpO1xuXG5cdFx0bGV0IHRhcmdldE1ldGFub2RlID0gdGhpcy5tZXRhbm9kZXNbbWV0YW5vZGVDbGFzc107XG5cdFx0dGFyZ2V0TWV0YW5vZGUubm9kZXMoKS5mb3JFYWNoKG5vZGVJZCA9PiB7XG5cdFx0XHRsZXQgbm9kZSA9IHRhcmdldE1ldGFub2RlLm5vZGUobm9kZUlkKTtcblx0XHRcdGlmICghbm9kZSkgeyByZXR1cm4gfVxuXHRcdFx0bGV0IG5ld05vZGVJZCA9IG5vZGVJZC5yZXBsYWNlKFwiLlwiLCBub2RlUGF0aCk7XG5cdFx0XHR2YXIgbmV3Tm9kZSA9IHtcblx0XHRcdFx0Li4ubm9kZSxcblx0XHRcdFx0aWQ6IG5ld05vZGVJZFxuXHRcdFx0fVxuXHRcdFx0dGhpcy5ncmFwaC5zZXROb2RlKG5ld05vZGVJZCwgbmV3Tm9kZSk7XG5cblx0XHRcdGxldCBuZXdQYXJlbnQgPSB0YXJnZXRNZXRhbm9kZS5wYXJlbnQobm9kZUlkKS5yZXBsYWNlKFwiLlwiLCBub2RlUGF0aCk7XG5cdFx0XHR0aGlzLmdyYXBoLnNldFBhcmVudChuZXdOb2RlSWQsIG5ld1BhcmVudCk7XG5cdFx0fSk7XG5cblx0XHR0YXJnZXRNZXRhbm9kZS5lZGdlcygpLmZvckVhY2goZWRnZSA9PiB7XG5cdFx0XHRjb25zdCBlID0gdGFyZ2V0TWV0YW5vZGUuZWRnZShlZGdlKVxuXHRcdFx0dGhpcy5ncmFwaC5zZXRFZGdlKGVkZ2Uudi5yZXBsYWNlKFwiLlwiLCBub2RlUGF0aCksIGVkZ2Uudy5yZXBsYWNlKFwiLlwiLCBub2RlUGF0aCksIHt9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcblxuXHRcdHRoaXMudG91Y2hOb2RlKG5vZGVQYXRoKTtcblx0fVxuXG5cdGNsZWFyTm9kZVN0YWNrKCkge1xuXHRcdHRoaXMucHJldmlvdXNOb2RlU3RhY2sgPSBbXVxuXHRcdHRoaXMubm9kZVN0YWNrID0gW11cblx0fVxuXG5cdGZyZWV6ZU5vZGVTdGFjaygpIHtcblx0XHR0aGlzLnByZXZpb3VzTm9kZVN0YWNrID0gWy4uLnRoaXMubm9kZVN0YWNrXVxuXHRcdHRoaXMubm9kZVN0YWNrID0gW11cblx0fVxuXG5cdHNldFBhcmVudChjaGlsZFBhdGgsIHBhcmVudFBhdGgpIHtcblx0XHRyZXR1cm4gdGhpcy5ncmFwaC5zZXRQYXJlbnQoY2hpbGRQYXRoLCBwYXJlbnRQYXRoKVxuXHR9XG5cblx0aXNJbnB1dChub2RlUGF0aCkge1xuXHRcdGNvbnN0IGlzQXZhaWxhYmxlID0gKHRoaXMuZ3JhcGguaW5FZGdlcyhub2RlUGF0aCkubGVuZ3RoID09PSAwKVxuXHRcdGNvbnN0IGlzSW5wdXQgPSAodGhpcy5ncmFwaC5ub2RlKG5vZGVQYXRoKS5jbGFzcyA9PT0gXCJJbnB1dFwiKVxuXHRcdGNvbnN0IGlzVW5kZWZpbmVkID0gKHRoaXMuZ3JhcGgubm9kZShub2RlUGF0aCkuY2xhc3MgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0cmV0dXJuIChpc0lucHV0IHx8IChpc1VuZGVmaW5lZCAmJiBpc0F2YWlsYWJsZSkpXG5cdH1cblxuXHRpc091dHB1dChub2RlUGF0aCkge1xuXHRcdGNvbnN0IGlzQXZhaWxhYmxlID0gKHRoaXMuZ3JhcGgub3V0RWRnZXMobm9kZVBhdGgpLmxlbmd0aCA9PT0gMClcblx0XHRjb25zdCBpc091dHB1dCA9ICh0aGlzLmdyYXBoLm5vZGUobm9kZVBhdGgpLmNsYXNzID09PSBcIk91dHB1dFwiKVxuXHRcdGNvbnN0IGlzVW5kZWZpbmVkID0gKHRoaXMuZ3JhcGgubm9kZShub2RlUGF0aCkuY2xhc3MgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0cmV0dXJuIChpc091dHB1dCB8fCAoaXNVbmRlZmluZWQgJiYgaXNBdmFpbGFibGUpKVxuXHR9XG5cblx0aXNNZXRhbm9kZShub2RlUGF0aCkge1xuXHRcdC8vIGNvbnNvbGUubG9nKFwiaXNNZXRhbm9kZTpcIiwgbm9kZVBhdGgpXG5cdFx0cmV0dXJuIHRoaXMuZ3JhcGgubm9kZShub2RlUGF0aCkuaXNNZXRhbm9kZSA9PT0gdHJ1ZVxuXHR9XG5cblx0Z2V0T3V0cHV0Tm9kZXMoc2NvcGVQYXRoKSB7XG5cdFx0bGV0IHNjb3BlID0gdGhpcy5ncmFwaC5ub2RlKHNjb3BlUGF0aClcblx0XHRsZXQgb3V0cHV0Tm9kZXMgPSB0aGlzLmdyYXBoLmNoaWxkcmVuKHNjb3BlUGF0aCkuZmlsdGVyKG5vZGUgPT4gdGhpcy5pc091dHB1dChub2RlKSlcblxuXHRcdGlmIChvdXRwdXROb2Rlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsXG5cdFx0XHR0aGlzLm1vbmllbC5sb2dnZXIuYWRkSXNzdWUoe1xuXHRcdFx0XHRtZXNzYWdlOiBgTWV0YW5vZGUgXCIke3Njb3BlLmlkfVwiIGRvZXNuJ3QgaGF2ZSBhbnkgT3V0cHV0IG5vZGUuYCxcblx0XHRcdFx0dHlwZTogXCJlcnJvclwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdHN0YXJ0OiBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5zdGFydElkeCA6IDAsXG5cdFx0XHRcdFx0ZW5kOiBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5lbmRJZHggOiAwXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG51bGxcblx0XHR9IGVsc2UgaWYgKG91dHB1dE5vZGVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmdyYXBoLm5vZGUob3V0cHV0Tm9kZXNbMF0pLmlzTWV0YW5vZGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldE91dHB1dE5vZGVzKG91dHB1dE5vZGVzWzBdKVxuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXROb2Rlc1xuXHR9XG5cblx0Z2V0SW5wdXROb2RlcyhzY29wZVBhdGgpIHtcblx0XHRjb25zb2xlLmxvZyhzY29wZVBhdGgpXG5cdFx0bGV0IHNjb3BlID0gdGhpcy5ncmFwaC5ub2RlKHNjb3BlUGF0aClcblx0XHRsZXQgaW5wdXROb2RlcyA9IHRoaXMuZ3JhcGguY2hpbGRyZW4oc2NvcGVQYXRoKS5maWx0ZXIobm9kZSA9PiB0aGlzLmlzSW5wdXQobm9kZSkpXG5cdFx0Y29uc29sZS5sb2coaW5wdXROb2RlcylcblxuXHRcdGlmIChpbnB1dE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGxcblx0XHRcdHRoaXMubW9uaWVsLmxvZ2dlci5hZGRJc3N1ZSh7XG5cdFx0XHRcdG1lc3NhZ2U6IGBNZXRhbm9kZSBcIiR7c2NvcGUuaWR9XCIgZG9lc24ndCBoYXZlIGFueSBJbnB1dCBub2Rlcy5gLFxuXHRcdFx0XHR0eXBlOiBcImVycm9yXCIsXG5cdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0c3RhcnQ6IHNjb3BlLl9zb3VyY2UgPyBzY29wZS5fc291cmNlLnN0YXJ0SWR4IDogMCxcblx0XHRcdFx0XHRlbmQ6ICBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5lbmRJZHggOiAwXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdH0gZWxzZSBpZiAoaW5wdXROb2Rlcy5sZW5ndGggPT09IDEgJiYgdGhpcy5ncmFwaC5ub2RlKGlucHV0Tm9kZXNbMF0pLmlzTWV0YW5vZGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldElucHV0Tm9kZXMoaW5wdXROb2Rlc1swXSlcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5wdXROb2Rlc1xuXHR9XG5cblx0c2V0RWRnZShmcm9tUGF0aCwgdG9QYXRoKSB7XG5cdFx0Y29uc29sZS5pbmZvKGBDcmVhdGluZyBlZGdlIGZyb20gXCIke2Zyb21QYXRofVwiIHRvIFwiJHt0b1BhdGh9XCIuYClcblx0XHR2YXIgc291cmNlUGF0aHNcblxuXHRcdGlmICh0eXBlb2YgZnJvbVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGlmICh0aGlzLmlzTWV0YW5vZGUoZnJvbVBhdGgpKSB7XG5cdFx0XHRcdHNvdXJjZVBhdGhzID0gdGhpcy5nZXRPdXRwdXROb2Rlcyhmcm9tUGF0aClcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNvdXJjZVBhdGhzID0gW2Zyb21QYXRoXVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmcm9tUGF0aCkpIHtcblx0XHRcdHNvdXJjZVBhdGhzID0gZnJvbVBhdGhcblx0XHR9XG5cblx0XHR2YXIgdGFyZ2V0UGF0aHNcblxuXHRcdGlmICh0eXBlb2YgdG9QYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAodGhpcy5pc01ldGFub2RlKHRvUGF0aCkpIHtcblx0XHRcdFx0dGFyZ2V0UGF0aHMgPSB0aGlzLmdldElucHV0Tm9kZXModG9QYXRoKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFyZ2V0UGF0aHMgPSBbdG9QYXRoXVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0b1BhdGgpKSB7XG5cdFx0XHR0YXJnZXRQYXRocyA9IHRvUGF0aFxuXHRcdH1cblxuXHRcdHRoaXMuc2V0TXVsdGlFZGdlKHNvdXJjZVBhdGhzLCB0YXJnZXRQYXRocylcblx0fVxuXG5cdHNldE11bHRpRWRnZShzb3VyY2VQYXRocywgdGFyZ2V0UGF0aHMpIHtcblxuXHRcdGlmIChzb3VyY2VQYXRocyA9PT0gbnVsbCB8fCB0YXJnZXRQYXRocyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0aWYgKHNvdXJjZVBhdGhzLmxlbmd0aCA9PT0gdGFyZ2V0UGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChzb3VyY2VQYXRoc1tpXSAmJiB0YXJnZXRQYXRoc1tpXSkge1xuXHRcdFx0XHRcdHRoaXMuZ3JhcGguc2V0RWRnZShzb3VyY2VQYXRoc1tpXSwgdGFyZ2V0UGF0aHNbaV0sIHt9KTtcdFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0YXJnZXRQYXRocy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0c291cmNlUGF0aHMuZm9yRWFjaChzb3VyY2VQYXRoID0+IHRoaXMuc2V0RWRnZShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoc1swXSkpXG5cdFx0XHR9IGVsc2UgaWYgKHNvdXJjZVBhdGhzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHR0YXJnZXRQYXRocy5mb3JFYWNoKHRhcmdldFBhdGggPT4gdGhpcy5zZXRFZGdlKHNvdXJjZVBhdGhzWzBdLCB0YXJnZXRQYXRoLCkpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLm1vbmllbC5sb2dnZXIuYWRkSXNzdWUoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IGBOdW1iZXIgb2Ygbm9kZXMgZG9lcyBub3QgbWF0Y2guIFske3NvdXJjZVBhdGhzLmxlbmd0aH1dIC0+IFske3RhcmdldFBhdGhzLmxlbmd0aH1dYCxcblx0XHRcdFx0XHR0eXBlOiBcImVycm9yXCIsXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdC8vIHN0YXJ0OiBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5zdGFydElkeCA6IDAsXG5cdFx0XHRcdFx0XHQvLyBlbmQ6ICBzY29wZS5fc291cmNlID8gc2NvcGUuX3NvdXJjZS5lbmRJZHggOiAwXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0fVxuXG5cdGhhc05vZGUobm9kZVBhdGgpIHtcblx0XHRyZXR1cm4gdGhpcy5ncmFwaC5oYXNOb2RlKG5vZGVQYXRoKTtcblx0fVxuXG5cdGdldEdyYXBoKCkge1xuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMuZ3JhcGgpXG5cdFx0cmV0dXJuIHRoaXMuZ3JhcGg7XG5cdH1cblxuXHRnZXRNZXRhbm9kZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWV0YW5vZGVzXG5cdH1cbn0iLCJjbGFzcyBFZGl0b3IgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnR7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtlciA9IG51bGw7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnJlbW92ZU1hcmtlcnMoKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIHJlbW92ZU1hcmtlcnMoKSB7XG4gICAgICAgIHRoaXMubWFya2Vycy5tYXAobWFya2VyID0+IHRoaXMuZWRpdG9yLnNlc3Npb24ucmVtb3ZlTWFya2VyKG1hcmtlcikpO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBvbkN1cnNvclBvc2l0aW9uQ2hhbmdlZChldmVudCwgc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBtID0gdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRNYXJrZXJzKCk7XG4gICAgICAgIGxldCBjID0gc2VsZWN0aW9uLmdldEN1cnNvcigpO1xuICAgICAgICBsZXQgbWFya2VycyA9IHRoaXMubWFya2Vycy5tYXAoaWQgPT4gbVtpZF0pO1xuICAgICAgICBsZXQgY3Vyc29yT3Zlck1hcmtlciA9IG1hcmtlcnMubWFwKG1hcmtlciA9PiBtYXJrZXIucmFuZ2UuY29udGFpbnMoYy5yb3csIGMuY29sdW1uKSkucmVkdWNlKCAocHJldiwgY3VycikgPT4gcHJldiB8fCBjdXJyLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGN1cnNvck92ZXJNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmV4ZWNDb21tYW5kKFwiZ29Ub05leHRFcnJvclwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoXCJhY2UvbW9kZS9cIiArIHRoaXMucHJvcHMubW9kZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL1wiICsgdGhpcy5wcm9wcy50aGVtZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldE9wdGlvbnMoe1xuICAgICAgICAgICAgZW5hYmxlQmFzaWNBdXRvY29tcGxldGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZVNuaXBwZXRzOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlTGl2ZUF1dG9jb21wbGV0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHdyYXA6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc6IHRydWUsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkZpcmEgQ29kZVwiLFxuICAgICAgICAgICAgc2hvd0xpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgc2hvd0d1dHRlcjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZGl0b3IuJGJsb2NrU2Nyb2xsaW5nID0gSW5maW5pdHk7XG4gICAgICAgIHRoaXMuZWRpdG9yLmNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gMS43O1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZSl7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZSwgLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgdGhpcy5vbkNoYW5nZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNlbGVjdGlvbi5vbihcImNoYW5nZUN1cnNvclwiLCB0aGlzLm9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBpZiAobmV4dFByb3BzLmlzc3Vlcykge1xuICAgICAgICAgICAgdmFyIGFubm90YXRpb25zID0gbmV4dFByb3BzLmlzc3Vlcy5tYXAoaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuZWRpdG9yLnNlc3Npb24uZG9jLmluZGV4VG9Qb3NpdGlvbihpc3N1ZS5wb3NpdGlvbi5zdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcm93OiBwb3NpdGlvbi5yb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zaXRpb24uY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpc3N1ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpc3N1ZS50eXBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgLy90aGlzLmVkaXRvci5leGVjQ29tbWFuZChcImdvVG9OZXh0RXJyb3JcIik7XG5cbiAgICAgICAgICAgIHZhciBSYW5nZSA9IHJlcXVpcmUoJ2FjZS9yYW5nZScpLlJhbmdlO1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU1hcmtlcnMoKTtcblxuICAgICAgICAgICAgdmFyIG1hcmtlcnMgPSBuZXh0UHJvcHMuaXNzdWVzLm1hcChpc3N1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5lZGl0b3Iuc2Vzc2lvbi5kb2MuaW5kZXhUb1Bvc2l0aW9uKGlzc3VlLnBvc2l0aW9uLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLmVkaXRvci5zZXNzaW9uLmRvYy5pbmRleFRvUG9zaXRpb24oaXNzdWUucG9zaXRpb24uZW5kKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IG5ldyBSYW5nZShwb3NpdGlvbi5zdGFydC5yb3csIHBvc2l0aW9uLnN0YXJ0LmNvbHVtbiwgcG9zaXRpb24uZW5kLnJvdywgcG9zaXRpb24uZW5kLmNvbHVtbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaCh0aGlzLmVkaXRvci5zZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgXCJtYXJrZXJfZXJyb3JcIiwgXCJ0ZXh0XCIpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5leGVjQ29tbWFuZChcImdvVG9OZXh0RXJyb3JcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZShuZXh0UHJvcHMudmFsdWUsIC0xKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgcmVmPXsgKGVsZW1lbnQpID0+IHRoaXMuaW5pdChlbGVtZW50KSB9PjwvZGl2PjtcbiAgICB9XG59IiwiY2xhc3MgR3JhcGhMYXlvdXR7XG5cdGFjdGl2ZVdvcmtlcnMgPSB7fVxuXHRjdXJyZW50V29ya2VySWQgPSAwXG5cdGxhc3RGaW5pc2hlZFdvcmtlcklkID0gMFxuXHRjYWxsYmFjayA9IGZ1bmN0aW9uKCl7fVxuXG5cdGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG5cdFx0dGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG5cdH1cblxuXHRsYXlvdXQoZ3JhcGgpIHtcblx0XHRjb25zdCBpZCA9IHRoaXMuZ2V0V29ya2VySWQoKVxuXHRcdHRoaXMuYWN0aXZlV29ya2Vyc1tpZF0gPSBuZXcgTGF5b3V0V29ya2VyKGlkLCBncmFwaCwgdGhpcy53b3JrZXJGaW5pc2hlZC5iaW5kKHRoaXMpKVxuXHR9XG5cblx0d29ya2VyRmluaXNoZWQoe2lkLCBncmFwaH0pIHtcblx0XHRpZiAoaWQgPj0gdGhpcy5sYXN0RmluaXNoZWRXb3JrZXJJZCkge1xuXHRcdFx0dGhpcy5sYXN0RmluaXNoZWRXb3JrZXJJZCA9IGlkXG5cdFx0XHR0aGlzLmNhbGxiYWNrKGdyYXBoKVxuXHRcdH1cblx0fVxuXG5cdGdldFdvcmtlcklkKCkge1xuXHRcdHRoaXMuY3VycmVudFdvcmtlcklkICs9IDFcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50V29ya2VySWRcblx0fVxufVxuXG5jbGFzcyBMYXlvdXRXb3JrZXJ7XG5cdGlkID0gMFxuXHR3b3JrZXIgPSBudWxsXG5cdGNvbnN0cnVjdG9yKGlkLCBncmFwaCwgb25GaW5pc2hlZCkge1xuXHRcdHRoaXMuaWQgPSBpZFxuXHRcdHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihcInNyYy9zY3JpcHRzL0dyYXBoTGF5b3V0V29ya2VyLmpzXCIpXG5cdFx0dGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5yZWNlaXZlLmJpbmQodGhpcykpXG5cdFx0dGhpcy5vbkZpbmlzaGVkID0gb25GaW5pc2hlZFxuXHRcdFxuXHRcdHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHRoaXMuZW5jb2RlKGdyYXBoKSlcblx0fVxuXHRyZWNlaXZlKG1lc3NhZ2UpIHtcblx0XHR0aGlzLndvcmtlci50ZXJtaW5hdGUoKVxuXHRcdHRoaXMub25GaW5pc2hlZCh7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGdyYXBoOiB0aGlzLmRlY29kZShtZXNzYWdlLmRhdGEpXG5cdFx0fSlcblx0fVxuXHRlbmNvZGUoZ3JhcGgpIHtcblx0XHRyZXR1cm4gZ3JhcGhsaWIuanNvbi53cml0ZShncmFwaClcbiAgICB9XG5cbiAgICBkZWNvZGUoanNvbikge1xuXHRcdHJldHVybiBncmFwaGxpYi5qc29uLnJlYWQoanNvbilcbiAgICB9XG59IiwiY29uc3QgaXBjID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLmlwY1JlbmRlcmVyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKVxuXG5jbGFzcyBJREUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnR7XG5cdHBhcnNlciA9IG5ldyBQYXJzZXIoKVxuXHRpbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcigpXG5cdGdlbmVyYXRvciA9IG5ldyBQeVRvcmNoR2VuZXJhdG9yKClcblxuXHRsb2NrID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKHByb3BzKSB7XG5cdFx0c3VwZXIocHJvcHMpO1xuXG5cdFx0dGhpcy5zdGF0ZSA9IHtcblx0XHRcdC8vIHRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGhlcmVcblx0XHRcdC8vIFwiZ3JhbW1hclwiOiB0aGlzLnBhcnNlci5ncmFtbWFyLFxuXHRcdFx0Ly8gXCJzZW1hbnRpY3NcIjogdGhpcy5wYXJzZXIuc2VtYW50aWNzLFxuXHRcdFx0XCJuZXR3b3JrRGVmaW5pdGlvblwiOiBcIlwiLFxuXHRcdFx0XCJhc3RcIjogbnVsbCxcblx0XHRcdFwiaXNzdWVzXCI6IG51bGwsXG5cdFx0XHRcImxheW91dFwiOiBcImNvbHVtbnNcIixcblx0XHRcdFwiZ2VuZXJhdGVkQ29kZVwiOiBcIlwiXG5cdFx0fTtcblxuXHRcdGlwYy5vbignc2F2ZScsIGZ1bmN0aW9uKGV2ZW50LCBtZXNzYWdlKSB7XG5cdFx0XHRmcy53cml0ZUZpbGUobWVzc2FnZS5mb2xkZXIgKyBcIi9zb3VyY2UubW9uXCIsIHRoaXMuc3RhdGUubmV0d29ya0RlZmluaXRpb24sIGZ1bmN0aW9uKGVycikge1xuXHRcdFx0ICBpZiAoZXJyKSB0aHJvdyBlcnJzXG5cdFx0XHR9KTtcblx0XHRcdGZzLndyaXRlRmlsZShtZXNzYWdlLmZvbGRlciArIFwiL3NvdXJjZS5hc3QuanNvblwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRlLmFzdCwgbnVsbCwgMiksIGZ1bmN0aW9uKGVycikge1xuXHRcdFx0ICBpZiAoZXJyKSB0aHJvdyBlcnJzXG5cdFx0XHR9KTtcblx0XHRcdGZzLndyaXRlRmlsZShtZXNzYWdlLmZvbGRlciArIFwiL2dyYXBoLnN2Z1wiLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpLm91dGVySFRNTCwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXHRcdFx0ZnMud3JpdGVGaWxlKG1lc3NhZ2UuZm9sZGVyICsgXCIvZ3JhcGguanNvblwiLCBKU09OLnN0cmluZ2lmeShkYWdyZS5ncmFwaGxpYi5qc29uLndyaXRlKHRoaXMuc3RhdGUuZ3JhcGgpLCBudWxsLCAyKSwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXHRcdFx0ZnMud3JpdGVGaWxlKG1lc3NhZ2UuZm9sZGVyICsgXCIvaGFsZi1hc3NlZF9qb2tlLnB5XCIsIHRoaXMuc3RhdGUuZ2VuZXJhdGVkQ29kZSwgZnVuY3Rpb24oZXJyKSB7XG5cdFx0XHQgIGlmIChlcnIpIHRocm93IGVycnNcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgc2F2ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oJ1NrZXRjaCBzYXZlZCcsIHtcblx0XHRcdFx0Ym9keTogYENsaWNrIHRvIG9wZW4gc2F2ZWQgc2tldGNoLmAsXG5cdFx0XHRcdHNpbGVudDogdHJ1ZSxcblx0XHRcdH0pXG5cdFx0XHRjb25zdCB7IHNoZWxsIH0gPSByZXF1aXJlKCdlbGVjdHJvbicpXG5cdFx0XHRcblx0XHRcdHNhdmVOb3RpZmljYXRpb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0c2hlbGwuc2hvd0l0ZW1JbkZvbGRlcihtZXNzYWdlLmZvbGRlcilcblx0XHRcdH1cblx0XHR9LmJpbmQodGhpcykpO1xuXG5cdFx0aXBjLm9uKFwidG9nZ2xlTGF5b3V0XCIsIChlLCBtKSA9PiB7XG5cdFx0XHR0aGlzLnRvZ2dsZUxheW91dCgpXG5cdFx0fSk7XG5cblx0XHRpcGMub24oXCJvcGVuXCIsIChlLCBtKSA9PiB7XG5cdFx0XHR0aGlzLm9wZW5GaWxlKG0uZmlsZVBhdGgpXG5cdFx0fSlcblxuXHRcdGxldCBsYXlvdXQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYXlvdXRcIilcblx0XHRpZiAobGF5b3V0KSB7XG5cdFx0XHRpZiAobGF5b3V0ID09IFwiY29sdW1uc1wiIHx8IGxheW91dCA9PSBcInJvd3NcIikge1xuXHRcdFx0XHR0aGlzLnN0YXRlLmxheW91dCA9IGxheW91dFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5pbnRlcnByZXRlci5sb2dnZXIuYWRkSXNzdWUoe1xuXHRcdFx0XHRcdHR5cGU6IFwid2FybmluZ1wiLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBWYWx1ZSBmb3IgXCJsYXlvdXRcIiBjYW4gYmUgb25seSBcImNvbHVtbnNcIiBvciBcInJvd3NcIi5gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlTmV0d29ya0RlZmluaXRpb24gPSB0aGlzLnVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5kZWxheWVkVXBkYXRlTmV0d29ya0RlZmluaXRpb24gPSB0aGlzLmRlbGF5ZWRVcGRhdGVOZXR3b3JrRGVmaW5pdGlvbi5iaW5kKHRoaXMpO1xuXHR9XG5cblx0b3BlbkZpbGUoZmlsZVBhdGgpIHtcblx0XHRjb25zb2xlLmxvZyhcIm9wZW5GaWxlXCIsIGZpbGVQYXRoKVxuXHRcdGxldCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGY4XCIpXG5cdFx0dGhpcy5lZGl0b3Iuc2V0VmFsdWUoZmlsZUNvbnRlbnQpIC8vIHRoaXMgaGFzIHRvIGJlIGhlcmUsIEkgZG9uJ3Qga25vdyB3aHlcblx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdG5ldHdvcmtEZWZpbml0aW9uOiBmaWxlQ29udGVudFxuXHRcdH0pXG5cdH1cblxuXHRsb2FkRXhhbXBsZShpZCkge1xuXHRcdGxldCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhgJHtfX2Rpcm5hbWV9L2V4YW1wbGVzLyR7aWR9Lm1vbmAsIFwidXRmOFwiKVxuXHRcdHRoaXMuZWRpdG9yLnNldFZhbHVlKGZpbGVDb250ZW50KSAvLyB0aGlzIGhhcyB0byBiZSBoZXJlLCBJIGRvbid0IGtub3cgd2h5XG5cdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRuZXR3b3JrRGVmaW5pdGlvbjogZmlsZUNvbnRlbnRcblx0XHR9KVxuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy5sb2FkRXhhbXBsZShcIkNvbnZvbHV0aW9uYWxMYXllclwiKVxuXHR9XG5cblx0ZGVsYXllZFVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMubG9jaykgeyBjbGVhclRpbWVvdXQodGhpcy5sb2NrKTsgfVxuXHRcdHRoaXMubG9jayA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKTsgfSwgMTAwKTtcblx0fVxuXG5cdHVwZGF0ZU5ldHdvcmtEZWZpbml0aW9uKHZhbHVlKXtcblx0XHRjb25zb2xlLnRpbWUoXCJ1cGRhdGVOZXR3b3JrRGVmaW5pdGlvblwiKTtcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZXIubWFrZSh2YWx1ZSlcblxuXHRcdGlmIChyZXN1bHQuYXN0KSB7XG5cdFx0XHR0aGlzLmludGVycHJldGVyLmV4ZWN1dGUocmVzdWx0LmFzdClcblx0XHRcdGxldCBncmFwaCA9IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0Q29tcHV0YXRpb25hbEdyYXBoKClcblx0XHRcdGxldCBkZWZpbml0aW9ucyA9IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0TWV0YW5vZGVzRGVmaW5pdGlvbnMoKVxuXHRcdFx0Ly9jb25zb2xlLmxvZyhkZWZpbml0aW9ucylcblxuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdG5ldHdvcmtEZWZpbml0aW9uOiB2YWx1ZSxcblx0XHRcdFx0YXN0OiByZXN1bHQuYXN0LFxuXHRcdFx0XHRncmFwaDogZ3JhcGgsXG5cdFx0XHRcdGdlbmVyYXRlZENvZGU6IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ29kZShncmFwaCwgZGVmaW5pdGlvbnMpLFxuXHRcdFx0XHRpc3N1ZXM6IHRoaXMuaW50ZXJwcmV0ZXIuZ2V0SXNzdWVzKClcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKHJlc3VsdCk7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0bmV0d29ya0RlZmluaXRpb246IHZhbHVlLFxuXHRcdFx0XHRhc3Q6IG51bGwsXG5cdFx0XHRcdGdyYXBoOiBudWxsLFxuXHRcdFx0XHRpc3N1ZXM6IFt7XG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHN0YXJ0OiByZXN1bHQucG9zaXRpb24gLSAxLFxuXHRcdFx0XHRcdFx0ZW5kOiByZXN1bHQucG9zaXRpb25cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IFwiRXhwZWN0ZWQgXCIgKyByZXN1bHQuZXhwZWN0ZWQgKyBcIi5cIixcblx0XHRcdFx0XHR0eXBlOiBcImVycm9yXCJcblx0XHRcdFx0fV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zb2xlLnRpbWVFbmQoXCJ1cGRhdGVOZXR3b3JrRGVmaW5pdGlvblwiKTtcblx0fVxuXG5cdHRvZ2dsZUxheW91dCgpIHtcblx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdGxheW91dDogKHRoaXMuc3RhdGUubGF5b3V0ID09PSBcImNvbHVtbnNcIikgPyBcInJvd3NcIiA6IFwiY29sdW1uc1wiXG5cdFx0fSlcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2l6ZVwiKSlcblx0XHR9LCAxMDApXG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0bGV0IGNvbnRhaW5lckxheW91dCA9IHRoaXMuc3RhdGUubGF5b3V0XG5cdFx0bGV0IGdyYXBoTGF5b3V0ID0gdGhpcy5zdGF0ZS5sYXlvdXQgPT09IFwiY29sdW1uc1wiID8gXCJCVFwiIDogXCJMUlwiXG5cbiAgICBcdHJldHVybiA8ZGl2IGlkPVwiY29udGFpbmVyXCIgY2xhc3NOYW1lPXtgY29udGFpbmVyICR7Y29udGFpbmVyTGF5b3V0fWB9PlxuICAgIFx0XHQ8UGFuZWwgaWQ9XCJkZWZpbml0aW9uXCI+XG4gICAgXHRcdFx0PEVkaXRvclxuICAgIFx0XHRcdFx0cmVmPXsocmVmKSA9PiB0aGlzLmVkaXRvciA9IHJlZn1cbiAgICBcdFx0XHRcdG1vZGU9XCJtb25pZWxcIlxuICAgIFx0XHRcdFx0dGhlbWU9XCJtb25va2FpXCJcbiAgICBcdFx0XHRcdGlzc3Vlcz17dGhpcy5zdGF0ZS5pc3N1ZXN9XG4gICAgXHRcdFx0XHRvbkNoYW5nZT17dGhpcy5kZWxheWVkVXBkYXRlTmV0d29ya0RlZmluaXRpb259XG4gICAgXHRcdFx0XHRkZWZhdWx0VmFsdWU9e3RoaXMuc3RhdGUubmV0d29ya0RlZmluaXRpb259XG4gICAgXHRcdFx0Lz5cbiAgICBcdFx0PC9QYW5lbD5cbiAgICBcdFx0XG4gICAgXHRcdDxQYW5lbCBpZD1cInZpc3VhbGl6YXRpb25cIj5cbiAgICBcdFx0XHQ8VmlzdWFsR3JhcGggZ3JhcGg9e3RoaXMuc3RhdGUuZ3JhcGh9IGxheW91dD17Z3JhcGhMYXlvdXR9IC8+XG4gICAgXHRcdDwvUGFuZWw+XG5cblx0XHRcdHsvKlxuXHRcdFx0PFBhbmVsIHRpdGxlPVwiR2VuZXJhdGVkIENvZGVcIj5cbiAgICBcdFx0XHQ8RWRpdG9yXG4gICAgXHRcdFx0XHRtb2RlPVwicHl0aG9uXCJcbiAgICBcdFx0XHRcdHRoZW1lPVwibW9ub2thaVwiXG4gICAgXHRcdFx0XHR2YWx1ZT17dGhpcy5zdGF0ZS5nZW5lcmF0ZWRDb2RlfVxuICAgIFx0XHRcdC8+XG4gICAgXHRcdDwvUGFuZWw+XG5cdFx0XHQqL31cblxuICAgIFx0XHR7LypcbiAgICBcdFx0PFBhbmVsIHRpdGxlPVwiQVNUXCI+XG4gICAgXHRcdFx0PEVkaXRvclxuICAgIFx0XHRcdFx0bW9kZT1cImpzb25cIlxuICAgIFx0XHRcdFx0dGhlbWU9XCJtb25va2FpXCJcbiAgICBcdFx0XHRcdHZhbHVlPXtKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRlLmFzdCwgbnVsbCwgMil9XG4gICAgXHRcdFx0Lz5cbiAgICBcdFx0PC9QYW5lbD5cbiAgICBcdCovfVxuICAgIFx0XHRcbiAgICBcdDwvZGl2PjtcbiAgXHR9XG59IiwiLypcblx0VGhpcyBjb2RlIGlzIGEgbWVzcy5cbiovXG5cbmNvbnN0IHBpeGVsV2lkdGggPSByZXF1aXJlKCdzdHJpbmctcGl4ZWwtd2lkdGgnKVxuXG5jbGFzcyBJbnRlcnByZXRlciB7XG5cdC8vIG1heWJlIHNpbmdsZXRvbj9cblx0bG9nZ2VyID0gbmV3IExvZ2dlcigpXG5cdGdyYXBoID0gbmV3IENvbXB1dGF0aW9uYWxHcmFwaCh0aGlzKVxuXG5cdC8vIHRvbyBzb29uLCBzaG91bGQgYmUgaW4gVmlzdWFsR3JhcGhcblx0Y29sb3JIYXNoID0gbmV3IENvbG9ySGFzaFdyYXBwZXIoKVxuXG5cdGRlZmluaXRpb25zID0ge307XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5pbml0aWFsaXplKCk7XG5cdH1cblxuXHRpbml0aWFsaXplKCkge1xuXHRcdHRoaXMuZ3JhcGguaW5pdGlhbGl6ZSgpO1xuXHRcdHRoaXMubG9nZ2VyLmNsZWFyKCk7XG5cblx0XHR0aGlzLmRlZmluaXRpb25zID0gW107XG5cdFx0dGhpcy5hZGREZWZhdWx0RGVmaW5pdGlvbnMoKTtcblx0XHR0aGlzLmRlcHRoID0gMFxuXHR9XG5cblx0YWRkRGVmYXVsdERlZmluaXRpb25zKCkge1xuXHRcdC8vIGNvbnNvbGUuaW5mbyhgQWRkaW5nIGRlZmF1bHQgZGVmaW5pdGlvbnMuYCk7XG5cdFx0Y29uc3QgZGVmYXVsdERlZmluaXRpb25zID0gW1wiQWRkXCIsIFwiTGluZWFyXCIsIFwiSW5wdXRcIiwgXCJPdXRwdXRcIiwgXCJQbGFjZWhvbGRlclwiLCBcIlZhcmlhYmxlXCIsIFwiQ29uc3RhbnRcIiwgXCJNdWx0aXBseVwiLCBcIkNvbnZvbHV0aW9uXCIsIFwiRGVuc2VcIiwgXCJNYXhQb29saW5nXCIsIFwiQmF0Y2hOb3JtYWxpemF0aW9uXCIsIFwiRGVjb252b2x1dGlvblwiLCBcIkF2ZXJhZ2VQb29saW5nXCIsIFwiQWRhcHRpdmVBdmVyYWdlUG9vbGluZ1wiLCBcIkFkYXB0aXZlTWF4UG9vbGluZ1wiLCBcIk1heFVucG9vbGluZ1wiLCBcIkxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXCIsIFwiUGFyYW1ldHJpY1JlY3RpZmllZExpbmVhclVuaXRcIiwgXCJMZWFreVJlY3RpZmllZExpbmVhclVuaXRcIiwgXCJSYW5kb21pemVkUmVjdGlmaWVkTGluZWFyVW5pdFwiLCBcIkxvZ1NpZ21vaWRcIiwgXCJUaHJlc2hvbGRcIiwgXCJIYXJkVGFuaFwiLCBcIlRhbmhTaHJpbmtcIiwgXCJIYXJkU2hyaW5rXCIsIFwiTG9nU29mdE1heFwiLCBcIlNvZnRTaHJpbmtcIiwgXCJTb2Z0TWF4XCIsIFwiU29mdE1pblwiLCBcIlNvZnRQbHVzXCIsIFwiU29mdFNpZ25cIiwgXCJJZGVudGl0eVwiLCBcIlJlY3RpZmllZExpbmVhclVuaXRcIiwgXCJTaWdtb2lkXCIsIFwiRXhwb25lbnRpYWxMaW5lYXJVbml0XCIsIFwiVGFuaFwiLCBcIkFic29sdXRlXCIsIFwiU3VtbWF0aW9uXCIsIFwiRHJvcG91dFwiLCBcIk1hdHJpeE11bHRpcGx5XCIsIFwiQmlhc0FkZFwiLCBcIlJlc2hhcGVcIiwgXCJDb25jYXRcIiwgXCJGbGF0dGVuXCIsIFwiVGVuc29yXCIsIFwiU29mdG1heFwiLCBcIkNyb3NzRW50cm9weVwiLCBcIlplcm9QYWRkaW5nXCIsIFwiUmFuZG9tTm9ybWFsXCIsIFwiVHJ1bmNhdGVkTm9ybWFsRGlzdHJpYnV0aW9uXCIsIFwiRG90UHJvZHVjdFwiXTtcblx0XHRkZWZhdWx0RGVmaW5pdGlvbnMuZm9yRWFjaChkZWZpbml0aW9uID0+IHRoaXMuYWRkRGVmaW5pdGlvbihkZWZpbml0aW9uKSk7XG5cdH1cblxuXHRhZGREZWZpbml0aW9uKGRlZmluaXRpb25OYW1lKSB7XG5cdFx0dGhpcy5kZWZpbml0aW9uc1tkZWZpbml0aW9uTmFtZV0gPSB7XG5cdFx0XHRuYW1lOiBkZWZpbml0aW9uTmFtZSxcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9ySGFzaC5oZXgoZGVmaW5pdGlvbk5hbWUpXG5cdFx0fTtcblx0fVxuXG5cdGV4ZWN1dGUoYXN0KSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB7XG5cdFx0XHRncmFwaDogbmV3IENvbXB1dGF0aW9uYWxHcmFwaCh0aGlzKSxcblx0XHRcdGxvZ2dlcjogbmV3IExvZ2dlcigpXG5cdFx0fVxuXHRcdHRoaXMuaW5pdGlhbGl6ZSgpXG5cdFx0dGhpcy53YWxrQXN0KGFzdCwgc3RhdGUpXG5cdFx0Y29uc29sZS5sb2coXCJGaW5hbCBTdGF0ZTpcIiwgc3RhdGUpXG5cdH1cblxuXHR3YWxrQXN0KHRva2VuLCBzdGF0ZSkge1xuXHRcdGlmICghdG9rZW4pIHsgY29uc29sZS5lcnJvcihcIk5vIHRva2VuPyFcIik7IHJldHVybjsgfVxuXHRcdHRoaXMuZGVwdGggKz0gMVxuXHRcdGNvbnN0IHBhZCA9IEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5kZXB0aH0pLmZpbGwoXCIgXCIpLnJlZHVjZSgocCwgYykgPT4gcCArIGMsIFwiXCIpXG5cdFx0Ly9jb25zb2xlLmxvZyhwYWQgKyB0b2tlbi5raW5kKVxuXG5cdFx0Y29uc3QgZm5OYW1lID0gXCJfXCIgKyB0b2tlbi5raW5kXG5cdFx0Y29uc3QgZm4gPSB0aGlzW2ZuTmFtZV0gfHwgdGhpcy5fdW5yZWNvZ25pemVkXG5cdFx0Y29uc3QgcmV0dXJuVmFsdWUgPSBmbi5jYWxsKHRoaXMsIHRva2VuLCBzdGF0ZSlcblx0XHR0aGlzLmRlcHRoIC09IDFcblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZVxuXHR9XG5cblx0X0dyYXBoKGdyYXBoLCBzdGF0ZSkge1xuXHRcdGdyYXBoLmRlZmluaXRpb25zLmZvckVhY2goZGVmaW5pdGlvbiA9PiB0aGlzLndhbGtBc3QoZGVmaW5pdGlvbiwgc3RhdGUpKTtcblx0fVxuXG5cdF9Ob2RlRGVmaW5pdGlvbihub2RlRGVmaW5pdGlvbiwgc3RhdGUpwqB7XG5cdFx0Ly8gY29uc29sZS5pbmZvKGBBZGRpbmcgXCIke25vZGVEZWZpbml0aW9uLm5hbWV9XCIgdG8gYXZhaWxhYmxlIGRlZmluaXRpb25zLmApO1xuXHRcdHRoaXMuYWRkRGVmaW5pdGlvbihub2RlRGVmaW5pdGlvbi5uYW1lKTtcblx0XHRpZiAobm9kZURlZmluaXRpb24uYm9keSkge1xuXHRcdFx0c3RhdGUuZ3JhcGguZW50ZXJNZXRhbm9kZVNjb3BlKG5vZGVEZWZpbml0aW9uLm5hbWUpXG5cdFx0XHR0aGlzLmdyYXBoLmVudGVyTWV0YW5vZGVTY29wZShub2RlRGVmaW5pdGlvbi5uYW1lKVxuXHRcdFx0dGhpcy53YWxrQXN0KG5vZGVEZWZpbml0aW9uLmJvZHksIHN0YXRlKVxuXHRcdFx0c3RhdGUuZ3JhcGguZXhpdE1ldGFub2RlU2NvcGUoKVxuXHRcdFx0dGhpcy5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cdFx0fVxuXHR9XG5cdFxuXHRfQ2hhaW4oY2hhaW4sIHN0YXRlKSB7XG5cdFx0c3RhdGUuZ3JhcGguY2xlYXJOb2RlU3RhY2soKVxuXHRcdHRoaXMuZ3JhcGguY2xlYXJOb2RlU3RhY2soKVxuXHRcdC8vIGNvbnNvbGUubG9nKGNvbm5lY3Rpb24ubGlzdClcblx0XHRjaGFpbi5ibG9ja3MuZm9yRWFjaChpdGVtID0+IHtcblx0XHRcdHN0YXRlLmdyYXBoLmZyZWV6ZU5vZGVTdGFjaygpXG5cdFx0XHR0aGlzLmdyYXBoLmZyZWV6ZU5vZGVTdGFjaygpXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhpdGVtKVxuXHRcdFx0dGhpcy53YWxrQXN0KGl0ZW0sIHN0YXRlKVxuXHRcdH0pXG5cdH1cblxuXHRfSW5saW5lTWV0YU5vZGUobm9kZSwgc3RhdGUpIHtcblx0XHQvL2NvbnNvbGUubG9nKG5vZGUpXG5cdFx0Y29uc3QgaWRlbnRpZmllciA9IG5vZGUuYWxpYXMgPyBub2RlLmFsaWFzLnZhbHVlIDogdGhpcy5ncmFwaC5nZW5lcmF0ZUluc3RhbmNlSWQoXCJtZXRhbm9kZVwiKVxuXG5cdFx0c3RhdGUuZ3JhcGguZW50ZXJNZXRhbm9kZVNjb3BlKGlkZW50aWZpZXIpXG5cdFx0dGhpcy5ncmFwaC5lbnRlck1ldGFub2RlU2NvcGUoaWRlbnRpZmllcilcblx0XHR0aGlzLndhbGtBc3Qobm9kZS5ib2R5LCBzdGF0ZSlcblx0XHRzdGF0ZS5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cdFx0dGhpcy5ncmFwaC5leGl0TWV0YW5vZGVTY29wZSgpXG5cblx0XHR0aGlzLmdyYXBoLmNyZWF0ZU1ldGFub2RlKGlkZW50aWZpZXIsIHtcblx0XHRcdHVzZXJHZW5lcmF0ZWRJZDogbm9kZS5hbGlhcyA/IG5vZGUuYWxpYXMudmFsdWUgOiB1bmRlZmluZWQsXG5cdFx0XHRpZDogaWRlbnRpZmllcixcblx0XHRcdGNsYXNzOiBpZGVudGlmaWVyLFxuXHRcdFx0aXNBbm9ueW1vdXM6IHRydWUsXG5cdFx0XHRfc291cmNlOiBub2RlLl9zb3VyY2Vcblx0XHR9KVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBpZGVudGlmaWVyLFxuXHRcdFx0Y2xhc3M6IGlkZW50aWZpZXIsXG5cdFx0XHR1c2VyR2VuZXJhdGVkSWQ6IG5vZGUuYWxpYXMgPyBub2RlLmFsaWFzLnZhbHVlIDogdW5kZWZpbmVkLFxuXHRcdFx0X3NvdXJjZTogbm9kZS5fc291cmNlXG5cdFx0fVxuXHR9XG5cblx0X01ldGFOb2RlKG1ldGFub2RlLCBzdGF0ZSkge1xuXHRcdC8vIGNvbnNvbGUubG9nKG1ldGFub2RlKVxuXHRcdG1ldGFub2RlLmRlZmluaXRpb25zLmZvckVhY2goZGVmaW5pdGlvbiA9PiB0aGlzLndhbGtBc3QoZGVmaW5pdGlvbiwgc3RhdGUpKVxuXHR9XG5cblxuXHRfTm9kZShub2RlLCBzdGF0ZSkge1xuXHRcdGNvbnN0IG5vZGVEZWZpbml0aW9uID0gdGhpcy53YWxrQXN0KHtcblx0XHRcdC4uLm5vZGUubm9kZSxcblx0XHRcdGFsaWFzOiBub2RlLmFsaWFzXG5cdFx0fSwgc3RhdGUpXG5cblx0XHQvLyBjb25zb2xlLmxvZyhub2RlRGVmaW5pdGlvbilcblx0fVxuXG5cdC8vIHRoaXMgaXMgZG9pbmcgdG9vIG11Y2gg4oCTIGJyZWFrIGludG8gXCJub3QgcmVjb2duaXplZFwiLCBcInN1Y2Nlc3NcIiBhbmQgXCJhbWJpZ3VvdXNcIlxuXHRfTGl0ZXJhbE5vZGUoaW5zdGFuY2UsIHN0YXRlKSB7XG5cblx0XHRjb25zdCBoZWlnaHRzID0ge1xuXHRcdFx0aWQ6IDE5LFxuXHRcdFx0Y2xhc3M6IDE4LFxuXHRcdFx0cGFyYW1ldGVyUm93OiAxNSxcblx0XHRcdHBhcmFtZXRlclRhYmxlUGFkZGluZzogMiozLFxuXHRcdFx0aGVhZGVyUGFkZGluZzogNVxuXHRcdH07XG5cdFx0XG5cdFx0Y29uc3Qgbm9kZSA9IHtcblx0XHRcdGlkOiB1bmRlZmluZWQsXG5cdFx0XHRjbGFzczogXCJVbmtub3duXCIsXG5cdFx0XHRjb2xvcjogXCJkYXJrZ3JleVwiLFxuXHRcdFx0aGVpZ2h0OiAyICogaGVpZ2h0cy5oZWFkZXJQYWRkaW5nICsgaGVpZ2h0cy5jbGFzcyxcblx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRwYXJhbWV0ZXJzOiBpbnN0YW5jZS5wYXJhbWV0ZXJzLm1hcChwID0+IFtwLm5hbWUsIHAudmFsdWUudmFsdWVdKSxcblxuXHRcdFx0X3NvdXJjZTogaW5zdGFuY2UsXG5cdFx0fTtcblxuXHRcdGxldCBkZWZpbml0aW9ucyA9IHRoaXMubWF0Y2hJbnN0YW5jZU5hbWVUb0RlZmluaXRpb25zKGluc3RhbmNlLnR5cGUudmFsdWUpXG5cdFx0Ly8gY29uc29sZS5sb2coYE1hdGNoZWQgZGVmaW5pdGlvbnM6YCwgZGVmaW5pdGlvbnMpO1xuXG5cdFx0aWYgKGRlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0bm9kZS5jbGFzcyA9IGluc3RhbmNlLnR5cGUudmFsdWU7XG5cdFx0XHRub2RlLmlzVW5kZWZpbmVkID0gdHJ1ZVxuXG5cdFx0XHR0aGlzLmFkZElzc3VlKHtcblx0XHRcdFx0bWVzc2FnZTogYFVucmVjb2duaXplZCBub2RlIHR5cGUgXCIke2luc3RhbmNlLnR5cGUudmFsdWV9XCIuIE5vIHBvc3NpYmxlIG1hdGNoZXMgZm91bmQuYCxcblx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRzdGFydDogIGluc3RhbmNlLnR5cGUuX3NvdXJjZS5zdGFydElkeCxcblx0XHRcdFx0XHRlbmQ6ICBpbnN0YW5jZS50eXBlLl9zb3VyY2UuZW5kSWR4XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHR5cGU6IFwiZXJyb3JcIlxuXHRcdFx0fSlcblx0XHR9IGVsc2UgaWYgKGRlZmluaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0bGV0IGRlZmluaXRpb24gPSBkZWZpbml0aW9uc1swXVxuXHRcdFx0aWYgKGRlZmluaXRpb24pIHtcblx0XHRcdFx0bm9kZS5jb2xvciA9IGRlZmluaXRpb24uY29sb3Jcblx0XHRcdFx0bm9kZS5jbGFzcyA9IGRlZmluaXRpb24ubmFtZVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRub2RlLmNsYXNzID0gaW5zdGFuY2UudHlwZS52YWx1ZVxuXHRcdFx0dGhpcy5hZGRJc3N1ZSh7XG5cdFx0XHRcdG1lc3NhZ2U6IGBVbnJlY29nbml6ZWQgbm9kZSB0eXBlIFwiJHtpbnN0YW5jZS50eXBlLnZhbHVlfVwiLiBQb3NzaWJsZSBtYXRjaGVzOiAke2RlZmluaXRpb25zLm1hcChkZWYgPT4gYFwiJHtkZWYubmFtZX1cImApLmpvaW4oXCIsIFwiKX0uYCxcblx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRzdGFydDogIGluc3RhbmNlLnR5cGUuX3NvdXJjZS5zdGFydElkeCxcblx0XHRcdFx0XHRlbmQ6ICBpbnN0YW5jZS50eXBlLl9zb3VyY2UuZW5kSWR4XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHR5cGU6IFwiZXJyb3JcIlxuXHRcdFx0fSlcblx0XHR9XG5cblx0XHRpZiAoIWluc3RhbmNlLmFsaWFzKSB7XG5cdFx0XHRub2RlLmlkID0gdGhpcy5ncmFwaC5nZW5lcmF0ZUluc3RhbmNlSWQobm9kZS5jbGFzcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vZGUuaWQgPSBpbnN0YW5jZS5hbGlhcy52YWx1ZTtcblx0XHRcdG5vZGUudXNlckdlbmVyYXRlZElkID0gaW5zdGFuY2UuYWxpYXMudmFsdWU7XG5cdFx0XHRub2RlLmhlaWdodCArPSBoZWlnaHRzLmlkO1xuXHRcdH1cblxuXHRcdGlmIChub2RlLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0bm9kZS5oZWlnaHQgKz0gaGVpZ2h0cy5wYXJhbWV0ZXJUYWJsZVBhZGRpbmcgKyAobm9kZS5wYXJhbWV0ZXJzLmxlbmd0aCAqIGhlaWdodHMucGFyYW1ldGVyUm93KTtcblx0XHR9XG5cblx0XHQvLyBpcyBtZXRhbm9kZVxuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLmdyYXBoLm1ldGFub2RlcykuaW5jbHVkZXMobm9kZS5jbGFzcykpIHtcblx0XHRcdGxldCBjb2xvciA9IGQzLmNvbG9yKG5vZGUuY29sb3IpXG5cdFx0XHRjb2xvci5vcGFjaXR5ID0gMC4xXG5cdFx0XHR0aGlzLmdyYXBoLmNyZWF0ZU1ldGFub2RlKG5vZGUuaWQsIHtcblx0XHRcdFx0Li4ubm9kZSxcblx0XHRcdFx0c3R5bGU6IHtcImZpbGxcIjogY29sb3IudG9TdHJpbmcoKX1cblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQuLi5ub2RlLFxuXHRcdFx0XHRzdHlsZTogeyBcImZpbGxcIjogY29sb3IudG9TdHJpbmcoKSB9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGVmdCA9IE1hdGgubWF4KC4uLm5vZGUucGFyYW1ldGVycy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gcGl4ZWxXaWR0aChrZXksIHsgc2l6ZToxNCB9KSkpO1xuXHRcdGNvbnN0IHJpZ2h0ID0gTWF0aC5tYXgoLi4ubm9kZS5wYXJhbWV0ZXJzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBwaXhlbFdpZHRoKHZhbHVlLCB7IHNpemU6MTQgfSkpKTtcblx0XHRjb25zdCB3aWR0aFBhcmFtcyA9IGxlZnQgKyByaWdodDtcblxuXHRcdGNvbnN0IHdpZHRoVGl0bGUgPSBNYXRoLm1heCguLi5bbm9kZS5jbGFzcywgbm9kZS51c2VyR2VuZXJhdGVkSWQgPyBub2RlLnVzZXJHZW5lcmF0ZWRJZCA6IFwiXCJdLm1hcChzdHJpbmcgPT4gcGl4ZWxXaWR0aChzdHJpbmcsIHtzaXplOiAxNn0pKSlcblxuXHRcdGNvbnN0IHdpZHRoID0gMjAgKyBNYXRoLm1heCh3aWR0aFBhcmFtcywgd2lkdGhUaXRsZSk7XG5cblx0XHR0aGlzLmdyYXBoLmNyZWF0ZU5vZGUobm9kZS5pZCwge1xuXHRcdFx0Li4ubm9kZSxcblx0XHRcdHN0eWxlOiB7ZmlsbDogbm9kZS5jb2xvcn0sXG5cdFx0XHR3aWR0aFxuXHRcdH0pXG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4ubm9kZSxcblx0XHRcdHN0eWxlOiB7ZmlsbDogbm9kZS5jb2xvcn0sXG5cdFx0XHR3aWR0aFxuXHRcdH1cblx0fVxuXG5cdF9MaXN0KGxpc3QsIHN0YXRlKSB7XG5cdFx0bGlzdC5saXN0LmZvckVhY2goaXRlbSA9PiB0aGlzLndhbGtBc3QoaXRlbSwgc3RhdGUpKVxuXHR9XG5cblx0X0lkZW50aWZpZXIoaWRlbnRpZmllcikge1xuXHRcdHRoaXMuZ3JhcGgucmVmZXJlbmNlTm9kZShpZGVudGlmaWVyLnZhbHVlKVxuXHR9XG5cblx0bWF0Y2hJbnN0YW5jZU5hbWVUb0RlZmluaXRpb25zKHF1ZXJ5KSB7XG5cdFx0dmFyIGRlZmluaXRpb25zID0gT2JqZWN0LmtleXModGhpcy5kZWZpbml0aW9ucylcblx0XHRsZXQgZGVmaW5pdGlvbktleXMgPSBJbnRlcnByZXRlci5uYW1lUmVzb2x1dGlvbihxdWVyeSwgZGVmaW5pdGlvbnMpXG5cdFx0Ly9jb25zb2xlLmxvZyhcIkZvdW5kIGtleXNcIiwgZGVmaW5pdGlvbktleXMpXG5cdFx0bGV0IG1hdGNoZWREZWZpbml0aW9ucyA9IGRlZmluaXRpb25LZXlzLm1hcChrZXkgPT4gdGhpcy5kZWZpbml0aW9uc1trZXldKVxuXHRcdHJldHVybiBtYXRjaGVkRGVmaW5pdGlvbnNcblx0fVxuXG5cdGdldENvbXB1dGF0aW9uYWxHcmFwaCgpIHtcblx0XHRyZXR1cm4gdGhpcy5ncmFwaC5nZXRHcmFwaCgpXG5cdH1cblxuXHRnZXRNZXRhbm9kZXNEZWZpbml0aW9ucygpIHtcblx0XHRyZXR1cm4gdGhpcy5ncmFwaC5nZXRNZXRhbm9kZXMoKVxuXHR9XG5cblx0Z2V0SXNzdWVzKCkge1xuXHRcdHJldHVybiB0aGlzLmxvZ2dlci5nZXRJc3N1ZXMoKVxuXHR9XG5cblx0YWRkSXNzdWUoaXNzdWUpIHtcblx0XHR0aGlzLmxvZ2dlci5hZGRJc3N1ZShpc3N1ZSlcblx0fVxuXG5cdHN0YXRpYyBuYW1lUmVzb2x1dGlvbihwYXJ0aWFsLCBsaXN0KSB7XG5cdFx0bGV0IHNwbGl0UmVnZXggPSAvKD89WzAtOUEtWl0pL1xuXHQgICAgbGV0IHBhcnRpYWxBcnJheSA9IHBhcnRpYWwuc3BsaXQoc3BsaXRSZWdleClcblx0ICAgIGxldCBsaXN0QXJyYXkgPSBsaXN0Lm1hcChkZWZpbml0aW9uID0+IGRlZmluaXRpb24uc3BsaXQoc3BsaXRSZWdleCkpXG5cdCAgICB2YXIgcmVzdWx0ID0gbGlzdEFycmF5LmZpbHRlcihwb3NzaWJsZU1hdGNoID0+IEludGVycHJldGVyLmlzTXVsdGlQcmVmaXgocGFydGlhbEFycmF5LCBwb3NzaWJsZU1hdGNoKSlcblx0ICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoaXRlbSA9PiBpdGVtLmpvaW4oXCJcIikpXG5cdCAgICByZXR1cm4gcmVzdWx0XG5cdH1cblxuXHRzdGF0aWMgaXNNdWx0aVByZWZpeChuYW1lLCB0YXJnZXQpIHtcblx0ICAgIGlmIChuYW1lLmxlbmd0aCAhPT0gdGFyZ2V0Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXHQgICAgbGV0IGkgPSAwXG5cdCAgICB3aGlsZShpIDwgbmFtZS5sZW5ndGggJiYgdGFyZ2V0W2ldLnN0YXJ0c1dpdGgobmFtZVtpXSkpIHsgaSArPSAxIH1cblx0ICAgIHJldHVybiAoaSA9PT0gbmFtZS5sZW5ndGgpIC8vIGdvdCB0byB0aGUgZW5kP1xuXHR9XG5cblx0X3VucmVjb2duaXplZCh0b2tlbikge1xuXHRcdGNvbnNvbGUud2FybihcIldoYXQgdG8gZG8gd2l0aCB0aGlzIEFTVCB0b2tlbj9cIiwgdG9rZW4pXG5cdH1cbn0iLCJjbGFzcyBMb2dnZXJ7XG5cdGlzc3VlcyA9IFtdXG5cblx0Y2xlYXIoKSB7XG5cdFx0dGhpcy5pc3N1ZXMgPSBbXTtcblx0fVxuXHRcblx0Z2V0SXNzdWVzKCkge1xuXHRcdHJldHVybiB0aGlzLmlzc3Vlcztcblx0fVxuXG5cdGFkZElzc3VlKGlzc3VlKSB7XG5cdFx0dmFyIGYgPSBudWxsO1xuXHRcdHN3aXRjaChpc3N1ZS50eXBlKSB7XG5cdFx0XHRjYXNlIFwiZXJyb3JcIjogZiA9IGNvbnNvbGUuZXJyb3I7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcIndhcm5pbmdcIjogZiA9IGNvbnNvbGUud2FybjsgYnJlYWs7XG5cdFx0XHRjYXNlIFwiaW5mb1wiOiBmID0gY29uc29sZS5pbmZvOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGYgPSBjb25zb2xlLmxvZzsgYnJlYWs7XG5cdFx0fVxuXHRcdGYoaXNzdWUubWVzc2FnZSk7XG5cdFx0dGhpcy5pc3N1ZXMucHVzaChpc3N1ZSk7XG5cdH1cbn0iLCJjbGFzcyBQYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiA8ZGl2IGlkPXt0aGlzLnByb3BzLmlkfSBjbGFzc05hbWU9XCJwYW5lbFwiPlxuICAgIFx0e3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgPC9kaXY+O1xuICB9XG59IiwiY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIilcbmNvbnN0IG9obSA9IHJlcXVpcmUoXCJvaG0tanNcIilcblxuY2xhc3MgUGFyc2Vye1xuXHRjb250ZW50cyA9IG51bGxcblx0Z3JhbW1hciA9IG51bGxcblx0XG5cdGV2YWxPcGVyYXRpb24gPSB7XG5cdFx0R3JhcGg6IChkZWZpbml0aW9ucykgPT4gICh7XG5cdFx0XHRraW5kOiBcIkdyYXBoXCIsXG5cdFx0XHRkZWZpbml0aW9uczogZGVmaW5pdGlvbnMuZXZhbCgpXG5cdFx0fSksXG5cdFx0Tm9kZURlZmluaXRpb246IGZ1bmN0aW9uKF8sIGxheWVyTmFtZSwgcGFyYW1zLCBib2R5KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIk5vZGVEZWZpbml0aW9uXCIsXG5cdFx0XHRcdG5hbWU6IGxheWVyTmFtZS5zb3VyY2UuY29udGVudHMsXG5cdFx0XHRcdGJvZHk6IGJvZHkuZXZhbCgpWzBdXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRJbmxpbmVNZXRhTm9kZTogZnVuY3Rpb24oYm9keSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJJbmxpbmVNZXRhTm9kZVwiLFxuXHRcdFx0XHRib2R5OiBib2R5LmV2YWwoKSxcblx0XHRcdFx0X3NvdXJjZTogdGhpcy5zb3VyY2Vcblx0XHRcdH1cblx0XHR9LFxuXHRcdE1ldGFOb2RlOiBmdW5jdGlvbihfLCBkZWZzLCBfXykge1xuXHRcdFx0dmFyIGRlZmluaXRpb25zID0gZGVmcy5ldmFsKClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiTWV0YU5vZGVcIixcblx0XHRcdFx0ZGVmaW5pdGlvbnM6IGRlZmluaXRpb25zLmRlZmluaXRpb25zXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRDaGFpbjogZnVuY3Rpb24obGlzdCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJDaGFpblwiLFxuXHRcdFx0XHRibG9ja3M6IGxpc3QuZXZhbCgpXG5cdFx0XHR9XG5cdFx0fSxcblx0XHROb2RlOiBmdW5jdGlvbihpZCwgXywgbm9kZSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJOb2RlXCIsXG5cdFx0XHRcdG5vZGU6IG5vZGUuZXZhbCgpLFxuXHRcdFx0XHRhbGlhczogaWQuZXZhbCgpWzBdLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0TGl0ZXJhbE5vZGU6IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJMaXRlcmFsTm9kZVwiLFxuXHRcdFx0XHR0eXBlOiB0eXBlLmV2YWwoKSxcblx0XHRcdFx0cGFyYW1ldGVyczogcGFyYW1zLmV2YWwoKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Lypcblx0XHRCbG9ja05hbWU6IGZ1bmN0aW9uKGlkLCBfKSB7XG5cdFx0XHRyZXR1cm4gaWQuZXZhbCgpXG5cdFx0fSxcblx0XHQqL1xuXHRcdExpc3Q6IGZ1bmN0aW9uKF8sIGxpc3QsIF9fKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIkxpc3RcIixcblx0XHRcdFx0bGlzdDogbGlzdC5ldmFsKClcblx0XHRcdH1cblx0XHR9LFxuXHRcdEJsb2NrUGFyYW1ldGVyczogZnVuY3Rpb24oXywgcGFyYW1zLCBfXykge1xuXHRcdFx0Y29uc3QgcCA9IHBhcmFtcy5ldmFsKCk7XG5cdFx0XHRyZXR1cm4gcFswXSA/IHBbMF0gOiBwXG5cdFx0fSxcblx0XHRQYXJhbWV0ZXI6IGZ1bmN0aW9uKG5hbWUsIF8sIHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIlBhcmFtZXRlclwiLFxuXHRcdFx0XHRuYW1lOiBuYW1lLnNvdXJjZS5jb250ZW50cyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLmV2YWwoKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0VmFsdWU6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0a2luZDogXCJWYWx1ZVwiLFxuXHRcdFx0XHR2YWx1ZTogdmFsLnNvdXJjZS5jb250ZW50c1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Tm9uZW1wdHlMaXN0T2Y6IGZ1bmN0aW9uKHgsIF8sIHhzKSB7XG5cdFx0XHRyZXR1cm4gW3guZXZhbCgpXS5jb25jYXQoeHMuZXZhbCgpKVxuXHRcdH0sXG5cdFx0RW1wdHlMaXN0T2Y6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFtdXG5cdFx0fSxcblx0XHRwYXRoOiBmdW5jdGlvbihsaXN0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRraW5kOiBcIklkZW50aWZpZXJcIixcblx0XHRcdFx0dmFsdWU6IHRoaXMuc291cmNlLmNvbnRlbnRzLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cGFyYW1ldGVyTmFtZTogZnVuY3Rpb24oYSkge1xuXHRcdFx0cmV0dXJuIGEuc291cmNlLmNvbnRlbnRzXG5cdFx0fSxcblx0XHRub2RlVHlwZTogZnVuY3Rpb24oXywgX18pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiTm9kZVR5cGVcIixcblx0XHRcdFx0dmFsdWU6IHRoaXMuc291cmNlLmNvbnRlbnRzLFxuXHRcdFx0XHRfc291cmNlOiB0aGlzLnNvdXJjZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aWRlbnRpZmllcjogZnVuY3Rpb24oXywgX18pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGtpbmQ6IFwiSWRlbnRpZmllclwiLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5zb3VyY2UuY29udGVudHMsXG5cdFx0XHRcdF9zb3VyY2U6IHRoaXMuc291cmNlXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5jb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyBcIi9zcmMvbW9uaWVsLm9obVwiLCBcInV0ZjhcIilcblx0XHR0aGlzLmdyYW1tYXIgPSBvaG0uZ3JhbW1hcih0aGlzLmNvbnRlbnRzKVxuXHRcdHRoaXMuc2VtYW50aWNzID0gdGhpcy5ncmFtbWFyLmNyZWF0ZVNlbWFudGljcygpLmFkZE9wZXJhdGlvbihcImV2YWxcIiwgdGhpcy5ldmFsT3BlcmF0aW9uKVxuXHR9XG5cblx0bWFrZShzb3VyY2UpIHtcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5ncmFtbWFyLm1hdGNoKHNvdXJjZSlcblxuXHRcdGlmIChyZXN1bHQuc3VjY2VlZGVkKCkpIHtcblx0XHRcdHZhciBhc3QgPSB0aGlzLnNlbWFudGljcyhyZXN1bHQpLmV2YWwoKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXN0XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBleHBlY3RlZCA9IHJlc3VsdC5nZXRFeHBlY3RlZFRleHQoKVxuXHRcdFx0dmFyIHBvc2l0aW9uID0gcmVzdWx0LmdldFJpZ2h0bW9zdEZhaWx1cmVQb3NpdGlvbigpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHBlY3RlZCxcblx0XHRcdFx0cG9zaXRpb25cblx0XHRcdH1cblx0XHR9XG5cdH1cblxufSIsImNsYXNzIFB5VG9yY2hHZW5lcmF0b3Ige1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmJ1aWx0aW5zID0gW1wiQXJpdGhtZXRpY0Vycm9yXCIsIFwiQXNzZXJ0aW9uRXJyb3JcIiwgXCJBdHRyaWJ1dGVFcnJvclwiLCBcIkJhc2VFeGNlcHRpb25cIiwgXCJCbG9ja2luZ0lPRXJyb3JcIiwgXCJCcm9rZW5QaXBlRXJyb3JcIiwgXCJCdWZmZXJFcnJvclwiLCBcIkJ5dGVzV2FybmluZ1wiLCBcIkNoaWxkUHJvY2Vzc0Vycm9yXCIsIFwiQ29ubmVjdGlvbkFib3J0ZWRFcnJvclwiLCBcIkNvbm5lY3Rpb25FcnJvclwiLCBcIkNvbm5lY3Rpb25SZWZ1c2VkRXJyb3JcIiwgXCJDb25uZWN0aW9uUmVzZXRFcnJvclwiLCBcIkRlcHJlY2F0aW9uV2FybmluZ1wiLCBcIkVPRkVycm9yXCIsIFwiRWxsaXBzaXNcIiwgXCJFbnZpcm9ubWVudEVycm9yXCIsIFwiRXhjZXB0aW9uXCIsIFwiRmFsc2VcIiwgXCJGaWxlRXhpc3RzRXJyb3JcIiwgXCJGaWxlTm90Rm91bmRFcnJvclwiLCBcIkZsb2F0aW5nUG9pbnRFcnJvclwiLCBcIkZ1dHVyZVdhcm5pbmdcIiwgXCJHZW5lcmF0b3JFeGl0XCIsIFwiSU9FcnJvclwiLCBcIkltcG9ydEVycm9yXCIsIFwiSW1wb3J0V2FybmluZ1wiLCBcIkluZGVudGF0aW9uRXJyb3JcIiwgXCJJbmRleEVycm9yXCIsIFwiSW50ZXJydXB0ZWRFcnJvclwiLCBcIklzQURpcmVjdG9yeUVycm9yXCIsIFwiS2V5RXJyb3JcIiwgXCJLZXlib2FyZEludGVycnVwdFwiLCBcIkxvb2t1cEVycm9yXCIsIFwiTWVtb3J5RXJyb3JcIiwgXCJNb2R1bGVOb3RGb3VuZEVycm9yXCIsIFwiTmFtZUVycm9yXCIsIFwiTm9uZVwiLCBcIk5vdEFEaXJlY3RvcnlFcnJvclwiLCBcIk5vdEltcGxlbWVudGVkXCIsIFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLCBcIk9TRXJyb3JcIiwgXCJPdmVyZmxvd0Vycm9yXCIsIFwiUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ1wiLCBcIlBlcm1pc3Npb25FcnJvclwiLCBcIlByb2Nlc3NMb29rdXBFcnJvclwiLCBcIlJlY3Vyc2lvbkVycm9yXCIsIFwiUmVmZXJlbmNlRXJyb3JcIiwgXCJSZXNvdXJjZVdhcm5pbmdcIiwgXCJSdW50aW1lRXJyb3JcIiwgXCJSdW50aW1lV2FybmluZ1wiLCBcIlN0b3BBc3luY0l0ZXJhdGlvblwiLCBcIlN0b3BJdGVyYXRpb25cIiwgXCJTeW50YXhFcnJvclwiLCBcIlN5bnRheFdhcm5pbmdcIiwgXCJTeXN0ZW1FcnJvclwiLCBcIlN5c3RlbUV4aXRcIiwgXCJUYWJFcnJvclwiLCBcIlRpbWVvdXRFcnJvclwiLCBcIlRydWVcIiwgXCJUeXBlRXJyb3JcIiwgXCJVbmJvdW5kTG9jYWxFcnJvclwiLCBcIlVuaWNvZGVEZWNvZGVFcnJvclwiLCBcIlVuaWNvZGVFbmNvZGVFcnJvclwiLCBcIlVuaWNvZGVFcnJvclwiLCBcIlVuaWNvZGVUcmFuc2xhdGVFcnJvclwiLCBcIlVuaWNvZGVXYXJuaW5nXCIsIFwiVXNlcldhcm5pbmdcIiwgXCJWYWx1ZUVycm9yXCIsIFwiV2FybmluZ1wiLCBcIlplcm9EaXZpc2lvbkVycm9yXCIsIFwiX19idWlsZF9jbGFzc19fXCIsIFwiX19kZWJ1Z19fXCIsIFwiX19kb2NfX1wiLCBcIl9faW1wb3J0X19cIiwgXCJfX2xvYWRlcl9fXCIsIFwiX19uYW1lX19cIiwgXCJfX3BhY2thZ2VfX1wiLCBcIl9fc3BlY19fXCIsIFwiYWJzXCIsIFwiYWxsXCIsIFwiYW55XCIsIFwiYXNjaWlcIiwgXCJiaW5cIiwgXCJib29sXCIsIFwiYnl0ZWFycmF5XCIsIFwiYnl0ZXNcIiwgXCJjYWxsYWJsZVwiLCBcImNoclwiLCBcImNsYXNzbWV0aG9kXCIsIFwiY29tcGlsZVwiLCBcImNvbXBsZXhcIiwgXCJjb3B5cmlnaHRcIiwgXCJjcmVkaXRzXCIsIFwiZGVsYXR0clwiLCBcImRpY3RcIiwgXCJkaXJcIiwgXCJkaXZtb2RcIiwgXCJlbnVtZXJhdGVcIiwgXCJldmFsXCIsIFwiZXhlY1wiLCBcImV4aXRcIiwgXCJmaWx0ZXJcIiwgXCJmbG9hdFwiLCBcImZvcm1hdFwiLCBcImZyb3plbnNldFwiLCBcImdldGF0dHJcIiwgXCJnbG9iYWxzXCIsIFwiaGFzYXR0clwiLCBcImhhc2hcIiwgXCJoZWxwXCIsIFwiaGV4XCIsIFwiaWRcIiwgXCJpbnB1dFwiLCBcImludFwiLCBcImlzaW5zdGFuY2VcIiwgXCJpc3N1YmNsYXNzXCIsIFwiaXRlclwiLCBcImxlblwiLCBcImxpY2Vuc2VcIiwgXCJsaXN0XCIsIFwibG9jYWxzXCIsIFwibWFwXCIsIFwibWF4XCIsIFwibWVtb3J5dmlld1wiLCBcIm1pblwiLCBcIm5leHRcIiwgXCJvYmplY3RcIiwgXCJvY3RcIiwgXCJvcGVuXCIsIFwib3JkXCIsIFwicG93XCIsIFwicHJpbnRcIiwgXCJwcm9wZXJ0eVwiLCBcInF1aXRcIiwgXCJyYW5nZVwiLCBcInJlcHJcIiwgXCJyZXZlcnNlZFwiLCBcInJvdW5kXCIsIFwic2V0XCIsIFwic2V0YXR0clwiLCBcInNsaWNlXCIsIFwic29ydGVkXCIsIFwic3RhdGljbWV0aG9kXCIsIFwic3RyXCIsIFwic3VtXCIsIFwic3VwZXJcIiwgXCJ0dXBsZVwiLCBcInR5cGVcIiwgXCJ2YXJzXCIsIFwiemlwXCJdXG5cdFx0dGhpcy5rZXl3b3JkcyA9IFtcImFuZFwiLCBcImFzXCIsIFwiYXNzZXJ0XCIsIFwiYnJlYWtcIiwgXCJjbGFzc1wiLCBcImNvbnRpbnVlXCIsIFwiZGVmXCIsIFwiZGVsXCIsIFwiZWxpZlwiLCBcImVsc2VcIiwgXCJleGNlcHRcIiwgXCJleGVjXCIsIFwiZmluYWxseVwiLCBcImZvclwiLCBcImZyb21cIiwgXCJnbG9iYWxcIiwgXCJpZlwiLCBcImltcG9ydFwiLCBcImluXCIsIFwiaXNcIiwgXCJsYW1iZGFcIiwgXCJub3RcIiwgXCJvclwiLCBcInBhc3NcIiwgXCJwcmludFwiLCBcInJhaXNlXCIsIFwicmV0dXJuXCIsIFwidHJ5XCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIl1cblx0fVxuXG4gICAgc2FuaXRpemUoaWQpIHtcblx0XHR2YXIgc2FuaXRpemVkSWQgPSBpZFxuXHRcdGlmICh0aGlzLmJ1aWx0aW5zLmluY2x1ZGVzKHNhbml0aXplZElkKSB8fCB0aGlzLmtleXdvcmRzLmluY2x1ZGVzKHNhbml0aXplZElkKSkge1xuXHRcdFx0c2FuaXRpemVkSWQgPSBcIl9cIiArIHNhbml0aXplZElkXG5cdFx0fVxuXHRcdHNhbml0aXplZElkID0gc2FuaXRpemVkSWQucmVwbGFjZSgvXFwuL2csIFwidGhpc1wiKVxuXHRcdHNhbml0aXplZElkID0gc2FuaXRpemVkSWQucmVwbGFjZSgvXFwvL2csIFwiLlwiKVxuXHRcdHJldHVybiBzYW5pdGl6ZWRJZFxuXHR9XG5cblx0bWFwVG9GdW5jdGlvbihub2RlVHlwZSkge1xuXHRcdGxldCB0cmFuc2xhdGlvblRhYmxlID0ge1xuXHRcdFx0XCJDb252b2x1dGlvblwiOiBcIkYuY29udjJkXCIsXG5cdFx0XHRcIkRlY29udm9sdXRpb25cIjogXCJGLmNvbnZfdHJhbnNwb3NlMmRcIixcblx0XHRcdFwiQXZlcmFnZVBvb2xpbmdcIjogXCJGLmF2Z19wb29sMmRcIixcblx0XHRcdFwiQWRhcHRpdmVBdmVyYWdlUG9vbGluZ1wiOiBcIkYuYWRhcHRpdmVfYXZnX3Bvb2wyZFwiLFxuXHRcdFx0XCJNYXhQb29saW5nXCI6IFwiRi5tYXhfcG9vbDJkXCIsXG5cdFx0XHRcIkFkYXB0aXZlTWF4UG9vbGluZ1wiOiBcIkYuYWRhcHRpdmVfbWF4X3Bvb2wyZFwiLFxuXHRcdFx0XCJNYXhVbnBvb2xpbmdcIjogXCJGLm1heF91bnBvb2wyZFwiLFxuXHRcdFx0XCJSZWN0aWZpZWRMaW5lYXJVbml0XCI6IFwiRi5yZWx1XCIsXG5cdFx0XHRcIkV4cG9uZW50aWFsTGluZWFyVW5pdFwiOiBcIkYuZWx1XCIsXG5cdFx0XHRcIlBhcmFtZXRyaWNSZWN0aWZpZWRMaW5lYXJVbml0XCI6IFwiRi5wcmVsdVwiLFxuXHRcdFx0XCJMZWFreVJlY3RpZmllZExpbmVhclVuaXRcIjogXCJGLmxlYWt5X3JlbHVcIixcblx0XHRcdFwiUmFuZG9taXplZFJlY3RpZmllZExpbmVhclVuaXRcIjogXCJGLnJyZWx1XCIsXG5cdFx0XHRcIlNpZ21vaWRcIjogXCJGLnNpZ21vaWRcIixcblx0XHRcdFwiTG9nU2lnbW9pZFwiOiBcIkYubG9nc2lnbW9pZFwiLFxuXHRcdFx0XCJUaHJlc2hvbGRcIjogXCJGLnRocmVzaG9sZFwiLFxuXHRcdFx0XCJIYXJkVGFuaFwiOiBcIkYuaGFyZHRhbmhcIixcblx0XHRcdFwiVGFuaFwiOiBcIkYudGFuaFwiLFxuXHRcdFx0XCJUYW5oU2hyaW5rXCI6IFwiRi50YW5oc2hyaW5rXCIsXG5cdFx0XHRcIkhhcmRTaHJpbmtcIjogXCJGLmhhcmRzaHJpbmtcIixcblx0XHRcdFwiTG9nU29mdE1heFwiOiBcIkYubG9nX3NvZnRtYXhcIixcblx0XHRcdFwiU29mdFNocmlua1wiOiBcIkYuc29mdHNocmlua1wiLFxuXHRcdFx0XCJTb2Z0TWF4XCI6IFwiRi5zb2Z0bWF4XCIsXG5cdFx0XHRcIlNvZnRNaW5cIjogXCJGLnNvZnRtaW5cIixcblx0XHRcdFwiU29mdFBsdXNcIjogXCJGLnNvZnRwbHVzXCIsXG5cdFx0XHRcIlNvZnRTaWduXCI6IFwiRi5zb2Z0c2lnblwiLFxuXHRcdFx0XCJCYXRjaE5vcm1hbGl6YXRpb25cIjogXCJGLmJhdGNoX25vcm1cIixcblx0XHRcdFwiTGluZWFyXCI6IFwiRi5saW5lYXJcIixcblx0XHRcdFwiRHJvcG91dFwiOiBcIkYuZHJvcG91dFwiLFxuXHRcdFx0XCJQYWlyd2lzZURpc3RhbmNlXCI6IFwiRi5wYWlyd2lzZV9kaXN0YW5jZVwiLFxuXHRcdFx0XCJDcm9zc0VudHJvcHlcIjogXCJGLmNyb3NzX2VudHJvcHlcIixcblx0XHRcdFwiQmluYXJ5Q3Jvc3NFbnRyb3B5XCI6IFwiRi5iaW5hcnlfY3Jvc3NfZW50cm9weVwiLFxuXHRcdFx0XCJLdWxsYmFja0xlaWJsZXJEaXZlcmdlbmNlTG9zc1wiOiBcIkYua2xfZGl2XCIsXG5cdFx0XHRcIlBhZFwiOiBcIkYucGFkXCIsXG5cdFx0XHRcIlZhcmlhYmxlXCI6IFwiQUcuVmFyaWFibGVcIixcblx0XHRcdFwiUmFuZG9tTm9ybWFsXCI6IFwiVC5yYW5kblwiLFxuXHRcdFx0XCJUZW5zb3JcIjogXCJULlRlbnNvclwiXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zbGF0aW9uVGFibGUuaGFzT3duUHJvcGVydHkobm9kZVR5cGUpID8gdHJhbnNsYXRpb25UYWJsZVtub2RlVHlwZV0gOiBub2RlVHlwZVxuXG5cdH1cblxuXHRpbmRlbnQoY29kZSwgbGV2ZWwgPSAxLCBpbmRlbnRQZXJMZXZlbCA9IFwiICAgIFwiKSB7XG5cdFx0bGV0IGluZGVudCA9IGluZGVudFBlckxldmVsLnJlcGVhdChsZXZlbClcblx0XHRyZXR1cm4gY29kZS5zcGxpdChcIlxcblwiKS5tYXAobGluZSA9PiBpbmRlbnQgKyBsaW5lKS5qb2luKFwiXFxuXCIpXG5cdH1cblxuXHRnZW5lcmF0ZUNvZGUoZ3JhcGgsIGRlZmluaXRpb25zKSB7XG5cdFx0bGV0IGltcG9ydHMgPVxuYGltcG9ydCB0b3JjaCBhcyBUXG5pbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGXG5pbXBvcnQgdG9yY2guYXV0b2dyYWQgYXMgQUdgXG5cblx0XHRsZXQgbW9kdWxlRGVmaW5pdGlvbnMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykubWFwKGRlZmluaXRpb25OYW1lID0+IHtcblx0XHRcdGlmIChkZWZpbml0aW9uTmFtZSAhPT0gXCJtYWluXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVDb2RlRm9yTW9kdWxlKGRlZmluaXRpb25OYW1lLCBkZWZpbml0aW9uc1tkZWZpbml0aW9uTmFtZV0pXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3JldHVybiBcIlwiXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdGxldCBjb2RlID1cbmAke2ltcG9ydHN9XG5cbiR7bW9kdWxlRGVmaW5pdGlvbnMuam9pbihcIlxcblwiKX1cbmBcblxuXHRcdHJldHVybiBjb2RlXG5cdH1cblxuXHRnZW5lcmF0ZUNvZGVGb3JNb2R1bGUoY2xhc3NuYW1lLCBncmFwaCkge1xuXHRcdGxldCB0b3BvbG9naWNhbE9yZGVyaW5nID0gZ3JhcGhsaWIuYWxnLnRvcHNvcnQoZ3JhcGgpXG5cdFx0bGV0IGZvcndhcmRGdW5jdGlvbiA9IFwiXCJcblxuXHRcdHRvcG9sb2dpY2FsT3JkZXJpbmcubWFwKG5vZGUgPT4ge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJtdVwiLCBub2RlKVxuXHRcdFx0bGV0IG4gPSBncmFwaC5ub2RlKG5vZGUpXG5cdFx0XHRsZXQgY2ggPSBncmFwaC5jaGlsZHJlbihub2RlKVxuXG5cdFx0XHRpZiAoIW4pIHtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhuKVxuXG5cdFx0XHRpZiAoY2gubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGxldCBpbk5vZGVzID0gZ3JhcGguaW5FZGdlcyhub2RlKS5tYXAoZSA9PiB0aGlzLnNhbml0aXplKGUudikpXG5cdFx0XHRcdGZvcndhcmRGdW5jdGlvbiArPSBgJHt0aGlzLnNhbml0aXplKG5vZGUpfSA9ICR7dGhpcy5tYXBUb0Z1bmN0aW9uKG4uY2xhc3MpfSgke2luTm9kZXMuam9pbihcIiwgXCIpfSlcXG5gXG5cdFx0XHR9IFxuXHRcdH0sIHRoaXMpXG5cblx0XHRsZXQgbW9kdWxlQ29kZSA9XG5gY2xhc3MgJHtjbGFzc25hbWV9KFQubm4uTW9kdWxlKTpcbiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW0xLCBwYXJhbTIpOiAjIHBhcmFtZXRlcnMgaGVyZVxuICAgICAgICBzdXBlcigke2NsYXNzbmFtZX0sIHNlbGYpLl9faW5pdF9fKClcbiAgICAgICAgIyBhbGwgZGVjbGFyYXRpb25zIGhlcmVcblxuICAgIGRlZiBmb3J3YXJkKHNlbGYsIGluMSwgaW4yKTogIyBhbGwgSW5wdXRzIGhlcmVcbiAgICAgICAgIyBhbGwgZnVuY3Rpb25hbCBzdHVmZiBoZXJlXG4ke3RoaXMuaW5kZW50KGZvcndhcmRGdW5jdGlvbiwgMil9XG4gICAgICAgIHJldHVybiAob3V0MSwgb3V0MikgIyBhbGwgT3V0cHV0cyBoZXJlXG5gXG5cdFx0cmV0dXJuIG1vZHVsZUNvZGVcblx0fVxufSIsImNsYXNzIFNjb3BlU3RhY2t7XG5cdHNjb3BlU3RhY2sgPSBbXVxuXG5cdGNvbnN0cnVjdG9yKHNjb3BlID0gW10pIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShzY29wZSkpIHtcblx0XHRcdHRoaXMuc2NvcGVTdGFjayA9IHNjb3BlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvZiBzY29wZSBzdGFjay5cIiwgc2NvcGUpO1xuXHRcdH1cblx0fVxuXG5cdGluaXRpYWxpemUoKSB7XG5cdFx0dGhpcy5jbGVhcigpO1xuXHR9XG5cblx0cHVzaChzY29wZSkge1xuXHRcdHRoaXMuc2NvcGVTdGFjay5wdXNoKHNjb3BlKTtcblx0fVxuXG5cdHBvcCgpIHtcblx0XHRyZXR1cm4gdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuXHR9XG5cblx0Y2xlYXIoKSB7XG5cdFx0dGhpcy5zY29wZVN0YWNrID0gW107XG5cdH1cblxuXHRjdXJyZW50U2NvcGVJZGVudGlmaWVyKCkge1xuXHRcdHJldHVybiB0aGlzLnNjb3BlU3RhY2suam9pbihcIi9cIik7XG5cdH1cblxuXHRwcmV2aW91c1Njb3BlSWRlbnRpZmllcigpIHtcblx0XHRsZXQgY29weSA9IEFycmF5LmZyb20odGhpcy5zY29wZVN0YWNrKTtcblx0XHRjb3B5LnBvcCgpO1xuXHRcdHJldHVybiBjb3B5LmpvaW4oXCIvXCIpO1xuXHR9XG59IiwiY29uc3Qgem9vbSA9IHJlcXVpcmUoXCJkMy16b29tXCIpO1xuXG5jbGFzcyBWaXN1YWxHcmFwaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5ncmFwaExheW91dCA9IG5ldyBHcmFwaExheW91dCh0aGlzLnNhdmVHcmFwaC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZ3JhcGg6IG51bGwsXG4gICAgfTtcblxuICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICB0aGlzLmdyb3VwID0gbnVsbDtcblxuICAgIHRoaXMuY3VycmVudFpvb20gPSBudWxsO1xuICB9XG5cbiAgc2F2ZUdyYXBoKGdyYXBoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGdyYXBoIH0pO1xuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5ncmFwaCkge1xuICAgICAgbmV4dFByb3BzLmdyYXBoLl9sYWJlbC5yYW5rZGlyID0gbmV4dFByb3BzLmxheW91dDtcbiAgICAgIHRoaXMuZ3JhcGhMYXlvdXQubGF5b3V0KG5leHRQcm9wcy5ncmFwaCk7XG4gICAgfVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgIT09IG5leHRTdGF0ZTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKG5vZGUpIHtcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSBub2RlLmlkO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZE5vZGUgfSk7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuc3RhdGUuZ3JhcGguZ3JhcGgoKTtcblxuICAgIGNvbnN0IGlkZWFsU2l6ZSA9ICh3aWR0aCwgaGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSA9PiB7XG4gICAgICBjb25zdCB3aWR0aFJhdGlvID0gd2lkdGggLyBtYXhXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodFJhdGlvID0gaGVpZ2h0IC8gbWF4SGVpZ2h0O1xuICAgICAgY29uc3QgaWRlYWxTaXplID0gd2lkdGhSYXRpbyA8IGhlaWdodFJhdGlvID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgWyR7d2lkdGh9LCAke2hlaWdodH1dLCBbJHttYXhXaWR0aH0sICR7bWF4SGVpZ2h0fV0sICR7d2lkdGhSYXRpb30sICR7aGVpZ2h0UmF0aW99LCBpZGVhbCA9ICR7aWRlYWxTaXplfWApXG4gICAgICByZXR1cm4gaWRlYWxTaXplO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50Wm9vbSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IFtcbiAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICBoZWlnaHQgLyAyLFxuICAgICAgICBpZGVhbFNpemUod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCksXG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBbXG4gICAgICBub2RlLngsXG4gICAgICBub2RlLnksXG4gICAgICBpZGVhbFNpemUobm9kZS53aWR0aCwgbm9kZS5oZWlnaHQsIHdpZHRoLCBoZWlnaHQpLFxuICAgIF07XG5cbiAgICB0aGlzLnRyYW5zaXRpb24odGhpcy5jdXJyZW50Wm9vbSwgdGFyZ2V0LCBub2RlKTtcblxuICAgIHRoaXMuY3VycmVudFpvb20gPSB0YXJnZXQ7XG4gIH1cblxuICB0cmFuc2l0aW9uKHN0YXJ0LCBlbmQsIG5vZGUpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuc3RhdGUuZ3JhcGguZ3JhcGgoKTtcblxuICAgIGNvbnN0IGNlbnRlciA9IHtcbiAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgfTtcbiAgICBjb25zdCBpID0gZDMuaW50ZXJwb2xhdGVab29tKHN0YXJ0LCBlbmQpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gKFt4LCB5LCBzaXplXSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbGUgPSB3aWR0aCAvIHNpemU7XG4gICAgICBjb25zdCB0cmFuc2xhdGVYID0gY2VudGVyLnggLSB4ICogc2NhbGU7XG4gICAgICBjb25zdCB0cmFuc2xhdGVZID0gY2VudGVyLnkgLSB5ICogc2NhbGU7XG4gICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9LCR7dHJhbnNsYXRlWX0pc2NhbGUoJHtzY2FsZX0pYDtcbiAgICB9O1xuXG4gICAgZDMuc2VsZWN0KHRoaXMuZ3JvdXApXG4gICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0oc3RhcnQpKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGkuZHVyYXRpb24pXG4gICAgICAuYXR0clR3ZWVuKFwidHJhbnNmb3JtXCIsICgpID0+ICh0KSA9PiB0cmFuc2Zvcm0oaSh0KSkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZS5ncmFwaCkge1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zdGF0ZS5ncmFwaClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGcgPSB0aGlzLnN0YXRlLmdyYXBoO1xuXG4gICAgY29uc3Qgbm9kZXMgPSBnLm5vZGVzKCkubWFwKChub2RlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgbiA9IGcubm9kZShub2RlTmFtZSk7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAga2V5OiBub2RlTmFtZSxcbiAgICAgICAgbm9kZTogbixcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljay5iaW5kKHRoaXMpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgVHlwZSA9IG5vZGVEaXNwYXRjaChuKTtcblxuICAgICAgcmV0dXJuIDxUeXBlIHsuLi5wcm9wc30gLz47XG4gICAgfSk7XG5cbiAgICBjb25zdCBlZGdlcyA9IGcuZWRnZXMoKS5tYXAoKGVkZ2VOYW1lKSA9PiB7XG4gICAgICBjb25zdCBlID0gZy5lZGdlKGVkZ2VOYW1lKTtcbiAgICAgIHJldHVybiA8RWRnZSBrZXk9e2Ake2VkZ2VOYW1lLnZ9LT4ke2VkZ2VOYW1lLnd9YH0gZWRnZT17ZX0gLz47XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGcuZ3JhcGgoKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8c3ZnXG4gICAgICAgIHJlZj17KGVsKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdmcgPSBlbDtcbiAgICAgICAgfX1cbiAgICAgICAgaWQ9XCJ2aXN1YWxpemF0aW9uXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB2aWV3Qm94PXtgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWB9XG4gICAgICA+XG4gICAgICAgIDxzdHlsZT5cbiAgICAgICAgICB7ZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArIFwiL3NyYy9idW5kbGUuY3NzXCIsIFwidXRmLThcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgPGRlZnM+XG4gICAgICAgICAgPEFycm93IC8+XG4gICAgICAgIDwvZGVmcz5cbiAgICAgICAgPGdcbiAgICAgICAgICBpZD1cImdyYXBoXCJcbiAgICAgICAgICByZWY9eyhlbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncm91cCA9IGVsO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZyBpZD1cIm5vZGVzXCI+e25vZGVzfTwvZz5cbiAgICAgICAgICA8ZyBpZD1cImVkZ2VzXCI+e2VkZ2VzfTwvZz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9zdmc+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBBcnJvdyA9ICgpID0+IChcbiAgPG1hcmtlclxuICAgIGlkPVwiYXJyb3dcIlxuICAgIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxuICAgIHJlZlg9XCIxMFwiXG4gICAgcmVmWT1cIjVcIlxuICAgIG1hcmtlclVuaXRzPVwic3Ryb2tlV2lkdGhcIlxuICAgIG1hcmtlcldpZHRoPVwiMTBcIlxuICAgIG1hcmtlckhlaWdodD1cIjcuNVwiXG4gICAgb3JpZW50PVwiYXV0b1wiXG4gID5cbiAgICA8cGF0aCBkPVwiTSAwIDAgTCAxMCA1IEwgMCAxMCBMIDMgNSB6XCIgY2xhc3NOYW1lPVwiYXJyb3dcIiAvPlxuICA8L21hcmtlcj5cbik7XG5cbmNsYXNzIEVkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBsaW5lID0gZDNcbiAgICAubGluZSgpXG4gICAgLmN1cnZlKGQzLmN1cnZlQmFzaXMpXG4gICAgLngoKGQpID0+IGQueClcbiAgICAueSgoZCkgPT4gZC55KTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgcHJldmlvdXNQb2ludHM6IFtdLFxuICAgIH07XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHByZXZpb3VzUG9pbnRzOiB0aGlzLnByb3BzLmVkZ2UucG9pbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgbW91bnQoZG9tTm9kZSkge1xuICAgIGlmIChkb21Ob2RlKSB7XG4gICAgICBkb21Ob2RlLmJlZ2luRWxlbWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBsZXQgZSA9IHRoaXMucHJvcHMuZWRnZTtcbiAgICBsZXQgbCA9IHRoaXMubGluZTtcbiAgICByZXR1cm4gKFxuICAgICAgPGcgY2xhc3NOYW1lPVwiZWRnZVwiIG1hcmtlckVuZD1cInVybCgjYXJyb3cpXCI+XG4gICAgICAgIDxwYXRoIGQ9e2woZS5wb2ludHMpfT5cbiAgICAgICAgICA8YW5pbWF0ZVxuICAgICAgICAgICAgcmVmPXt0aGlzLm1vdW50fVxuICAgICAgICAgICAga2V5PXtNYXRoLnJhbmRvbSgpfVxuICAgICAgICAgICAgcmVzdGFydD1cImFsd2F5c1wiXG4gICAgICAgICAgICBmcm9tPXtsKHRoaXMuc3RhdGUucHJldmlvdXNQb2ludHMpfVxuICAgICAgICAgICAgdG89e2woZS5wb2ludHMpfVxuICAgICAgICAgICAgYmVnaW49XCIwc1wiXG4gICAgICAgICAgICBkdXI9XCIwLjI1c1wiXG4gICAgICAgICAgICBmaWxsPVwiZnJlZXplXCJcbiAgICAgICAgICAgIHJlcGVhdENvdW50PVwiMVwiXG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lPVwiZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9wYXRoPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH1cbn1cblxuY29uc3Qgbm9kZURpc3BhdGNoID0gKG4pID0+IHtcbiAgbGV0IFR5cGUgPSBudWxsO1xuICBpZiAobi5pc01ldGFub2RlID09PSB0cnVlKSB7XG4gICAgaWYgKG4uaXNBbm9ueW1vdXMpIHtcbiAgICAgIFR5cGUgPSBBbm9ueW1vdXNNZXRhbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgVHlwZSA9IE1ldGFub2RlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBUeXBlID0gQXRvbU5vZGU7XG4gIH1cbiAgcmV0dXJuIFR5cGU7XG59O1xuXG5jb25zdCBOb2RlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IG4gPSBwcm9wcy5ub2RlO1xuICBjb25zdCB0eXBlID0gbi5pc01ldGFub2RlID8gXCJtZXRhbm9kZVwiIDogXCJub2RlXCI7XG5cbiAgY29uc3QgdHJhbnNsYXRlWCA9IE1hdGguZmxvb3Iobi54IC0gbi53aWR0aCAvIDIpO1xuICBjb25zdCB0cmFuc2xhdGVZID0gTWF0aC5mbG9vcihuLnkgLSBuLmhlaWdodCAvIDIpO1xuXG4gIHJldHVybiAoXG4gICAgPGdcbiAgICAgIGNsYXNzTmFtZT17YCR7dHlwZX0gJHtuLmNsYXNzfWB9XG4gICAgICAvLyBUT0RPOiBmaXggem9vbWluZ1xuICAgICAgLy8gb25DbGljaz17cHJvcHMub25DbGljay5iaW5kKHRoaXMsIHByb3BzLm5vZGUpfVxuICAgICAgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH0sJHt0cmFuc2xhdGVZfSlgfVxuICAgID5cbiAgICAgIDxmb3JlaWduT2JqZWN0IHdpZHRoPXtwcm9wcy5ub2RlLndpZHRofSBoZWlnaHQ9e3Byb3BzLm5vZGUuaGVpZ2h0fT5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHByb3BzLm5vZGUuc3R5bGVcbiAgICAgICAgICAgICAgPyBwcm9wcy5ub2RlLnN0eWxlLmZpbGxcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3hTaGFkb3c6IFwiMHB4IDBweCAwcHggMXB4IHdoaXRlXCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9mb3JlaWduT2JqZWN0PlxuICAgIDwvZz5cbiAgKTtcbn07XG5cbmNvbnN0IE1ldGFub2RlID0gKHByb3BzKSA9PiAoXG4gIDxOb2RlIHsuLi5wcm9wc30+XG4gICAgbXV1dXVcbiAgICB7LyogPHRleHRcbiAgICAgIHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgxMCwwKWB9XG4gICAgICB0ZXh0QW5jaG9yPVwic3RhcnRcIlxuICAgICAgc3R5bGU9e3sgZG9taW5hbnRCYXNlbGluZTogXCJpZGVvZ3JhcGhpY1wiIH19XG4gICAgPlxuICAgICAgPHRzcGFuIHg9XCIwXCIgY2xhc3NOYW1lPVwiaWRcIj5cbiAgICAgICAge3Byb3BzLm5vZGUudXNlckdlbmVyYXRlZElkfVxuICAgICAgPC90c3Bhbj5cbiAgICAgIDx0c3BhbiB4PVwiMFwiIGR5PVwiMS4yZW1cIj5cbiAgICAgICAge3Byb3BzLm5vZGUuY2xhc3N9XG4gICAgICA8L3RzcGFuPlxuICAgIDwvdGV4dD4gKi99XG4gIDwvTm9kZT5cbik7XG5cbmNvbnN0IEFub255bW91c01ldGFub2RlID0gKHByb3BzKSA9PiAoXG4gIDxOb2RlIHsuLi5wcm9wc30+XG4gICAgey8qIDx0ZXh0XG4gICAgICB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoMTAsMClgfVxuICAgICAgdGV4dEFuY2hvcj1cInN0YXJ0XCJcbiAgICAgIHN0eWxlPXt7IGRvbWluYW50QmFzZWxpbmU6IFwiaWRlb2dyYXBoaWNcIiB9fVxuICAgID5cbiAgICAgIDx0c3BhbiB4PVwiMFwiIGNsYXNzTmFtZT1cImlkXCI+XG4gICAgICAgIHtwcm9wcy5ub2RlLnVzZXJHZW5lcmF0ZWRJZH1cbiAgICAgIDwvdHNwYW4+XG4gICAgPC90ZXh0PiAqL31cbiAgPC9Ob2RlPlxuKTtcblxuY29uc3QgQXRvbU5vZGUgPSAocHJvcHMpID0+IChcbiAgPE5vZGUgey4uLnByb3BzfT5cbiAgICA8Tm9kZUNvbnRlbnQgbm9kZT17cHJvcHMubm9kZX0gLz5cbiAgPC9Ob2RlPlxuKTtcblxuY29uc3QgTm9kZUNvbnRlbnQgPSAoeyBub2RlIH0pID0+IHtcbiAgY29uc3QgaWQgPSBub2RlLnVzZXJHZW5lcmF0ZWRJZDtcbiAgaWYgKCFub2RlLmhhc093blByb3BlcnR5KFwicGFyYW1ldGVyc1wiKSkge1xuICAgIGNvbnNvbGUud2FybihcIldURlwiLCBub2RlKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcmFtcyA9XG4gICAgbm9kZS5wYXJhbWV0ZXJzLmxlbmd0aCAhPT0gMCA/IChcbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJnYmEoMCwgMCwgMCwgMC4yKVwiLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjAuOGVtXCIsXG4gICAgICAgICAgbWF4V2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICBwYWRkaW5nVG9wOiBcIjNweFwiLFxuICAgICAgICAgIHBhZGRpbmdCb3R0b206IFwiM3B4XCIsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDx0YWJsZVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIHtub2RlLnBhcmFtZXRlcnMubWFwKChba2V5LCB2YWx1ZV0sIGkpID0+IChcbiAgICAgICAgICAgICAgPHRyIGtleT17a2V5fT5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogXCIwLjI1ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7a2V5fVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPXt7IHBhZGRpbmdMZWZ0OiBcIjAuMjVlbVwiIH19Pnt2YWx1ZX08L3RkPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgICkgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgPGhlYWRlclxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHBhZGRpbmc6IFwiM3B4IDBcIixcbiAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtpZCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpZFwiIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH19PlxuICAgICAgICAgICAge2lkfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICA8ZGl2Pntub2RlLmNsYXNzfTwvZGl2PlxuICAgICAgPC9oZWFkZXI+XG4gICAgICB7cGFyYW1zfVxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICk7XG59O1xuIiwiZnVuY3Rpb24gcnVuKCkge1xuICBSZWFjdERPTS5yZW5kZXIoPElERS8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9uaWVsJykpO1xufVxuXG5jb25zdCBsb2FkZWRTdGF0ZXMgPSBbJ2NvbXBsZXRlJywgJ2xvYWRlZCcsICdpbnRlcmFjdGl2ZSddO1xuXG5pZiAobG9hZGVkU3RhdGVzLmluY2x1ZGVzKGRvY3VtZW50LnJlYWR5U3RhdGUpICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgcnVuKCk7XG59IGVsc2Uge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHJ1biwgZmFsc2UpO1xufSJdfQ==
\ No newline at end of file
diff --git a/src/scripts/Editor.jsx b/src/scripts/Editor.jsx
index a23eb7f..b4d5c12 100644
--- a/src/scripts/Editor.jsx
+++ b/src/scripts/Editor.jsx
@@ -65,7 +65,7 @@ class Editor extends React.Component{
this.editor.selection.on("changeCursor", this.onCursorPositionChanged.bind(this));
}
- componentWillReceiveProps(nextProps) {
+ UNSAFE_componentWillReceiveProps(nextProps) {
if (nextProps.issues) {
var annotations = nextProps.issues.map(issue => {
let position = this.editor.session.doc.indexToPosition(issue.position.start);
diff --git a/src/scripts/Interpreter.js b/src/scripts/Interpreter.js
index dfd3ef9..db01a3e 100644
--- a/src/scripts/Interpreter.js
+++ b/src/scripts/Interpreter.js
@@ -135,12 +135,22 @@ class Interpreter {
// this is doing too much – break into "not recognized", "success" and "ambiguous"
_LiteralNode(instance, state) {
- var node = {
+
+ const heights = {
+ id: 19,
+ class: 18,
+ parameterRow: 15,
+ parameterTablePadding: 2*3,
+ headerPadding: 5
+ };
+
+ const node = {
id: undefined,
class: "Unknown",
color: "darkgrey",
- height: 30,
+ height: 2 * heights.headerPadding + heights.class,
width: 100,
+ parameters: instance.parameters.map(p => [p.name, p.value.value]),
_source: instance,
};
@@ -183,7 +193,11 @@ class Interpreter {
} else {
node.id = instance.alias.value;
node.userGeneratedId = instance.alias.value;
- node.height = 50;
+ node.height += heights.id;
+ }
+
+ if (node.parameters.length > 0) {
+ node.height += heights.parameterTablePadding + (node.parameters.length * heights.parameterRow);
}
// is metanode
@@ -200,7 +214,13 @@ class Interpreter {
}
}
- const width = 20 + Math.max(...[node.class, node.userGeneratedId ? node.userGeneratedId : ""].map(string => pixelWidth(string, {size: 16})))
+ const left = Math.max(...node.parameters.map(([key, value]) => pixelWidth(key, { size:14 })));
+ const right = Math.max(...node.parameters.map(([key, value]) => pixelWidth(value, { size:14 })));
+ const widthParams = left + right;
+
+ const widthTitle = Math.max(...[node.class, node.userGeneratedId ? node.userGeneratedId : ""].map(string => pixelWidth(string, {size: 16})))
+
+ const width = 20 + Math.max(widthParams, widthTitle);
this.graph.createNode(node.id, {
...node,
diff --git a/src/scripts/Parser.js b/src/scripts/Parser.js
index 55c392a..c988721 100644
--- a/src/scripts/Parser.js
+++ b/src/scripts/Parser.js
@@ -63,13 +63,14 @@ class Parser{
list: list.eval()
}
},
- BlockParameters: function(_, list, __) {
- return list.eval()
+ BlockParameters: function(_, params, __) {
+ const p = params.eval();
+ return p[0] ? p[0] : p
},
Parameter: function(name, _, value) {
return {
kind: "Parameter",
- name: name.eval(),
+ name: name.source.contents,
value: value.eval()
}
},
diff --git a/src/scripts/VisualGraph.jsx b/src/scripts/VisualGraph.jsx
index 4e069f1..fde1278 100644
--- a/src/scripts/VisualGraph.jsx
+++ b/src/scripts/VisualGraph.jsx
@@ -1,266 +1,371 @@
-const zoom = require("d3-zoom")
+const zoom = require("d3-zoom");
-class VisualGraph extends React.Component{
- constructor(props) {
- super(props)
+class VisualGraph extends React.Component {
+ constructor(props) {
+ super(props);
- this.graphLayout = new GraphLayout(this.saveGraph.bind(this));
- this.state = {
- graph: null
- }
+ this.graphLayout = new GraphLayout(this.saveGraph.bind(this));
+ this.state = {
+ graph: null,
+ };
- this.svg = null
- this.group = null
+ this.svg = null;
+ this.group = null;
- this.currentZoom = null
- }
+ this.currentZoom = null;
+ }
- saveGraph(graph) {
- this.setState({ graph })
- }
+ saveGraph(graph) {
+ this.setState({ graph });
+ }
- componentWillReceiveProps(nextProps) {
- if (nextProps.graph) {
- nextProps.graph._label.rankdir = nextProps.layout
- this.graphLayout.layout(nextProps.graph)
- }
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ if (nextProps.graph) {
+ nextProps.graph._label.rankdir = nextProps.layout;
+ this.graphLayout.layout(nextProps.graph);
}
-
- shouldComponentUpdate(nextProps, nextState) {
- return (this.state !== nextState)
+ }
+
+ shouldComponentUpdate(nextProps, nextState) {
+ return this.state !== nextState;
+ }
+
+ handleClick(node) {
+ const selectedNode = node.id;
+ this.setState({ selectedNode });
+
+ const { width, height } = this.state.graph.graph();
+
+ const idealSize = (width, height, maxWidth, maxHeight) => {
+ const widthRatio = width / maxWidth;
+ const heightRatio = height / maxHeight;
+ const idealSize = widthRatio < heightRatio ? width : height;
+ // console.log(`[${width}, ${height}], [${maxWidth}, ${maxHeight}], ${widthRatio}, ${heightRatio}, ideal = ${idealSize}`)
+ return idealSize;
+ };
+
+ if (this.currentZoom === null) {
+ this.currentZoom = [
+ width / 2,
+ height / 2,
+ idealSize(width, height, width, height),
+ ];
}
-
- handleClick(node) {
- const selectedNode = node.id
- this.setState({ selectedNode })
-
- const { width, height } = this.state.graph.graph()
-
- const idealSize = (width, height, maxWidth, maxHeight) => {
- const widthRatio = width / maxWidth
- const heightRatio = height / maxHeight
- const idealSize = (widthRatio < heightRatio ? width : height)
- // console.log(`[${width}, ${height}], [${maxWidth}, ${maxHeight}], ${widthRatio}, ${heightRatio}, ideal = ${idealSize}`)
- return idealSize
- }
-
- if (this.currentZoom === null) {
- this.currentZoom = [ width / 2, height / 2, idealSize(width, height, width, height)]
- }
- const target = [node.x, node.y, idealSize(node.width, node.height, width, height)]
-
- this.transition(this.currentZoom, target, node)
-
- this.currentZoom = target
+ const target = [
+ node.x,
+ node.y,
+ idealSize(node.width, node.height, width, height),
+ ];
+
+ this.transition(this.currentZoom, target, node);
+
+ this.currentZoom = target;
+ }
+
+ transition(start, end, node) {
+ const { width, height } = this.state.graph.graph();
+
+ const center = {
+ x: width / 2,
+ y: height / 2,
+ };
+ const i = d3.interpolateZoom(start, end);
+
+ const transform = ([x, y, size]) => {
+ const scale = width / size;
+ const translateX = center.x - x * scale;
+ const translateY = center.y - y * scale;
+ return `translate(${translateX},${translateY})scale(${scale})`;
+ };
+
+ d3.select(this.group)
+ .attr("transform", transform(start))
+ .transition()
+ .duration(i.duration)
+ .attrTween("transform", () => (t) => transform(i(t)));
+ }
+
+ render() {
+ if (!this.state.graph) {
+ // console.log(this.state.graph)
+ return null;
}
- transition(start, end, node) {
- const { width, height } = this.state.graph.graph()
-
- const center = {
- x: width / 2,
- y: height / 2
- }
- const i = d3.interpolateZoom(start, end)
-
- const transform = ([x, y, size]) => {
- const scale = width / size
- const translateX = center.x - x * scale
- const translateY = center.y - y * scale
- return `translate(${translateX},${translateY})scale(${scale})`
- }
-
- d3.select(this.group)
- .attr("transform", transform(start))
- .transition()
- .duration(i.duration)
- .attrTween("transform", () => ( (t) => transform(i(t)) ))
- }
-
- render() {
- if (!this.state.graph) {
- // console.log(this.state.graph)
- return null
- }
-
- const g = this.state.graph
-
- const nodes = g.nodes().map(nodeName => {
- const n = g.node(nodeName)
- const props = {
- key: nodeName,
- node: n,
- onClick: this.handleClick.bind(this)
- }
-
- const Type = nodeDispatch(n)
-
- return
- })
-
- const edges = g.edges().map(edgeName => {
- const e = g.edge(edgeName);
- return ${edgeName.w}`} edge={e}/>
- })
-
- const { width, height } = g.graph()
-
- return (
-
- );
- }
+ const g = this.state.graph;
+
+ const nodes = g.nodes().map((nodeName) => {
+ const n = g.node(nodeName);
+ const props = {
+ key: nodeName,
+ node: n,
+ onClick: this.handleClick.bind(this),
+ };
+
+ const Type = nodeDispatch(n);
+
+ return ;
+ });
+
+ const edges = g.edges().map((edgeName) => {
+ const e = g.edge(edgeName);
+ return ${edgeName.w}`} edge={e} />;
+ });
+
+ const { width, height } = g.graph();
+
+ return (
+
+ );
+ }
}
const Arrow = () => (
-
-
-
-)
-
-class Edge extends React.Component{
- line = d3.line()
- .curve(d3.curveBasis)
- .x(d => d.x)
- .y(d => d.y)
-
- constructor(props) {
- super(props);
- this.state = {
- previousPoints: []
- }
- }
-
- componentWillReceiveProps(nextProps) {
- this.setState({
- previousPoints: this.props.edge.points
- });
- }
-
- mount(domNode) {
- if (domNode) {
- domNode.beginElement()
- }
- }
-
- render() {
- let e = this.props.edge;
- let l = this.line;
- return (
-
-
-
-
-
- );
+
+
+
+);
+
+class Edge extends React.Component {
+ line = d3
+ .line()
+ .curve(d3.curveBasis)
+ .x((d) => d.x)
+ .y((d) => d.y);
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ previousPoints: [],
+ };
+ }
+
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ this.setState({
+ previousPoints: this.props.edge.points,
+ });
+ }
+
+ mount(domNode) {
+ if (domNode) {
+ domNode.beginElement();
}
+ }
+
+ render() {
+ let e = this.props.edge;
+ let l = this.line;
+ return (
+
+
+
+
+
+ );
+ }
}
const nodeDispatch = (n) => {
- let Type = null
- if (n.isMetanode === true) {
- if (n.isAnonymous) {
- Type = AnonymousMetanode
- } else {
- Type = Metanode
- }
+ let Type = null;
+ if (n.isMetanode === true) {
+ if (n.isAnonymous) {
+ Type = AnonymousMetanode;
} else {
- if (n.userGeneratedId) {
- Type = IdentifiedNode
- } else {
- Type = AnonymousNode
- }
- }
- return Type
-}
-
-class Node extends React.Component {
- render() {
- const n = this.props.node
- const type = n.isMetanode ? "metanode" : "node"
-
- const translateX = Math.floor(n.x -(n.width / 2))
- const translateY = Math.floor(n.y -(n.height / 2))
-
- return (
-
-
- {this.props.children}
-
- );
- }
-}
-
-class Metanode extends Node {
- render() {
- const n = this.props.node
- return (
-
-
- {n.userGeneratedId}
- {n.class}
-
-
- )
- }
-}
-
-class AnonymousMetanode extends Node {
- render() {
- const n = this.props.node
- return (
-
-
- {n.userGeneratedId}
-
-
- )
- }
-}
-
-class AnonymousNode extends Node {
- render() {
- const n = this.props.node
- return (
-
-
- {n.class}
-
-
- )
- }
-}
-
-class IdentifiedNode extends Node {
- render() {
- const n = this.props.node
- return (
-
-
- {n.userGeneratedId}
- {n.class}
-
-
- )
+ Type = Metanode;
}
-}
\ No newline at end of file
+ } else {
+ Type = AtomNode;
+ }
+ return Type;
+};
+
+const Node = (props) => {
+ const n = props.node;
+ const type = n.isMetanode ? "metanode" : "node";
+
+ const translateX = Math.floor(n.x - n.width / 2);
+ const translateY = Math.floor(n.y - n.height / 2);
+
+ return (
+
+
+
+
+
+ );
+};
+
+const Metanode = (props) => (
+
+ muuuu
+ {/*
+
+ {props.node.userGeneratedId}
+
+
+ {props.node.class}
+
+ */}
+
+);
+
+const AnonymousMetanode = (props) => (
+
+ {/*
+
+ {props.node.userGeneratedId}
+
+ */}
+
+);
+
+const AtomNode = (props) => (
+
+
+
+);
+
+const NodeContent = ({ node }) => {
+ const id = node.userGeneratedId;
+ if (!node.hasOwnProperty("parameters")) {
+ console.warn("WTF", node);
+ return null;
+ }
+
+ const params =
+ node.parameters.length !== 0 ? (
+
+
+
+ {node.parameters.map(([key, value], i) => (
+
+ |
+ {key}
+ |
+ {value} |
+
+ ))}
+
+
+
+ ) : null;
+
+ return (
+
+
+ {id && (
+
+ {id}
+
+ )}
+ {node.class}
+
+ {params}
+
+ );
+};
diff --git a/src/styles/main.sass b/src/styles/main.sass
index c69d1db..c673cde 100644
--- a/src/styles/main.sass
+++ b/src/styles/main.sass
@@ -109,8 +109,8 @@ g.node, g.metanode
animation: fade-in 0.25s linear
rect
- rx: 15
- ry: 15
+ rx: 12
+ ry: 12
stroke: white
stroke-width: 1px
transition: width 0.25s linear, height 0.25s linear, stroke 0.1s ease-in-out, stroke-width 0.1s ease-in-out