@tscircuit/cli 0.1.38 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lock
CHANGED
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
"@tscircuit/runframe": "^0.0.167",
|
|
10
10
|
"bun-match-svg": "^0.0.9",
|
|
11
11
|
"chokidar": "4.0.1",
|
|
12
|
+
"circuit-json-to-readable-netlist": "^0.0.8",
|
|
12
13
|
"circuit-to-svg": "^0.0.101",
|
|
13
14
|
"commander": "^12.1.0",
|
|
14
15
|
"configstore": "^7.0.0",
|
|
15
16
|
"cosmiconfig": "^9.0.0",
|
|
16
17
|
"delay": "^6.0.0",
|
|
18
|
+
"dsn-converter": "^0.0.63",
|
|
17
19
|
"jwt-decode": "^4.0.0",
|
|
18
20
|
"ky": "^1.7.4",
|
|
19
21
|
"make-vfs": "^1.0.15",
|
|
@@ -776,7 +778,7 @@
|
|
|
776
778
|
|
|
777
779
|
"circuit-json-to-pnp-csv": ["circuit-json-to-pnp-csv@0.0.6", "", { "dependencies": { "papaparse": "^5.4.1" }, "peerDependencies": { "@tscircuit/soup-util": "*", "typescript": "^5.0.0" } }, "sha512-E5bbw0EfOk+6DUaldmsaogzfFni91IwBHI6hzQTbS1qczhqMmUNYkRTpePqa3ewZ12oLLURLbHnd9HDGjxlJ+w=="],
|
|
778
780
|
|
|
779
|
-
"circuit-json-to-readable-netlist": ["circuit-json-to-readable-netlist@0.0.
|
|
781
|
+
"circuit-json-to-readable-netlist": ["circuit-json-to-readable-netlist@0.0.8", "", { "dependencies": { "@tscircuit/core": "^0.0.299", "@tscircuit/soup-util": "^0.0.41", "circuit-json-to-connectivity-map": "^0.0.17" }, "peerDependencies": { "typescript": "^5.7.2" } }, "sha512-RDBU1Uvn3xPQFfT6hGgyFuFnMD6l1Q86KN/KhaqJo6JXkddb4VkiiIBKH+cmTntGDMEjDp5YgDzCVjLhAWbMEg=="],
|
|
780
782
|
|
|
781
783
|
"circuit-json-to-tscircuit": ["circuit-json-to-tscircuit@0.0.4", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-LpHbOwdPE4+CooWPAPoKXWs4vxTrjJgu/avnxE3AqGwCD9r0ZnT73mEAB9oQi6T1i7T53zdkSR6y+zpsyCSE7g=="],
|
|
782
784
|
|
|
@@ -936,7 +938,7 @@
|
|
|
936
938
|
|
|
937
939
|
"draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="],
|
|
938
940
|
|
|
939
|
-
"dsn-converter": ["dsn-converter@0.0.
|
|
941
|
+
"dsn-converter": ["dsn-converter@0.0.63", "", { "dependencies": { "@tscircuit/soup-util": "^0.0.41", "debug": "^4.3.7", "uuid": "^10.0.0", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*", "typescript": "^5.0.0" } }, "sha512-MrAFWW1WCaJ+1WQIG6ghCtzJSqammn98HmA6DDS+1x44x/ke5d+LF27LU802D0gM7ouksHhtCu0c/28ZYr6Tww=="],
|
|
940
942
|
|
|
941
943
|
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
|
942
944
|
|
|
@@ -1996,6 +1998,10 @@
|
|
|
1996
1998
|
|
|
1997
1999
|
"@tscircuit/fake-snippets/circuit-json": ["circuit-json@0.0.135", "", { "dependencies": { "nanoid": "^5.0.7", "zod": "^3.23.6" } }, "sha512-jiuLnXHfa6tb1EZHaDsS6TQ8AivxTOan5ldvJOV2+hLBVfuRPPMrZ45/y5hQqhZR/cetLd6yDqwAerYvTepxKw=="],
|
|
1998
2000
|
|
|
2001
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist": ["circuit-json-to-readable-netlist@0.0.7", "", { "dependencies": { "@tscircuit/core": "^0.0.286", "@tscircuit/soup-util": "^0.0.41", "circuit-json-to-connectivity-map": "^0.0.17" }, "peerDependencies": { "typescript": "^5.7.2" } }, "sha512-GvlVMzEzLpB9WTsLkN4p5aHITjKhfEOQKFjZaUNQrd3FbyFbUXnx1e8vR1cB2M0fQXwaUQ0cxGTjK3W2AihKng=="],
|
|
2002
|
+
|
|
2003
|
+
"@tscircuit/fake-snippets/dsn-converter": ["dsn-converter@0.0.60", "", { "dependencies": { "@tscircuit/soup-util": "^0.0.41", "debug": "^4.3.7", "uuid": "^10.0.0", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*", "typescript": "^5.0.0" } }, "sha512-7sbh7VeRxGjFCDe532lcpaj/Zk9kGn+RUTDu2yMaYnyal8mGFhVlKk7MDfo5C5Y44bxY3HVcLYtfJt8hoEDxPQ=="],
|
|
2004
|
+
|
|
1999
2005
|
"@tscircuit/pcb-viewer/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.10", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-v8d5AcdTL1Bn856PfKBPt90AvB3Mk92kKhS5pPss6KpdVU9vHaUldZGfzWchQhyPcgvWwiWk2to1NKJGNmxgTg=="],
|
|
2000
2006
|
|
|
2001
2007
|
"@tscircuit/pcb-viewer/circuit-json-to-connectivity-map": ["circuit-json-to-connectivity-map@0.0.18", "", { "dependencies": { "@tscircuit/math-utils": "^0.0.9" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-0NH8nlYAxzGsVRtAho4FjI3JocXSDVp93t5rveJG21p0ckxCR7iIeEZOKcb0nndxhJ3fxctXWv7eJpyFIrAlPw=="],
|
|
@@ -2040,7 +2046,7 @@
|
|
|
2040
2046
|
|
|
2041
2047
|
"circuit-json-to-connectivity-map/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.4", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-8Bu/C+go95Zk9AXb4Pe37OgObGhOd5F7UIzXV+u1PKuhpJpGjr+X/WHBzSI7xHrBSvwsf39/Luooe4b3djuzgQ=="],
|
|
2042
2048
|
|
|
2043
|
-
"circuit-json-to-readable-netlist/@tscircuit/core": ["@tscircuit/core@0.0.
|
|
2049
|
+
"circuit-json-to-readable-netlist/@tscircuit/core": ["@tscircuit/core@0.0.299", "", { "dependencies": { "@lume/kiwi": "^0.4.3", "@tscircuit/footprinter": "^0.0.97", "@tscircuit/infgrid-ijump-astar": "^0.0.33", "@tscircuit/math-utils": "^0.0.9", "@tscircuit/props": "^0.0.137", "@tscircuit/schematic-autolayout": "^0.0.6", "@tscircuit/soup-util": "^0.0.41", "circuit-json": "^0.0.135", "circuit-json-to-connectivity-map": "^0.0.17", "format-si-unit": "^0.0.3", "nanoid": "^5.0.7", "performance-now": "^2.1.0", "react-reconciler": "^0.31.0", "react-reconciler-18": "npm:react-reconciler@0.29.2", "schematic-symbols": "^0.0.113", "transformation-matrix": "^2.16.1", "zod": "^3.23.8" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-qTTZr4j5HP0NCb8wIs0JbfWPRaSM/e5EP79nnCvyEQPWMHV+lXz7grLphtSfSjM4m7AwG3JugDhCiRKeaqXtQQ=="],
|
|
2044
2050
|
|
|
2045
2051
|
"circuit-to-svg/@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.91", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "@tscircuit/soup": "*", "circuit-json": "*" } }, "sha512-6H3CYXNPJlIcT9BLpeC8I18RdsmolkEWAt2ih4RgT3MwTEjNxmJOr6alppXvGUXdw0zu/QOwAOF/NxAUqlxBFQ=="],
|
|
2046
2052
|
|
|
@@ -2184,6 +2190,8 @@
|
|
|
2184
2190
|
|
|
2185
2191
|
"@tscircuit/3d-viewer/jscad-fiber/lucide-react": ["lucide-react@0.456.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA=="],
|
|
2186
2192
|
|
|
2193
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core": ["@tscircuit/core@0.0.286", "", { "dependencies": { "@lume/kiwi": "^0.4.3", "@tscircuit/footprinter": "^0.0.97", "@tscircuit/infgrid-ijump-astar": "^0.0.33", "@tscircuit/math-utils": "^0.0.9", "@tscircuit/props": "^0.0.136", "@tscircuit/schematic-autolayout": "^0.0.6", "@tscircuit/soup-util": "^0.0.41", "circuit-json": "^0.0.134", "circuit-json-to-connectivity-map": "^0.0.17", "format-si-unit": "^0.0.2", "nanoid": "^5.0.7", "performance-now": "^2.1.0", "react-reconciler": "^0.31.0", "react-reconciler-18": "npm:react-reconciler@0.29.2", "schematic-symbols": "^0.0.113", "transformation-matrix": "^2.16.1", "zod": "^3.23.8" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-ib4Yg0yx7tbdGsq76tpwqV4FpM5oZEqXC/idC7cUeOPwuv5/R6HkHnNkgQC2ZIqirTxEG/tjmc6V/nRcizjIIQ=="],
|
|
2194
|
+
|
|
2187
2195
|
"@tscircuit/pcb-viewer/circuit-json-to-connectivity-map/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.9", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-sPzfXndijet8z29X6f5vnSZddiso2tRg7m6rB+268bVj60mxnxUMD14rKuMlLn6n84fMOpD/X7pRTZUfi6M+Tg=="],
|
|
2188
2196
|
|
|
2189
2197
|
"@tscircuit/pcb-viewer/circuit-to-svg/@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.57", "", { "dependencies": { "@tscircuit/mm": "^0.0.7", "zod": "^3.23.8" }, "peerDependencies": { "@tscircuit/soup": "*" } }, "sha512-aLUuh3LqeDusjTzp6nyOqss6Et4adTVeCGJpvvq3dosuyfdk5L79l64jdNFK0Bf5fps1SJAHISpPC4nDSJEVfw=="],
|
|
@@ -2250,9 +2258,11 @@
|
|
|
2250
2258
|
|
|
2251
2259
|
"circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.9", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-sPzfXndijet8z29X6f5vnSZddiso2tRg7m6rB+268bVj60mxnxUMD14rKuMlLn6n84fMOpD/X7pRTZUfi6M+Tg=="],
|
|
2252
2260
|
|
|
2253
|
-
"circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/props": ["@tscircuit/props@0.0.
|
|
2261
|
+
"circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/props": ["@tscircuit/props@0.0.137", "", { "peerDependencies": { "@tscircuit/layout": "*", "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-UJRX5JIqtmKnXtqrm+lLtpZl/CDX22jz7ltJgjSM9xDULT+nTSApHU0Sqp3EvQ7J63AD+8uzLHfrvUar4uno1Q=="],
|
|
2254
2262
|
|
|
2255
|
-
"circuit-json-to-readable-netlist/@tscircuit/core/circuit-json": ["circuit-json@0.0.
|
|
2263
|
+
"circuit-json-to-readable-netlist/@tscircuit/core/circuit-json": ["circuit-json@0.0.135", "", { "dependencies": { "nanoid": "^5.0.7", "zod": "^3.23.6" } }, "sha512-jiuLnXHfa6tb1EZHaDsS6TQ8AivxTOan5ldvJOV2+hLBVfuRPPMrZ45/y5hQqhZR/cetLd6yDqwAerYvTepxKw=="],
|
|
2264
|
+
|
|
2265
|
+
"circuit-json-to-readable-netlist/@tscircuit/core/format-si-unit": ["format-si-unit@0.0.3", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-rhw1g1mOoLV497FtKNbzBPE4fJXfWRmIEPRO0DKXpEPvS54vRLjG8e1jE4vOcjZg4bsoOPJkM9jB6yGk+0XKmQ=="],
|
|
2256
2266
|
|
|
2257
2267
|
"circuit-json-to-readable-netlist/@tscircuit/core/react-reconciler": ["react-reconciler@0.31.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ=="],
|
|
2258
2268
|
|
|
@@ -2336,6 +2346,20 @@
|
|
|
2336
2346
|
|
|
2337
2347
|
"@tscircuit/3d-viewer/@tscircuit/core/react-reconciler/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="],
|
|
2338
2348
|
|
|
2349
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.97", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-LeqjpXqPwR++kcshlfe0E3IOsv0Y9BVRjIllDaHFA2OM+gJ91z/SS3CdweXB+qtF4t9G+8MLKf4nU5L1HDGjmg=="],
|
|
2350
|
+
|
|
2351
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/infgrid-ijump-astar": ["@tscircuit/infgrid-ijump-astar@0.0.33", "", {}, "sha512-tmX4Esp+HqyIGCUD43steVUH8pKRuyBNs21r4NlApGGLu+K1XSrK9FinhVJyMiEsuwJdajLnMTzmVt8vSYSafA=="],
|
|
2352
|
+
|
|
2353
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.9", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-sPzfXndijet8z29X6f5vnSZddiso2tRg7m6rB+268bVj60mxnxUMD14rKuMlLn6n84fMOpD/X7pRTZUfi6M+Tg=="],
|
|
2354
|
+
|
|
2355
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/props": ["@tscircuit/props@0.0.136", "", { "peerDependencies": { "@tscircuit/layout": "*", "circuit-json": "*", "react": "*", "zod": "*" } }, "sha512-YC0T8S+U95IIu+734JsIKpIFKm9pEC3imULYk/9WZoIgCNoiAPcLHnqiVnFYHQFPc0KgT6xXCgWer8/guAU0xw=="],
|
|
2356
|
+
|
|
2357
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/circuit-json": ["circuit-json@0.0.134", "", { "dependencies": { "nanoid": "^5.0.7", "zod": "^3.23.6" } }, "sha512-guGLYrvducP6hquR/kyTA+3tOfvpo9vb7e42fUqukpcnbdq/irzxrbbukHSy4Op9MlqjdASKekjnBUmg8xO2pQ=="],
|
|
2358
|
+
|
|
2359
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/react-reconciler": ["react-reconciler@0.31.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ=="],
|
|
2360
|
+
|
|
2361
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/schematic-symbols": ["schematic-symbols@0.0.113", "", { "peerDependencies": { "typescript": "^5.5.4" } }, "sha512-3fVsjAgn9ukmCfNn3q8iii4yFxvmeF0mpRuCplDYwwP4Yo6T6ElzsrkTj+QurljspDF7zTvxxlT+uZQQuVmvYg=="],
|
|
2362
|
+
|
|
2339
2363
|
"@tscircuit/pcb-viewer/circuit-to-svg/@tscircuit/footprinter/@tscircuit/mm": ["@tscircuit/mm@0.0.7", "", { "dependencies": { "convert-units": "^2.3.4" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-5lZjeOsrkQDnMd4OEuXQYC8k+zuWCbX9Ruq69JhcvLu18FUen3pPjBxmFyF2DGZYxaTrKUpUdZvoTr49TISN2g=="],
|
|
2340
2364
|
|
|
2341
2365
|
"@tscircuit/runframe/@tscircuit/3d-viewer/jscad-electronics/@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.87", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "@tscircuit/soup": "*", "circuit-json": "*" } }, "sha512-SSsbC/G9kPf63Eke0EuF7l9V2pLCTWTNmLhGMglQmXfNUogDE6QCRjLHmgYrl2ignB+dIW9JbkKiqVFhXugFEw=="],
|
|
@@ -2360,6 +2384,8 @@
|
|
|
2360
2384
|
|
|
2361
2385
|
"rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
|
|
2362
2386
|
|
|
2387
|
+
"@tscircuit/fake-snippets/circuit-json-to-readable-netlist/@tscircuit/core/react-reconciler/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="],
|
|
2388
|
+
|
|
2363
2389
|
"@tscircuit/schematic-viewer/@tscircuit/core/circuit-to-svg/@tscircuit/footprinter/@tscircuit/mm": ["@tscircuit/mm@0.0.7", "", { "dependencies": { "convert-units": "^2.3.4" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-5lZjeOsrkQDnMd4OEuXQYC8k+zuWCbX9Ruq69JhcvLu18FUen3pPjBxmFyF2DGZYxaTrKUpUdZvoTr49TISN2g=="],
|
|
2364
2390
|
}
|
|
2365
2391
|
}
|
package/cli/export/register.ts
CHANGED
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
convertCircuitJsonToSchematicSvg,
|
|
9
9
|
convertCircuitJsonToPcbSvg,
|
|
10
10
|
} from "circuit-to-svg"
|
|
11
|
+
import { convertCircuitJsonToDsnString } from "dsn-converter"
|
|
12
|
+
import { convertCircuitJsonToReadableNetlist } from "circuit-json-to-readable-netlist"
|
|
11
13
|
|
|
12
14
|
const ALLOWED_FORMATS = [
|
|
13
15
|
"json",
|
|
@@ -93,6 +95,12 @@ circuit.add(<MyCircuit />)
|
|
|
93
95
|
case "pcb-svg":
|
|
94
96
|
outputContent = convertCircuitJsonToPcbSvg(circuitJson)
|
|
95
97
|
break
|
|
98
|
+
case "specctra-dsn":
|
|
99
|
+
outputContent = convertCircuitJsonToDsnString(circuitJson)
|
|
100
|
+
break
|
|
101
|
+
case "readable-netlist":
|
|
102
|
+
outputContent = convertCircuitJsonToReadableNetlist(circuitJson)
|
|
103
|
+
break
|
|
96
104
|
default:
|
|
97
105
|
outputContent = JSON.stringify(circuitJson)
|
|
98
106
|
}
|
package/dist/main.js
CHANGED
|
@@ -265,7 +265,7 @@ var package_default = {
|
|
|
265
265
|
name: "@tscircuit/cli",
|
|
266
266
|
main: "dist/main.js",
|
|
267
267
|
type: "module",
|
|
268
|
-
version: "0.1.
|
|
268
|
+
version: "0.1.38",
|
|
269
269
|
bin: {
|
|
270
270
|
tsci: "./dist/main.js"
|
|
271
271
|
},
|
|
@@ -299,11 +299,13 @@ var package_default = {
|
|
|
299
299
|
"@tscircuit/runframe": "^0.0.167",
|
|
300
300
|
"bun-match-svg": "^0.0.9",
|
|
301
301
|
chokidar: "4.0.1",
|
|
302
|
+
"circuit-json-to-readable-netlist": "^0.0.8",
|
|
302
303
|
"circuit-to-svg": "^0.0.101",
|
|
303
304
|
commander: "^12.1.0",
|
|
304
305
|
configstore: "^7.0.0",
|
|
305
306
|
cosmiconfig: "^9.0.0",
|
|
306
307
|
delay: "^6.0.0",
|
|
308
|
+
"dsn-converter": "^0.0.63",
|
|
307
309
|
"jwt-decode": "^4.0.0",
|
|
308
310
|
ky: "^1.7.4",
|
|
309
311
|
"make-vfs": "^1.0.15",
|
|
@@ -1102,6 +1104,8 @@ import {
|
|
|
1102
1104
|
convertCircuitJsonToSchematicSvg,
|
|
1103
1105
|
convertCircuitJsonToPcbSvg
|
|
1104
1106
|
} from "circuit-to-svg";
|
|
1107
|
+
import { convertCircuitJsonToDsnString } from "dsn-converter";
|
|
1108
|
+
import { convertCircuitJsonToReadableNetlist } from "circuit-json-to-readable-netlist";
|
|
1105
1109
|
var ALLOWED_FORMATS = [
|
|
1106
1110
|
"json",
|
|
1107
1111
|
"circuit-json",
|
|
@@ -1168,6 +1172,12 @@ circuit.add(<MyCircuit />)
|
|
|
1168
1172
|
case "pcb-svg":
|
|
1169
1173
|
outputContent = convertCircuitJsonToPcbSvg(circuitJson);
|
|
1170
1174
|
break;
|
|
1175
|
+
case "specctra-dsn":
|
|
1176
|
+
outputContent = convertCircuitJsonToDsnString(circuitJson);
|
|
1177
|
+
break;
|
|
1178
|
+
case "readable-netlist":
|
|
1179
|
+
outputContent = convertCircuitJsonToReadableNetlist(circuitJson);
|
|
1180
|
+
break;
|
|
1171
1181
|
default:
|
|
1172
1182
|
outputContent = JSON.stringify(circuitJson);
|
|
1173
1183
|
}
|
|
@@ -1239,4 +1249,4 @@ if (process.argv.length === 2) {
|
|
|
1239
1249
|
export {
|
|
1240
1250
|
program
|
|
1241
1251
|
};
|
|
1242
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtZ2l0aWdub3JlLWZpbGUudHMiLCAiLi4vbGliL3NoYXJlZC9nZW5lcmF0ZS1wYWNrYWdlLWpzb24udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCJsaWIvc2hhcmVkL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5pbXBvcnQgeyBnZW5lcmF0ZUdpdElnbm9yZUZpbGUgfSBmcm9tIFwibGliL3NoYXJlZC9nZW5lcmF0ZS1naXRpZ25vcmUtZmlsZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtcGFja2FnZS1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vbmUgaXMgcHJvdmlkZWQpXCIsXG4gICAgKVxuICAgIC5hcmd1bWVudChcbiAgICAgIFwiW2RpcmVjdG9yeV1cIixcbiAgICAgIFwiRGlyZWN0b3J5IG5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeSlcIixcbiAgICApXG4gICAgLmFjdGlvbigoZGlyZWN0b3J5Pzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gZGlyZWN0b3J5XG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGRpcmVjdG9yeSlcbiAgICAgICAgOiBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgZnMubWtkaXJTeW5jKHByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIC8vIENyZWF0ZSBlc3NlbnRpYWwgcHJvamVjdCBmaWxlc1xuICAgICAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyLCBcImluZGV4LnRzeFwiKSxcbiAgICAgICAgYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3IgcmVzaXN0YW5jZT1cIjFrXCIgZm9vdHByaW50PVwiMDQwMlwiIG5hbWU9XCJSMVwiIHNjaFg9ezN9IHBjYlg9ezN9IC8+XG4gICAgPGNhcGFjaXRvciBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiQzFcIiBzY2hYPXstM30gcGNiWD17LTN9IC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAsXG4gICAgICApXG5cbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCIubnBtcmNcIiksXG4gICAgICAgIGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAsXG4gICAgICApXG5cbiAgICAgIC8vIEdlbmVyYXRlIHBhY2thZ2UuanNvblxuICAgICAgZ2VuZXJhdGVQYWNrYWdlSnNvbihwcm9qZWN0RGlyKVxuICAgICAgLy8gR2VuZXJhdGUgdHNjb25maWcuanNvblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhwcm9qZWN0RGlyKVxuICAgICAgLy8gQ3JlYXRlIC5naXRpZ25vcmUgZmlsZVxuICAgICAgZ2VuZXJhdGVHaXRJZ25vcmVGaWxlKHByb2plY3REaXIpXG4gICAgICAvLyBTZXR1cCBwcm9qZWN0IGRlcGVuZGVuY2llc1xuICAgICAgc2V0dXBUc2NpUHJvamVjdChwcm9qZWN0RGlyKVxuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBcdUQ4M0NcdURGODkgSW5pdGlhbGl6YXRpb24gY29tcGxldGUhIFJ1biAke2RpcmVjdG9yeSA/IGBcImNkICR7ZGlyZWN0b3J5fVwiICYgYCA6IFwiXCJ9XCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuIiwgImltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0LXBrZy1tYW5hZ2VyXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFRzY2lQcm9qZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuICBkZXBlbmRlbmNpZXMgPSBbXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHNjaXJjdWl0L2NvcmVcIl0sXG4pIHtcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgZnMubWtkaXJTeW5jKHByb2plY3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsaXppbmcgcHJvamVjdCBpbiAke3Byb2plY3RQYXRofS4uLmApXG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKFwicGFja2FnZS5qc29uXCIpKSB7XG4gICAgY29uc3QgaW5pdENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gXCJ5YXJuIGluaXQgLXlcIlxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gXCJwbnBtIGluaXRcIlxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gXCJidW4gaW5pdCAteVwiXG4gICAgICAgICAgICA6IFwibnBtIGluaXQgLXlcIlxuXG4gICAgZXhlY1N5bmMoaW5pdENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJQcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIC8vIFJlYWQgYW5kIG1vZGlmeSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBcInBhY2thZ2UuanNvblwiKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSlcblxuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpKVxuICBjb25zb2xlLmxvZyhcIlVwZGF0ZWQgcGFja2FnZS5qc29uIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBmaWVsZHMuXCIpXG5cbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIGNvbnN0IGluc3RhbGxDb21tYW5kID1cbiAgICAgIHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIlxuICAgICAgICA/IGB5YXJuIGFkZCAtRCAke2RlcGVuZGVuY2llcy5qb2luKFwiIFwiKX1gXG4gICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwicG5wbVwiXG4gICAgICAgICAgPyBgcG5wbSBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gYGJ1biBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICAgICAgOiBgbnBtIGluc3RhbGwgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuXG4gICAgZXhlY1N5bmMoaW5zdGFsbENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJEZXBlbmRlbmNpZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lIHx8IFwidW5rbm93blwiXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5cbi8vIEdlbmVyYXRlIGEgUmVhY3QtY29tcGF0aWJsZSB0c2NvbmZpZy5qc29uXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVUc0NvbmZpZyA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCB0c2NvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInRzY29uZmlnLmpzb25cIilcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoXG4gICAge1xuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIHRhcmdldDogXCJFUzZcIixcbiAgICAgICAgbW9kdWxlOiBcIkVTTmV4dFwiLFxuICAgICAgICBqc3g6IFwicmVhY3QtanN4XCIsXG4gICAgICAgIG91dERpcjogXCJkaXN0XCIsXG4gICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBcIm5vZGVcIixcbiAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBudWxsLFxuICAgIDIsXG4gIClcbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHModHNjb25maWdQYXRoLCB0c2NvbmZpZ0NvbnRlbnQpXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbmV4cG9ydCBjb25zdCB3cml0ZUZpbGVJZk5vdEV4aXN0cyA9IChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQudHJpbVN0YXJ0KCksIFwidXRmLThcIilcbiAgICBjb25zb2xlLmluZm8oYENyZWF0ZWQ6ICR7ZmlsZVBhdGh9YClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXBwZWQ6ICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuIiwgImltcG9ydCB7IHdyaXRlRmlsZUlmTm90RXhpc3RzIH0gZnJvbSBcIi4vd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVHaXRJZ25vcmVGaWxlID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGdpdGlnbm9yZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcIi5naXRpZ25vcmVcIilcbiAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IGAjIERlcGVuZGVuY2llc1xubm9kZV9tb2R1bGVzL1xuXG4jIEJ1aWxkIG91dHB1dFxuZGlzdC9cbmJ1aWxkL1xuXG4jIEVudmlyb25tZW50IHZhcmlhYmxlc1xuLmVudlxuLmVudi5sb2NhbFxuLmVudi4qLmxvY2FsXG5cbiMgSURFIGZpbGVzXG4udnNjb2RlL1xuLmlkZWEvXG4qLnN3cFxuKi5zd29cblxuIyBPUyBmaWxlc1xuLkRTX1N0b3JlXG5UaHVtYnMuZGJcblxuIyBEZWJ1ZyBsb2dzXG5ucG0tZGVidWcubG9nKlxueWFybi1kZWJ1Zy5sb2cqXG55YXJuLWVycm9yLmxvZypcbmBcblxuICB3cml0ZUZpbGVJZk5vdEV4aXN0cyhnaXRpZ25vcmVQYXRoLCBnaXRpZ25vcmVDb250ZW50KVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVBhY2thZ2VKc29uID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpXG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHtcbiAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKGRpciksXG4gICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkEgVFNDaXJjdWl0IHByb2plY3RcIixcbiAgICBtYWluOiBcImluZGV4LnRzeFwiLFxuICAgIGtleXdvcmRzOiBbXCJ0c2NpcmN1aXRcIiwgXCJlbGVjdHJvbmljc1wiXSxcbiAgICBzY3JpcHRzOiB7XG4gICAgICBkZXY6IFwidHNjaSBkZXZcIixcbiAgICAgIGJ1aWxkOiBcInRzY2kgYnVpbGRcIixcbiAgICB9LFxuICB9XG5cbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uQ29udGVudCwgbnVsbCwgMiksXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcbmltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiUkVRVUVTVF9UT19TQVZFX1NOSVBQRVRcIixcbiAgICAgIHRoaXMuc2F2ZVNuaXBwZXQuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVTbmlwcGV0KCkge1xuICAgIGNvbnN0IHBvc3RFdmVudCA9IGFzeW5jIChcbiAgICAgIGV2ZW50OiBcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIiB8IFwiU05JUFBFVF9TQVZFRFwiLFxuICAgICkgPT5cbiAgICAgIHRoaXMuZnNLeS5wb3N0KFwiYXBpL2V2ZW50cy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IGV2ZW50X3R5cGU6IGV2ZW50IH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuXG4gICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgICBvbkV4aXQ6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgIHBvc3RFdmVudChcIlNOSVBQRVRfU0FWRURcIilcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBcIkxvY2FsIHJ1bmZyYW1lIHN0YW5kYWxvbmUgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gdmVyc2lvbi5cIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHNlcnZlcjogaHR0cC5TZXJ2ZXIgfT4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSh7IHNlcnZlciB9KVxuICAgIH0pXG4gIH0pXG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAdHNjaXJjdWl0L2NsaVwiLFxuICBcIm1haW5cIjogXCJkaXN0L21haW4uanNcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMS4zN1wiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldDEtYmFzaWMudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0c2NpcmN1aXQvZmFrZS1zbmlwcGV0c1wiOiBcIl4wLjAuNVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuOFwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9ldmFsXCI6IFwiXjAuMC45NlwiLFxuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjE2N1wiLFxuICAgIFwiYnVuLW1hdGNoLXN2Z1wiOiBcIl4wLjAuOVwiLFxuICAgIFwiY2hva2lkYXJcIjogXCI0LjAuMVwiLFxuICAgIFwiY2lyY3VpdC10by1zdmdcIjogXCJeMC4wLjEwMVwiLFxuICAgIFwiY29tbWFuZGVyXCI6IFwiXjEyLjEuMFwiLFxuICAgIFwiY29uZmlnc3RvcmVcIjogXCJeNy4wLjBcIixcbiAgICBcImNvc21pY29uZmlnXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJkZWxheVwiOiBcIl42LjAuMFwiLFxuICAgIFwiand0LWRlY29kZVwiOiBcIl40LjAuMFwiLFxuICAgIFwia3lcIjogXCJeMS43LjRcIixcbiAgICBcIm1ha2UtdmZzXCI6IFwiXjEuMC4xNVwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCIsXG4gICAgXCJyZWRheGlvc1wiOiBcIl4wLjUuMVwiLFxuICAgIFwic2VtdmVyXCI6IFwiXjcuNi4zXCJcbiAgfVxufVxuIiwgImltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbmV4cG9ydCBjb25zdCBnZXRJbmRleCA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIGA8aHRtbD5cbiAgICA8aGVhZD5cbiAgICA8L2hlYWQ+XG4gICAgPGJvZHk+XG4gICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbVwiPjwvc2NyaXB0PlxuICAgICAgPGRpdiBpZD1cInJvb3RcIj5sb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8c2NyaXB0PlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IHsgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiIH0gfVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0IHNyYz1cIi9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgIDwvYm9keT5cbiAgPC9odG1sPmBcbn1cblxuLy8gPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5cbmludGVyZmFjZSBFdmVudCB7XG4gIGV2ZW50X2lkOiBzdHJpbmdcbiAgY3JlYXRlZF9hdDogc3RyaW5nXG4gIGV2ZW50X3R5cGU6IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuaW50ZXJmYWNlIEV2ZW50c1Jlc3BvbnNlIHtcbiAgZXZlbnRfbGlzdDogRXZlbnRbXVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGFzdFBvbGxUaW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsSW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxpbmcgPSBmYWxzZVxuICBwcml2YXRlIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG5cbiAgY29uc3RydWN0b3IoYmFzZVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIsIHBvbGxJbnRlcnZhbCA9IDEwMDApIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICAgIHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsXG4gICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLnBvbGxpbmcpIHJldHVyblxuICAgIHRoaXMucG9sbGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLnBvbGwoKVxuICB9XG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnBvbGxpbmcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9sbCgpIHtcbiAgICBpZiAoIXRoaXMucG9sbGluZykgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZXZlbnRzL2xpc3Q/c2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5sYXN0UG9sbFRpbWUpfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IEV2ZW50c1Jlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIFVwZGF0ZSBsYXN0IHBvbGwgdGltZSB0byBsYXRlc3QgZXZlbnQgb3IgY3VycmVudCB0aW1lXG4gICAgICBjb25zdCBsYXRlc3RFdmVudCA9IGRhdGEuZXZlbnRfbGlzdFtkYXRhLmV2ZW50X2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbGF0ZXN0RXZlbnRcbiAgICAgICAgPyBsYXRlc3RFdmVudC5jcmVhdGVkX2F0XG4gICAgICAgIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgIGRhdGEuZXZlbnRfbGlzdC5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQpXG4gICAgICAgIHRoaXMuZW1pdChcIipcIiwgZXZlbnQpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gICAgLy8gU2NoZWR1bGUgbmV4dCBwb2xsXG4gICAgdGhpcy50aW1lb3V0SWQgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB0aGlzLnBvbGwoKSxcbiAgICAgIHRoaXMucG9sbEludGVydmFsLFxuICAgICkgYXMgdW5rbm93biBhcyBOb2RlSlMuVGltZW91dFxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGZpbmRJbXBvcnRzSW5TbmlwcGV0IH0gZnJvbSBcIi4vZmluZEltcG9ydHNJblNuaXBwZXRcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5cbmV4cG9ydCBjbGFzcyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyIHtcbiAgcHJpdmF0ZSBwcm9qZWN0Um9vdDogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERpcjogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9qZWN0Um9vdCA9IHRoaXMuZmluZFByb2plY3RSb290KGluaXRpYWxEaXIpXG4gIH1cblxuICBhc3luYyBoYW5kbGVJbml0aWFsVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2coXCJDaGVja2luZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzLi4uXCIpXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgaW5pdGlhbCB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgaGFuZGxpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZVR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGZpbGUgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byB2ZXJpZnkgdHlwZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGltcG9ydHMgPSBmaW5kSW1wb3J0c0luU25pcHBldChmaWxlUGF0aClcbiAgICByZXR1cm4gaW1wb3J0cy5ldmVyeSgoaW1wKSA9PiB0aGlzLmNoZWNrVHlwZUV4aXN0cyhpbXApKVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGVFeGlzdHMoaW1wb3J0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBwYXRoV2l0aG91dFByZWZpeCA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBwYXRoV2l0aG91dFByZWZpeC5zcGxpdChcIi5cIilcblxuICAgIGNvbnN0IHR5cGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICBcIkB0c2NpXCIsXG4gICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICBcImluZGV4LmQudHNcIixcbiAgICApXG5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0eXBlUGF0aClcbiAgfVxuXG4gIHByaXZhdGUgZmluZFByb2plY3RSb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByb290ID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyKVxuICAgIHdoaWxlIChyb290ICE9PSBwYXRoLnBhcnNlKHJvb3QpLnJvb3QpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3RcbiAgICAgIH1cbiAgICAgIHJvb3QgPSBwYXRoLmRpcm5hbWUocm9vdClcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0RGlyXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW1wb3J0c0luU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IENvbmZpZ3N0b3JlIGZyb20gXCJjb25maWdzdG9yZVwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkQ29uZmlnc3RvcmUgfSBmcm9tIFwiLi9UeXBlZENvbmZpZ1N0b3JlXCJcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCJcblxuZXhwb3J0IGludGVyZmFjZSBDbGlDb25maWcge1xuICBzZXNzaW9uVG9rZW4/OiBzdHJpbmdcbiAgZ2l0aHViVXNlcm5hbWU/OiBzdHJpbmdcbiAgcmVnaXN0cnlBcGlVcmw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGNsaUNvbmZpZzogVHlwZWRDb25maWdzdG9yZTxDbGlDb25maWc+ID0gbmV3IENvbmZpZ3N0b3JlKFxuICBcInRzY2lyY3VpdFwiLFxuKVxuXG5leHBvcnQgY29uc3QgZ2V0U2Vzc2lvblRva2VuID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG59XG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uVG9rZW4gPSAodG9rZW46IHN0cmluZykgPT4ge1xuICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHRva2VuKVxuICBjb25zdCBkZWNvZGVkID0gand0RGVjb2RlPHtcbiAgICBnaXRodWJfdXNlcm5hbWU6IHN0cmluZ1xuICB9Pih0b2tlbilcbiAgY2xpQ29uZmlnLnNldChcImdpdGh1YlVzZXJuYW1lXCIsIGRlY29kZWQuZ2l0aHViX3VzZXJuYW1lKVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJTZXNzaW9uID0gKCkgPT4ge1xuICBjbGlDb25maWcuZGVsZXRlKFwic2Vzc2lvblRva2VuXCIpXG4gIGNsaUNvbmZpZy5kZWxldGUoXCJnaXRodWJVc2VybmFtZVwiKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UmVnaXN0cnlBcGlVcmwgPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGNsaUNvbmZpZy5nZXQoXCJyZWdpc3RyeUFwaVVybFwiKSA/PyBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIlxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuZXhwb3J0IGNvbnN0IHByZXR0eVJlc3BvbnNlRXJyb3JIb29rOiBBZnRlclJlc3BvbnNlSG9vayA9IGFzeW5jIChcbiAgX3JlcXVlc3QsXG4gIF9vcHRpb25zLFxuICByZXNwb25zZSxcbikgPT4ge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRkFJTCBbJHtyZXNwb25zZS5zdGF0dXN9XTogJHtfcmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgICAgbmV3IFVSTChfcmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gICAgICAgIH0gXFxuXFxuICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JEYXRhLCBudWxsLCAyKX1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vaWdub3JlLCBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRLeSA9ICgpID0+IHtcbiAgcmV0dXJuIGt5LmNyZWF0ZSh7XG4gICAgcHJlZml4VXJsOiBnZXRSZWdpc3RyeUFwaVVybCgpLFxuICAgIGhvb2tzOiB7XG4gICAgICBhZnRlclJlc3BvbnNlOiBbcHJldHR5UmVzcG9uc2VFcnJvckhvb2tdLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIlxuXG50eXBlIFB1c2hPcHRpb25zID0ge1xuICBmaWxlUGF0aD86IHN0cmluZ1xuICBvbkV4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkXG4gIG9uRXJyb3I/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIG9uU3VjY2Vzcz86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHB1c2hTbmlwcGV0ID0gYXN5bmMgKHtcbiAgZmlsZVBhdGgsXG4gIG9uRXhpdCA9IChjb2RlKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksXG4gIG9uRXJyb3IgPSAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgb25TdWNjZXNzID0gKG1lc3NhZ2UpID0+IGNvbnNvbGUubG9nKG1lc3NhZ2UpLFxufTogUHVzaE9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2Vzc2lvblRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICBpZiAoIXNlc3Npb25Ub2tlbikge1xuICAgIG9uRXJyb3IoXG4gICAgICBcIllvdSBuZWVkIHRvIGxvZyBpbiB0byBzYXZlIHNuaXBwZXQuIFJ1biAndHNjaSBsb2dpbicgdG8gYXV0aGVudGljYXRlLlwiLFxuICAgIClcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBsZXQgc25pcHBldEZpbGVQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAoZmlsZVBhdGgpIHtcbiAgICBzbmlwcGV0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVmYXVsdEVudHJ5cG9pbnQgPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW50cnlwb2ludCkpIHtcbiAgICAgIHNuaXBwZXRGaWxlUGF0aCA9IGRlZmF1bHRFbnRyeXBvaW50XG4gICAgICBvblN1Y2Nlc3MoXCJObyBmaWxlIHByb3ZpZGVkLiBVc2luZyAnaW5kZXgudHN4JyBhcyB0aGUgZW50cnlwb2ludC5cIilcbiAgICB9IGVsc2Uge1xuICAgICAgb25FcnJvcihcbiAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgIClcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgcGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBcInBhY2thZ2UuanNvblwiKSxcbiAgKVxuICBsZXQgcGFja2FnZUpzb246IHsgbmFtZT86IHN0cmluZzsgYXV0aG9yPzogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gPSB7fVxuICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgb25FcnJvcihcIkludmFsaWQgcGFja2FnZS5qc29uIHByb3ZpZGVkXCIpXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNuaXBwZXRGaWxlUGF0aCkpIHtcbiAgICBvbkVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtzbmlwcGV0RmlsZVBhdGh9YClcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBjb25zdCBreSA9IGdldEt5KClcbiAgY29uc3QgcGFja2FnZU5hbWUgPSAoXG4gICAgcGFja2FnZUpzb24ubmFtZSA/PyBwYXRoLnBhcnNlKHNuaXBwZXRGaWxlUGF0aCkubmFtZVxuICApLnJlcGxhY2UoL15ALywgXCJcIilcbiAgY29uc3QgcGFja2FnZUF1dGhvciA9XG4gICAgcGFja2FnZUpzb24uYXV0aG9yPy5zcGxpdChcIiBcIilbMF0gPz8gY2xpQ29uZmlnLmdldChcImdpdGh1YlVzZXJuYW1lXCIpXG4gIGNvbnN0IHBhY2thZ2VJZGVudGlmaWVyID0gYCR7cGFja2FnZUF1dGhvcn0vJHtwYWNrYWdlTmFtZX1gXG5cbiAgbGV0IHBhY2thZ2VWZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID8/XG4gICAgKGF3YWl0IGt5XG4gICAgICAucG9zdDx7XG4gICAgICAgIGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfVxuICAgICAgICBwYWNrYWdlX3JlbGVhc2VzPzogeyB2ZXJzaW9uOiBzdHJpbmc7IGlzX2xhdGVzdDogYm9vbGVhbiB9W11cbiAgICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9saXN0XCIsIHtcbiAgICAgICAganNvbjogeyBwYWNrYWdlX25hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXNwb25zZSkgPT5cbiAgICAgICAgICByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzPy5bcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlcy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgPy52ZXJzaW9uLFxuICAgICAgKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBvbkVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KSlcblxuICBpZiAoIXBhY2thZ2VWZXJzaW9uKSB7XG4gICAgb25FcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBwYWNrYWdlIHZlcnNpb24uXCIpXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgY29uc3QgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uID0gKG5ld1ZlcnNpb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGFja2FnZUpzb24udmVyc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA9IG5ld1ZlcnNpb24gPz8gYCR7cGFja2FnZVZlcnNpb259YFxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlLmpzb24gdmVyc2lvbjogJHtlcnJvcn1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvZXNQYWNrYWdlRXhpc3QgPSBhd2FpdCBreVxuICAgIC5wb3N0PHsgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9IH0+KFwicGFja2FnZXMvZ2V0XCIsIHtcbiAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuanNvbigpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2Vfbm90X2ZvdW5kXCIpKVxuXG4gIGlmICghZG9lc1BhY2thZ2VFeGlzdCkge1xuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VzL2NyZWF0ZVwiLCB7XG4gICAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblRva2VufWAgfSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoYEVycm9yIGNyZWF0aW5nIHBhY2thZ2U6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgICAgfSlcbiAgfVxuXG4gIGNvbnN0IGRvZXNSZWxlYXNlRXhpc3QgPSBhd2FpdCBreVxuICAgIC5wb3N0PHtcbiAgICAgIGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfVxuICAgICAgcGFja2FnZV9yZWxlYXNlPzogeyB2ZXJzaW9uOiBzdHJpbmcgfVxuICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9nZXRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuanNvbigpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UucGFja2FnZV9yZWxlYXNlPy52ZXJzaW9uKSB7XG4gICAgICAgIHBhY2thZ2VWZXJzaW9uID0gcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb25cbiAgICAgICAgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uKHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZS52ZXJzaW9uKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuICEocmVzcG9uc2UuZXJyb3I/LmVycm9yX2NvZGUgPT09IFwicGFja2FnZV9yZWxlYXNlX25vdF9mb3VuZFwiKVxuICAgIH0pXG5cbiAgaWYgKGRvZXNSZWxlYXNlRXhpc3QpIHtcbiAgICBjb25zdCBidW1wZWRWZXJzaW9uID0gc2VtdmVyLmluYyhwYWNrYWdlVmVyc2lvbiwgXCJwYXRjaFwiKSFcbiAgICBvblN1Y2Nlc3MoXG4gICAgICBgSW5jcmVtZW50aW5nIFBhY2thZ2UgVmVyc2lvbiAke3BhY2thZ2VWZXJzaW9ufSAtPiAke2J1bXBlZFZlcnNpb259YCxcbiAgICApXG4gICAgcGFja2FnZVZlcnNpb24gPSBidW1wZWRWZXJzaW9uXG4gICAgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uKHBhY2thZ2VWZXJzaW9uKVxuICB9XG5cbiAgYXdhaXQga3lcbiAgICAucG9zdChcInBhY2thZ2VfcmVsZWFzZXMvY3JlYXRlXCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb25FcnJvcihgRXJyb3IgY3JlYXRpbmcgcmVsZWFzZTogJHtlcnJvcn1gKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH0pXG5cbiAgb25TdWNjZXNzKFwiXFxuXCIpXG5cbiAgY29uc3QgZGlyZWN0b3J5RmlsZXMgPSBmcy5yZWFkZGlyU3luYyhwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSlcbiAgZm9yIChjb25zdCBmaWxlIG9mIGRpcmVjdG9yeUZpbGVzKSB7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlKS5yZXBsYWNlKFwiLlwiLCBcIlwiKVxuICAgIGlmICghW1wianNvblwiLCBcInRzeFwiLCBcInRzXCJdLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSBjb250aW51ZVxuICAgIGNvbnN0IGZpbGVDb250ZW50ID1cbiAgICAgIGZzXG4gICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBmaWxlKSlcbiAgICAgICAgLnRvU3RyaW5nKCkgPz8gXCJcIlxuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VfZmlsZXMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogZmlsZSxcbiAgICAgICAgICBjb250ZW50X3RleHQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoYFVwbG9hZGVkIGZpbGUgJHtmaWxlfSB0byB0aGUgcmVnaXN0cnkuYClcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoYEVycm9yIHVwbG9hZGluZyBmaWxlICR7ZmlsZX06ICR7ZXJyb3J9YClcbiAgICAgIH0pXG4gIH1cblxuICBvblN1Y2Nlc3MoXG4gICAgW1xuICAgICAgYFN1Y2Nlc3NmdWxseSBwdXNoZWQgcGFja2FnZSAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufSB0byB0aGUgcmVnaXN0cnkhYCxcbiAgICAgIGBodHRwczovL3RzY2lyY3VpdC5jb20vJHtwYWNrYWdlSWRlbnRpZmllcn1gLFxuICAgIF0uam9pbihcIiBcIiksXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IHNldFNlc3Npb25Ub2tlbiwgZ2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBkZWxheSBmcm9tIFwiZGVsYXlcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFJlc3BvbnNlIH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZW5kcG9pbnQtdHlwZXNcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9naW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICAvLyBEZWZpbmUgdGhlIGxvZ2luIGFjdGlvbiBvbmNlIHRvIHNoYXJlIGJldHdlZW4gYm90aCBjb21tYW5kc1xuICBjb25zdCBsb2dpbkFjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBnZXRTZXNzaW9uVG9rZW4oKVxuICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIkFscmVhZHkgbG9nZ2VkIGluISBVc2UgJ3RzY2kgbG9nb3V0JyBpZiB5b3UgbmVlZCB0byBzd2l0Y2ggYWNjb3VudHMuXCIsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgIGNvbnN0IHsgbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHt9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgLmpzb24oKVxuXG4gICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgIGNvbnNvbGUubG9nKGxvZ2luX3BhZ2UudXJsKVxuXG4gICAgLy8gV2FpdCB1bnRpbCB3ZSByZWNlaXZlIGNvbmZpcm1hdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGxvZ2luX3BhZ2U6IG5ld19sb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLndhc19sb2dpbl9zdWNjZXNzZnVsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2luIHBhZ2UgZXhwaXJlZFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbiB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBzZXRTZXNzaW9uVG9rZW4oc2Vzc2lvbi50b2tlbilcbiAgICBjb25zb2xlLmxvZyhcIlxcblJlYWR5IHRvIHVzZSFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ2luIHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJBdXRoZW50aWNhdGUgQ0xJLCBsb2dpbiB0byByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9naW5BY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dpbiBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9naW4gdG8gdHNjaXJjdWl0IHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsZWFyU2Vzc2lvbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dvdXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBsb2dvdXRBY3Rpb24gPSAoKSA9PiB7XG4gICAgY2xlYXJTZXNzaW9uKClcbiAgICBjb25zb2xlLmxvZyhcIllvdSBoYXZlIGJlZW4gbG9nZ2VkIG91dCFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ291dCBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dvdXQgY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImF1dGhcIikuZGVzY3JpcHRpb24oXCJMb2dpbi9sb2dvdXRcIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiY29uZmlnXCIpLmRlc2NyaXB0aW9uKFwiTWFuYWdlIHRzY2lyY3VpdCBDTEkgY29uZmlndXJhdGlvblwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnUHJpbnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImNvbmZpZ1wiKSFcbiAgICAuY29tbWFuZChcInByaW50XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIGN1cnJlbnQgY29uZmlnXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShjbGlDb25maWcuYWxsLCBudWxsLCAyKSlcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHNldHVwVHNjaVByb2plY3QgfSBmcm9tIFwibGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzXCJcbmltcG9ydCB7IGdlbmVyYXRlVHNDb25maWcgfSBmcm9tIFwibGliL3NoYXJlZC9nZW5lcmF0ZS10cy1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDbG9uZSA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImNsb25lXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQ2xvbmUgYSBzbmlwcGV0IGZyb20gdGhlIHJlZ2lzdHJ5XCIpXG4gICAgLmFyZ3VtZW50KFwiPHNuaXBwZXQ+XCIsIFwiU25pcHBldCB0byBjbG9uZSAoZS5nLiBhdXRob3Ivc25pcHBldE5hbWUpXCIpXG4gICAgLmFjdGlvbihhc3luYyAoc25pcHBldFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzbmlwcGV0UGF0aC5tYXRjaCgvXig/OkB0c2NpXFwvKT8oW14vLl0rKVsvLl0oLispJC8pXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUsIG9yIEB0c2NpL2F1dGhvci5zbmlwcGV0TmFtZVwiLFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBhdXRob3IsIHNuaXBwZXROYW1lXSA9IG1hdGNoXG4gICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICBjb25zdCBreSA9IGdldEt5KClcbiAgICAgIGxldCBwYWNrYWdlRmlsZUxpc3RcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8eyBwYWNrYWdlX2ZpbGVzOiBBcnJheTx7IGZpbGVfcGF0aDogc3RyaW5nIH0+IH0+KFxuICAgICAgICAgICAgXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgdXNlX2xhdGVzdF92ZXJzaW9uOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpzb24oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkZhaWxlZCB0byBmZXRjaCBwYWNrYWdlIGZpbGVzOlwiLFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoYCR7YXV0aG9yfS4ke3NuaXBwZXROYW1lfWApXG4gICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgZm9yIChjb25zdCBmaWxlSW5mbyBvZiBwYWNrYWdlRmlsZUxpc3QucGFja2FnZV9maWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVJbmZvLmZpbGVfcGF0aC5yZXBsYWNlKC9eXFwvfGRpc3RcXC8vZywgXCJcIilcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkgY29udGludWVcblxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlUGF0aClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IGt5XG4gICAgICAgICAgICAucG9zdDx7IHBhY2thZ2VfZmlsZTogeyBjb250ZW50X3RleHQ6IHN0cmluZyB9IH0+KFxuICAgICAgICAgICAgICBcInBhY2thZ2VfZmlsZXMvZ2V0XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBmaWxlSW5mby5maWxlX3BhdGgsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGxldCBmaWxlVGV4dCA9IGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHRcblxuICAgICAgICAgIC8vIEVuc3VyZSBhbGwgLnRzeCBmaWxlcyBjb250YWluIFwiaW1wb3J0ICdAdHNjaXJjdWl0L2NvcmUnO1wiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpICYmXG4gICAgICAgICAgICAhZmlsZVRleHQuaW5jbHVkZXMoXCJAdHNjaXJjdWl0L2NvcmVcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbGVUZXh0ID0gYGltcG9ydCBcIkB0c2NpcmN1aXQvY29yZVwiO1xcblxcbiR7ZmlsZVRleHR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVUZXh0KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBTa2lwcGluZyAke2ZpbGVQYXRofSBkdWUgdG8gZXJyb3I6YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbihkaXJQYXRoLCBcIi5ucG1yY1wiKSxcbiAgICAgICAgXCJAdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXCIsXG4gICAgICApXG5cbiAgICAgIGdlbmVyYXRlVHNDb25maWcoZGlyUGF0aClcbiAgICAgIHNldHVwVHNjaVByb2plY3QoZGlyUGF0aClcblxuICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjbG9uZWQgdG8gJHtkaXJQYXRofS9gKVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBSdW4gXCJjZCAke3BhdGguZGlybmFtZShkaXJQYXRoKX0gJiYgdHNjaSBkZXZcIiB0byBzdGFydCBkZXZlbG9waW5nLmAsXG4gICAgICApXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgfSBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsXCJcbmltcG9ydCB3ZWJXb3JrZXJCdW5kbGVVcmwgZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC9ibG9iLXVybFwiXG5pbXBvcnQgeyBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoIH0gZnJvbSBcIm1ha2UtdmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7XG4gIGNvbnZlcnRDaXJjdWl0SnNvblRvU2NoZW1hdGljU3ZnLFxuICBjb252ZXJ0Q2lyY3VpdEpzb25Ub1BjYlN2Zyxcbn0gZnJvbSBcImNpcmN1aXQtdG8tc3ZnXCJcblxuY29uc3QgQUxMT1dFRF9GT1JNQVRTID0gW1xuICBcImpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCIsXG4gIFwicGNiLXN2Z1wiLFxuICBcImdlcmJlcnNcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCIsXG4gIFwiZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiLFxuXSBhcyBjb25zdFxuXG50eXBlIEZvcm1hdCA9ICh0eXBlb2YgQUxMT1dFRF9GT1JNQVRTKVtudW1iZXJdXG5cbmNvbnN0IE9VVFBVVF9FWFRFTlNJT05TID0ge1xuICBqc29uOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiOiBcIi1zY2hlbWF0aWMuc3ZnXCIsXG4gIFwicGNiLXN2Z1wiOiBcIi1wY2Iuc3ZnXCIsXG4gIGdlcmJlcnM6IFwiLWdlcmJlcnMuemlwXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiOiBcIi1yZWFkYWJsZS5uZXRsaXN0XCIsXG4gIGdsdGY6IFwiLmdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIjogXCIuZHNuXCIsXG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckV4cG9ydCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImV4cG9ydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cG9ydCB0c2NpcmN1aXQgY29kZSB0byB2YXJpb3VzIGZvcm1hdHNcIilcbiAgICAuYXJndW1lbnQoXCI8ZmlsZT5cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLWYsIC0tZm9ybWF0IDxmb3JtYXQ+XCIsIFwiT3V0cHV0IGZvcm1hdFwiKVxuICAgIC5vcHRpb24oXCItbywgLS1vdXRwdXQgPHBhdGg+XCIsIFwiT3V0cHV0IGZpbGUgcGF0aFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGUsIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHsgZm9ybWF0ID0gXCJjaXJjdWl0LWpzb25cIiB9ID0gb3B0aW9uc1xuICAgICAgbGV0IHsgb3V0cHV0IH0gPSBvcHRpb25zXG4gICAgICBpZiAoIUFMTE9XRURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fVxcblN1cHBvcnRlZCBmb3JtYXRzOiAke0FMTE9XRURfRk9STUFUUy5qb2luKFwiLFwiKX1gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICghb3V0cHV0KSB7XG4gICAgICAgIG91dHB1dCA9IHBhdGguYmFzZW5hbWUoZmlsZSkucmVwbGFjZSgvXFwuW14uXSskLywgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgY3JlYXRlQ2lyY3VpdFdlYldvcmtlcih7XG4gICAgICAgIHdlYldvcmtlclVybDogd2ViV29ya2VyQnVuZGxlVXJsLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdERpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gICAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudFBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3REaXIsIGZpbGUpXG5cbiAgICAgIGF3YWl0IHdvcmtlci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICAgICAgZW50cnlwb2ludDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICBmc01hcDoge1xuICAgICAgICAgIC4uLigoYXdhaXQgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCh7XG4gICAgICAgICAgICBkaXJQYXRoOiBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgY29udGVudEZvcm1hdDogXCJzdHJpbmdcIixcbiAgICAgICAgICB9KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICAgICAgXCJlbnRyeXBvaW50LnRzeFwiOiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG4gICAgICAgIGAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3b3JrZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCB3b3JrZXIuZ2V0Q2lyY3VpdEpzb24oKVxuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcHJvamVjdERpcixcbiAgICAgICAgYCR7b3V0cHV0fSR7T1VUUFVUX0VYVEVOU0lPTlNbZm9ybWF0IGFzIEZvcm1hdF19YCxcbiAgICAgIClcblxuICAgICAgbGV0IG91dHB1dENvbnRlbnQ6IHN0cmluZ1xuXG4gICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlIFwic2NoZW1hdGljLXN2Z1wiOlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBjb252ZXJ0Q2lyY3VpdEpzb25Ub1NjaGVtYXRpY1N2ZyhjaXJjdWl0SnNvbilcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicGNiLXN2Z1wiOlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBjb252ZXJ0Q2lyY3VpdEpzb25Ub1BjYlN2ZyhjaXJjdWl0SnNvbilcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShjaXJjdWl0SnNvbilcbiAgICAgIH1cblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBvdXRwdXRDb250ZW50KVxuXG4gICAgICBjb25zb2xlLmxvZyhgRXhwb3J0ZWQgdG8gJHtvdXRwdXRQYXRofWApXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInByaW50LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnRzIHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gY29uc29sZS5sb2coXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gYWNjZXNzIHRoaXMuXCIpXG4gICAgICBjb25zb2xlLmxvZyhcIllvdXIgVG9rZW46XFxuXCIsIHRva2VuKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMyAmJiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhTZXRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInNldC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cGxpY2l0bHkgc2V0IHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hcmd1bWVudChcIjx0b2tlbj5cIiwgXCJOZXcgdG9rZW4gdG8gbWFudWFsbHkgY29uZmlndXJlXCIpXG4gICAgLmFjdGlvbigodG9rZW4pID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVKV1RMZW5ndGgodG9rZW4pKVxuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJJbnZhbGlkIHRva2VuIHByb3ZpZGVkXCIpXG4gICAgICBzZXRTZXNzaW9uVG9rZW4odG9rZW4pXG4gICAgICBjb25zb2xlLmxvZyhcIlRva2VuIG1hbnVhbGx5IHVwZGF0ZWQuXCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBwdXNoU25pcHBldCB9IGZyb20gXCJsaWIvc2hhcmVkL3B1c2gtc25pcHBldFwiXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUHVzaCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInB1c2hcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTYXZlIHNuaXBwZXQgY29kZSB0byBSZWdpc3RyeSBBUElcIilcbiAgICAuYXJndW1lbnQoXCJbZmlsZV1cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb25FeGl0OiAoY29kZSkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLFxuICAgICAgICBvbkVycm9yOiAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgICAgICAgb25TdWNjZXNzOiAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG4gICAgICB9KVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0N4QixZQUFZQSxTQUFRO0FBQ3BCLFlBQVlDLFdBQVU7OztBQ0h0QixPQUFPLFFBQVE7QUFHUixJQUFNLHVCQUF1QixNQUFjO0FBQ2hELFFBQU0sWUFBWSxRQUFRLElBQUkseUJBQXlCO0FBQ3ZELE1BQUksVUFBVSxXQUFXLE1BQU0sRUFBRyxRQUFPO0FBQ3pDLE1BQUksVUFBVSxXQUFXLE1BQU0sRUFBRyxRQUFPO0FBQ3pDLE1BQUksVUFBVSxXQUFXLEtBQUssRUFBRyxRQUFPO0FBRXhDLE1BQUksR0FBRyxXQUFXLFdBQVcsRUFBRyxRQUFPO0FBQ3ZDLE1BQUksR0FBRyxXQUFXLGdCQUFnQixFQUFHLFFBQU87QUFDNUMsTUFBSSxHQUFHLFdBQVcsV0FBVyxFQUFHLFFBQU87QUFFdkMsU0FBTztBQUNUOzs7QUNiQSxPQUFPQyxTQUFRO0FBQ2YsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsZ0JBQWdCO0FBRWxCLFNBQVMsaUJBQ2QsWUFBWSxRQUFRLElBQUksR0FDeEIsZUFBZSxDQUFDLGdCQUFnQixpQkFBaUIsR0FDakQ7QUFDQSxRQUFNLGNBQWMsS0FBSyxRQUFRLFNBQVM7QUFDMUMsTUFBSSxDQUFDQSxJQUFHLFdBQVcsV0FBVyxHQUFHO0FBQy9CLElBQUFBLElBQUcsVUFBVSxhQUFhLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxFQUMvQztBQUNBLFFBQU0saUJBQWlCLHFCQUFxQjtBQUU1QyxVQUFRLElB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bkMsU0FBUyxDQUFDLFlBQVksUUFBUSxNQUFNLE9BQU87QUFBQSxNQUMzQyxXQUFXLENBQUMsWUFBWSxRQUFRLElBQUksT0FBTztBQUFBLElBQzdDLENBQUM7QUFBQSxFQUNILENBQUM7QUFDTDs7O0E3QkVPLElBQU0sVUFBVSxJQUFJLFFBQVE7QUFFbkMsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUduRCxRQUFRQyxRQUFPLElBQUksZ0JBQUksU0FBUyxPQUFPLEtBQUssZ0JBQUksT0FBTztBQUUxRCxhQUFhLE9BQU87QUFFcEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUNyQixhQUFhLE9BQU87QUFFcEIsYUFBYSxPQUFPO0FBQ3BCLGtCQUFrQixPQUFPO0FBQ3pCLG1CQUFtQixPQUFPO0FBQzFCLHVCQUF1QixPQUFPO0FBQzlCLHFCQUFxQixPQUFPO0FBRTVCLGVBQWUsT0FBTztBQUN0QixvQkFBb0IsT0FBTztBQUUzQixlQUFlLE9BQU87QUFFdEIsSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdCLGFBQVcsU0FBUyxRQUFRLElBQUk7QUFDbEMsT0FBTztBQUNMLFVBQVEsTUFBTTtBQUNoQjsiLAogICJuYW1lcyI6IFsiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgInByb2dyYW0iLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImt5IiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidHMiLCAiZnMiLCAicGF0aCIsICJreSIsICJwYXRoIiwgImt5IiwgImZzIiwgInByb2dyYW0iLCAicG9ydCIsICJyZXNvbHZlIiwgInNlcnZlciIsICJwcm9ncmFtIiwgImt5IiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAiZnMiLCAicGF0aCIsICJwcm9ncmFtIiwgImt5IiwgInNlbXZlciIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAic2VtdmVyIl0KfQo=
|
|
1252
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtZ2l0aWdub3JlLWZpbGUudHMiLCAiLi4vbGliL3NoYXJlZC9nZW5lcmF0ZS1wYWNrYWdlLWpzb24udHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCJsaWIvc2hhcmVkL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5pbXBvcnQgeyBnZW5lcmF0ZUdpdElnbm9yZUZpbGUgfSBmcm9tIFwibGliL3NoYXJlZC9nZW5lcmF0ZS1naXRpZ25vcmUtZmlsZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtcGFja2FnZS1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vbmUgaXMgcHJvdmlkZWQpXCIsXG4gICAgKVxuICAgIC5hcmd1bWVudChcbiAgICAgIFwiW2RpcmVjdG9yeV1cIixcbiAgICAgIFwiRGlyZWN0b3J5IG5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeSlcIixcbiAgICApXG4gICAgLmFjdGlvbigoZGlyZWN0b3J5Pzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gZGlyZWN0b3J5XG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGRpcmVjdG9yeSlcbiAgICAgICAgOiBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgZnMubWtkaXJTeW5jKHByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIC8vIENyZWF0ZSBlc3NlbnRpYWwgcHJvamVjdCBmaWxlc1xuICAgICAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyLCBcImluZGV4LnRzeFwiKSxcbiAgICAgICAgYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3IgcmVzaXN0YW5jZT1cIjFrXCIgZm9vdHByaW50PVwiMDQwMlwiIG5hbWU9XCJSMVwiIHNjaFg9ezN9IHBjYlg9ezN9IC8+XG4gICAgPGNhcGFjaXRvciBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiQzFcIiBzY2hYPXstM30gcGNiWD17LTN9IC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAsXG4gICAgICApXG5cbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCIubnBtcmNcIiksXG4gICAgICAgIGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAsXG4gICAgICApXG5cbiAgICAgIC8vIEdlbmVyYXRlIHBhY2thZ2UuanNvblxuICAgICAgZ2VuZXJhdGVQYWNrYWdlSnNvbihwcm9qZWN0RGlyKVxuICAgICAgLy8gR2VuZXJhdGUgdHNjb25maWcuanNvblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhwcm9qZWN0RGlyKVxuICAgICAgLy8gQ3JlYXRlIC5naXRpZ25vcmUgZmlsZVxuICAgICAgZ2VuZXJhdGVHaXRJZ25vcmVGaWxlKHByb2plY3REaXIpXG4gICAgICAvLyBTZXR1cCBwcm9qZWN0IGRlcGVuZGVuY2llc1xuICAgICAgc2V0dXBUc2NpUHJvamVjdChwcm9qZWN0RGlyKVxuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBcdUQ4M0NcdURGODkgSW5pdGlhbGl6YXRpb24gY29tcGxldGUhIFJ1biAke2RpcmVjdG9yeSA/IGBcImNkICR7ZGlyZWN0b3J5fVwiICYgYCA6IFwiXCJ9XCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuIiwgImltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0LXBrZy1tYW5hZ2VyXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFRzY2lQcm9qZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuICBkZXBlbmRlbmNpZXMgPSBbXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHNjaXJjdWl0L2NvcmVcIl0sXG4pIHtcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgZnMubWtkaXJTeW5jKHByb2plY3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsaXppbmcgcHJvamVjdCBpbiAke3Byb2plY3RQYXRofS4uLmApXG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKFwicGFja2FnZS5qc29uXCIpKSB7XG4gICAgY29uc3QgaW5pdENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gXCJ5YXJuIGluaXQgLXlcIlxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gXCJwbnBtIGluaXRcIlxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gXCJidW4gaW5pdCAteVwiXG4gICAgICAgICAgICA6IFwibnBtIGluaXQgLXlcIlxuXG4gICAgZXhlY1N5bmMoaW5pdENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJQcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIC8vIFJlYWQgYW5kIG1vZGlmeSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBcInBhY2thZ2UuanNvblwiKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSlcblxuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpKVxuICBjb25zb2xlLmxvZyhcIlVwZGF0ZWQgcGFja2FnZS5qc29uIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBmaWVsZHMuXCIpXG5cbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIGNvbnN0IGluc3RhbGxDb21tYW5kID1cbiAgICAgIHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIlxuICAgICAgICA/IGB5YXJuIGFkZCAtRCAke2RlcGVuZGVuY2llcy5qb2luKFwiIFwiKX1gXG4gICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwicG5wbVwiXG4gICAgICAgICAgPyBgcG5wbSBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gYGJ1biBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICAgICAgOiBgbnBtIGluc3RhbGwgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuXG4gICAgZXhlY1N5bmMoaW5zdGFsbENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJEZXBlbmRlbmNpZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lIHx8IFwidW5rbm93blwiXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5cbi8vIEdlbmVyYXRlIGEgUmVhY3QtY29tcGF0aWJsZSB0c2NvbmZpZy5qc29uXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVUc0NvbmZpZyA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCB0c2NvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInRzY29uZmlnLmpzb25cIilcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoXG4gICAge1xuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIHRhcmdldDogXCJFUzZcIixcbiAgICAgICAgbW9kdWxlOiBcIkVTTmV4dFwiLFxuICAgICAgICBqc3g6IFwicmVhY3QtanN4XCIsXG4gICAgICAgIG91dERpcjogXCJkaXN0XCIsXG4gICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBcIm5vZGVcIixcbiAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBudWxsLFxuICAgIDIsXG4gIClcbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHModHNjb25maWdQYXRoLCB0c2NvbmZpZ0NvbnRlbnQpXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbmV4cG9ydCBjb25zdCB3cml0ZUZpbGVJZk5vdEV4aXN0cyA9IChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQudHJpbVN0YXJ0KCksIFwidXRmLThcIilcbiAgICBjb25zb2xlLmluZm8oYENyZWF0ZWQ6ICR7ZmlsZVBhdGh9YClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXBwZWQ6ICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuIiwgImltcG9ydCB7IHdyaXRlRmlsZUlmTm90RXhpc3RzIH0gZnJvbSBcIi4vd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVHaXRJZ25vcmVGaWxlID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGdpdGlnbm9yZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcIi5naXRpZ25vcmVcIilcbiAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IGAjIERlcGVuZGVuY2llc1xubm9kZV9tb2R1bGVzL1xuXG4jIEJ1aWxkIG91dHB1dFxuZGlzdC9cbmJ1aWxkL1xuXG4jIEVudmlyb25tZW50IHZhcmlhYmxlc1xuLmVudlxuLmVudi5sb2NhbFxuLmVudi4qLmxvY2FsXG5cbiMgSURFIGZpbGVzXG4udnNjb2RlL1xuLmlkZWEvXG4qLnN3cFxuKi5zd29cblxuIyBPUyBmaWxlc1xuLkRTX1N0b3JlXG5UaHVtYnMuZGJcblxuIyBEZWJ1ZyBsb2dzXG5ucG0tZGVidWcubG9nKlxueWFybi1kZWJ1Zy5sb2cqXG55YXJuLWVycm9yLmxvZypcbmBcblxuICB3cml0ZUZpbGVJZk5vdEV4aXN0cyhnaXRpZ25vcmVQYXRoLCBnaXRpZ25vcmVDb250ZW50KVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVBhY2thZ2VKc29uID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpXG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHtcbiAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKGRpciksXG4gICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkEgVFNDaXJjdWl0IHByb2plY3RcIixcbiAgICBtYWluOiBcImluZGV4LnRzeFwiLFxuICAgIGtleXdvcmRzOiBbXCJ0c2NpcmN1aXRcIiwgXCJlbGVjdHJvbmljc1wiXSxcbiAgICBzY3JpcHRzOiB7XG4gICAgICBkZXY6IFwidHNjaSBkZXZcIixcbiAgICAgIGJ1aWxkOiBcInRzY2kgYnVpbGRcIixcbiAgICB9LFxuICB9XG5cbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uQ29udGVudCwgbnVsbCwgMiksXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcbmltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiUkVRVUVTVF9UT19TQVZFX1NOSVBQRVRcIixcbiAgICAgIHRoaXMuc2F2ZVNuaXBwZXQuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVTbmlwcGV0KCkge1xuICAgIGNvbnN0IHBvc3RFdmVudCA9IGFzeW5jIChcbiAgICAgIGV2ZW50OiBcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIiB8IFwiU05JUFBFVF9TQVZFRFwiLFxuICAgICkgPT5cbiAgICAgIHRoaXMuZnNLeS5wb3N0KFwiYXBpL2V2ZW50cy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IGV2ZW50X3R5cGU6IGV2ZW50IH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuXG4gICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgICBvbkV4aXQ6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgIHBvc3RFdmVudChcIlNOSVBQRVRfU0FWRURcIilcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBcIkxvY2FsIHJ1bmZyYW1lIHN0YW5kYWxvbmUgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gdmVyc2lvbi5cIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHNlcnZlcjogaHR0cC5TZXJ2ZXIgfT4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSh7IHNlcnZlciB9KVxuICAgIH0pXG4gIH0pXG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAdHNjaXJjdWl0L2NsaVwiLFxuICBcIm1haW5cIjogXCJkaXN0L21haW4uanNcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMS4zOFwiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldDEtYmFzaWMudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0c2NpcmN1aXQvZmFrZS1zbmlwcGV0c1wiOiBcIl4wLjAuNVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuOFwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9ldmFsXCI6IFwiXjAuMC45NlwiLFxuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjE2N1wiLFxuICAgIFwiYnVuLW1hdGNoLXN2Z1wiOiBcIl4wLjAuOVwiLFxuICAgIFwiY2hva2lkYXJcIjogXCI0LjAuMVwiLFxuICAgIFwiY2lyY3VpdC1qc29uLXRvLXJlYWRhYmxlLW5ldGxpc3RcIjogXCJeMC4wLjhcIixcbiAgICBcImNpcmN1aXQtdG8tc3ZnXCI6IFwiXjAuMC4xMDFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImRzbi1jb252ZXJ0ZXJcIjogXCJeMC4wLjYzXCIsXG4gICAgXCJqd3QtZGVjb2RlXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwibWFrZS12ZnNcIjogXCJeMS4wLjE1XCIsXG4gICAgXCJwZXJmZWN0LWNsaVwiOiBcIl4xLjAuMjBcIixcbiAgICBcInJlZGF4aW9zXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy42LjNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4ID0gYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gYDxodG1sPlxuICAgIDxoZWFkPlxuICAgIDwvaGVhZD5cbiAgICA8Ym9keT5cbiAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tXCI+PC9zY3JpcHQ+XG4gICAgICA8ZGl2IGlkPVwicm9vdFwiPmxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7IGVudjogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSB9XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPVwiL3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPC9ib2R5PlxuICA8L2h0bWw+YFxufVxuXG4vLyA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmluZEltcG9ydHNJblNuaXBwZXQgfSBmcm9tIFwiLi9maW5kSW1wb3J0c0luU25pcHBldFwiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuL2luc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIge1xuICBwcml2YXRlIHByb2plY3RSb290OiBzdHJpbmdcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2plY3RSb290ID0gdGhpcy5maW5kUHJvamVjdFJvb3QoaW5pdGlhbERpcilcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUluaXRpYWxUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhcIkNoZWNraW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBpbml0aWFsIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJFcnJvciBoYW5kbGluZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgZmlsZSB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHZlcmlmeSB0eXBlczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW1wb3J0cyA9IGZpbmRJbXBvcnRzSW5TbmlwcGV0KGZpbGVQYXRoKVxuICAgIHJldHVybiBpbXBvcnRzLmV2ZXJ5KChpbXApID0+IHRoaXMuY2hlY2tUeXBlRXhpc3RzKGltcCkpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrVHlwZUV4aXN0cyhpbXBvcnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHBhdGhXaXRob3V0UHJlZml4ID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IHBhdGhXaXRob3V0UHJlZml4LnNwbGl0KFwiLlwiKVxuXG4gICAgY29uc3QgdHlwZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICB0aGlzLnByb2plY3RSb290LFxuICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgIFwiQHRzY2lcIixcbiAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgIFwiaW5kZXguZC50c1wiLFxuICAgIClcblxuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHR5cGVQYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUHJvamVjdFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJvb3QgPSBwYXRoLnJlc29sdmUoc3RhcnREaXIpXG4gICAgd2hpbGUgKHJvb3QgIT09IHBhdGgucGFyc2Uocm9vdCkucm9vdCkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgICByZXR1cm4gcm9vdFxuICAgICAgfVxuICAgICAgcm9vdCA9IHBhdGguZGlybmFtZShyb290KVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnREaXJcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbXBvcnRzSW5TbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVG9rZW4gPSAoKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGNsaUNvbmZpZy5nZXQoXCJzZXNzaW9uVG9rZW5cIilcbn1cblxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb25Ub2tlbiA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgdG9rZW4pXG4gIGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGU8e1xuICAgIGdpdGh1Yl91c2VybmFtZTogc3RyaW5nXG4gIH0+KHRva2VuKVxuICBjbGlDb25maWcuc2V0KFwiZ2l0aHViVXNlcm5hbWVcIiwgZGVjb2RlZC5naXRodWJfdXNlcm5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlc3Npb24gPSAoKSA9PiB7XG4gIGNsaUNvbmZpZy5kZWxldGUoXCJzZXNzaW9uVG9rZW5cIilcbiAgY2xpQ29uZmlnLmRlbGV0ZShcImdpdGh1YlVzZXJuYW1lXCIpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5leHBvcnQgY29uc3QgcHJldHR5UmVzcG9uc2VFcnJvckhvb2s6IEFmdGVyUmVzcG9uc2VIb29rID0gYXN5bmMgKFxuICBfcmVxdWVzdCxcbiAgX29wdGlvbnMsXG4gIHJlc3BvbnNlLFxuKSA9PiB7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGQUlMIFske3Jlc3BvbnNlLnN0YXR1c31dOiAke19yZXF1ZXN0Lm1ldGhvZH0gJHtcbiAgICAgICAgICBuZXcgVVJMKF9yZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgICAgICAgfSBcXG5cXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvckRhdGEsIG51bGwsIDIpfWAsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9pZ25vcmUsIGFsbG93IHRoZSBlcnJvciB0byBiZSB0aHJvd25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEt5ID0gKCkgPT4ge1xuICByZXR1cm4ga3kuY3JlYXRlKHtcbiAgICBwcmVmaXhVcmw6IGdldFJlZ2lzdHJ5QXBpVXJsKCksXG4gICAgaG9va3M6IHtcbiAgICAgIGFmdGVyUmVzcG9uc2U6IFtwcmV0dHlSZXNwb25zZUVycm9ySG9va10sXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5cbnR5cGUgUHVzaE9wdGlvbnMgPSB7XG4gIGZpbGVQYXRoPzogc3RyaW5nXG4gIG9uRXhpdD86IChjb2RlOiBudW1iZXIpID0+IHZvaWRcbiAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgb25TdWNjZXNzPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcHVzaFNuaXBwZXQgPSBhc3luYyAoe1xuICBmaWxlUGF0aCxcbiAgb25FeGl0ID0gKGNvZGUpID0+IHByb2Nlc3MuZXhpdChjb2RlKSxcbiAgb25FcnJvciA9IChtZXNzYWdlKSA9PiBjb25zb2xlLmVycm9yKG1lc3NhZ2UpLFxuICBvblN1Y2Nlc3MgPSAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG59OiBQdXNoT3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgb25FcnJvcihcbiAgICAgIFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIHNhdmUgc25pcHBldC4gUnVuICd0c2NpIGxvZ2luJyB0byBhdXRoZW50aWNhdGUuXCIsXG4gICAgKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGxldCBzbmlwcGV0RmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGlmIChmaWxlUGF0aCkge1xuICAgIHNuaXBwZXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aClcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWZhdWx0RW50cnlwb2ludCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgIGlmIChmcy5leGlzdHNTeW5jKGRlZmF1bHRFbnRyeXBvaW50KSkge1xuICAgICAgc25pcHBldEZpbGVQYXRoID0gZGVmYXVsdEVudHJ5cG9pbnRcbiAgICAgIG9uU3VjY2VzcyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKFxuICAgICAgICBcIk5vIGVudHJ5cG9pbnQgZm91bmQuIFJ1biAndHNjaSBpbml0JyB0byBib290c3RyYXAgYSBiYXNpYyBwcm9qZWN0LlwiLFxuICAgICAgKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIFwicGFja2FnZS5qc29uXCIpLFxuICApXG4gIGxldCBwYWNrYWdlSnNvbjogeyBuYW1lPzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSA9IHt9XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICBvbkVycm9yKFwiSW52YWxpZCBwYWNrYWdlLmpzb24gcHJvdmlkZWRcIilcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc25pcHBldEZpbGVQYXRoKSkge1xuICAgIG9uRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3NuaXBwZXRGaWxlUGF0aH1gKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IGt5ID0gZ2V0S3koKVxuICBjb25zdCBwYWNrYWdlTmFtZSA9IChcbiAgICBwYWNrYWdlSnNvbi5uYW1lID8/IHBhdGgucGFyc2Uoc25pcHBldEZpbGVQYXRoKS5uYW1lXG4gICkucmVwbGFjZSgvXkAvLCBcIlwiKVxuICBjb25zdCBwYWNrYWdlQXV0aG9yID1cbiAgICBwYWNrYWdlSnNvbi5hdXRob3I/LnNwbGl0KFwiIFwiKVswXSA/PyBjbGlDb25maWcuZ2V0KFwiZ2l0aHViVXNlcm5hbWVcIilcbiAgY29uc3QgcGFja2FnZUlkZW50aWZpZXIgPSBgJHtwYWNrYWdlQXV0aG9yfS8ke3BhY2thZ2VOYW1lfWBcblxuICBsZXQgcGFja2FnZVZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPz9cbiAgICAoYXdhaXQga3lcbiAgICAgIC5wb3N0PHtcbiAgICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICAgIHBhY2thZ2VfcmVsZWFzZXM/OiB7IHZlcnNpb246IHN0cmluZzsgaXNfbGF0ZXN0OiBib29sZWFuIH1bXVxuICAgICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2xpc3RcIiwge1xuICAgICAgICBqc29uOiB7IHBhY2thZ2VfbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PlxuICAgICAgICAgIHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZXM/LltyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICA/LnZlcnNpb24sXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICAgIH0pKVxuXG4gIGlmICghcGFja2FnZVZlcnNpb24pIHtcbiAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgdmVyc2lvbi5cIilcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBjb25zdCB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24gPSAobmV3VmVyc2lvbj86IHN0cmluZykgPT4ge1xuICAgIGlmIChwYWNrYWdlSnNvbi52ZXJzaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbiA/PyBgJHtwYWNrYWdlVmVyc2lvbn1gXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvbkVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHBhY2thZ2UuanNvbiB2ZXJzaW9uOiAke2Vycm9yfWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZG9lc1BhY2thZ2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgLnBvc3Q8eyBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH0gfT4oXCJwYWNrYWdlcy9nZXRcIiwge1xuICAgICAganNvbjogeyBuYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5qc29uKClcbiAgICAudGhlbigocmVzcG9uc2UpID0+ICEocmVzcG9uc2UuZXJyb3I/LmVycm9yX2NvZGUgPT09IFwicGFja2FnZV9ub3RfZm91bmRcIikpXG5cbiAgaWYgKCFkb2VzUGFja2FnZUV4aXN0KSB7XG4gICAgYXdhaXQga3lcbiAgICAgIC5wb3N0KFwicGFja2FnZXMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjogeyBuYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uVG9rZW59YCB9LFxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihgRXJyb3IgY3JlYXRpbmcgcGFja2FnZTogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KVxuICB9XG5cbiAgY29uc3QgZG9lc1JlbGVhc2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgLnBvc3Q8e1xuICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICBwYWNrYWdlX3JlbGVhc2U/OiB7IHZlcnNpb246IHN0cmluZyB9XG4gICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2dldFwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5qc29uKClcbiAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2U/LnZlcnNpb24pIHtcbiAgICAgICAgcGFja2FnZVZlcnNpb24gPSByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvblxuICAgICAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb24pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX3JlbGVhc2Vfbm90X2ZvdW5kXCIpXG4gICAgfSlcblxuICBpZiAoZG9lc1JlbGVhc2VFeGlzdCkge1xuICAgIGNvbnN0IGJ1bXBlZFZlcnNpb24gPSBzZW12ZXIuaW5jKHBhY2thZ2VWZXJzaW9uLCBcInBhdGNoXCIpIVxuICAgIG9uU3VjY2VzcyhcbiAgICAgIGBJbmNyZW1lbnRpbmcgUGFja2FnZSBWZXJzaW9uICR7cGFja2FnZVZlcnNpb259IC0+ICR7YnVtcGVkVmVyc2lvbn1gLFxuICAgIClcbiAgICBwYWNrYWdlVmVyc2lvbiA9IGJ1bXBlZFZlcnNpb25cbiAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocGFja2FnZVZlcnNpb24pXG4gIH1cblxuICBhd2FpdCBreVxuICAgIC5wb3N0KFwicGFja2FnZV9yZWxlYXNlcy9jcmVhdGVcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvbkVycm9yKGBFcnJvciBjcmVhdGluZyByZWxlYXNlOiAke2Vycm9yfWApXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfSlcblxuICBvblN1Y2Nlc3MoXCJcXG5cIilcblxuICBjb25zdCBkaXJlY3RvcnlGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGlyZWN0b3J5RmlsZXMpIHtcbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpLnJlcGxhY2UoXCIuXCIsIFwiXCIpXG4gICAgaWYgKCFbXCJqc29uXCIsIFwidHN4XCIsIFwidHNcIl0uaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIGNvbnRpbnVlXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPVxuICAgICAgZnNcbiAgICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIGZpbGUpKVxuICAgICAgICAudG9TdHJpbmcoKSA/PyBcIlwiXG4gICAgYXdhaXQga3lcbiAgICAgIC5wb3N0KFwicGFja2FnZV9maWxlcy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlLFxuICAgICAgICAgIGNvbnRlbnRfdGV4dDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIG9uU3VjY2VzcyhgVXBsb2FkZWQgZmlsZSAke2ZpbGV9IHRvIHRoZSByZWdpc3RyeS5gKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihgRXJyb3IgdXBsb2FkaW5nIGZpbGUgJHtmaWxlfTogJHtlcnJvcn1gKVxuICAgICAgfSlcbiAgfVxuXG4gIG9uU3VjY2VzcyhcbiAgICBbXG4gICAgICBgU3VjY2Vzc2Z1bGx5IHB1c2hlZCBwYWNrYWdlICR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259IHRvIHRoZSByZWdpc3RyeSFgLFxuICAgICAgYGh0dHBzOi8vdHNjaXJjdWl0LmNvbS8ke3BhY2thZ2VJZGVudGlmaWVyfWAsXG4gICAgXS5qb2luKFwiIFwiKSxcbiAgKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuLCBnZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIC8vIERlZmluZSB0aGUgbG9naW4gYWN0aW9uIG9uY2UgdG8gc2hhcmUgYmV0d2VlbiBib3RoIGNvbW1hbmRzXG4gIGNvbnN0IGxvZ2luQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IGdldFNlc3Npb25Ub2tlbigpXG4gICAgaWYgKHNlc3Npb25Ub2tlbikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiQWxyZWFkeSBsb2dnZWQgaW4hIFVzZSAndHNjaSBsb2dvdXQnIGlmIHlvdSBuZWVkIHRvIHN3aXRjaCBhY2NvdW50cy5cIixcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge30sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIHNldFNlc3Npb25Ub2tlbihzZXNzaW9uLnRva2VuKVxuICAgIGNvbnNvbGUubG9nKFwiXFxuUmVhZHkgdG8gdXNlIVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9naW4gc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ2luIGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dpbiB0byB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xlYXJTZXNzaW9uIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ291dCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIGNvbnN0IGxvZ291dEFjdGlvbiA9ICgpID0+IHtcbiAgICBjbGVhclNlc3Npb24oKVxuICAgIGNvbnNvbGUubG9nKFwiWW91IGhhdmUgYmVlbiBsb2dnZWQgb3V0IVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9nb3V0IHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ291dCBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHRzY2lyY3VpdCByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9nb3V0QWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiYXV0aFwiKS5kZXNjcmlwdGlvbihcIkxvZ2luL2xvZ291dFwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWcgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJjb25maWdcIikuZGVzY3JpcHRpb24oXCJNYW5hZ2UgdHNjaXJjdWl0IENMSSBjb25maWd1cmF0aW9uXCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWdQcmludCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiY29uZmlnXCIpIVxuICAgIC5jb21tYW5kKFwicHJpbnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCB0aGUgY3VycmVudCBjb25maWdcIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNsaUNvbmZpZy5hbGwsIG51bGwsIDIpKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNuaXBwZXRQYXRoLm1hdGNoKC9eKD86QHRzY2lcXC8pPyhbXi8uXSspWy8uXSguKykkLylcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSwgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFssIGF1dGhvciwgc25pcHBldE5hbWVdID0gbWF0Y2hcbiAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuICAgICAgbGV0IHBhY2thZ2VGaWxlTGlzdFxuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7IHBhY2thZ2VfZmlsZXM6IEFycmF5PHsgZmlsZV9wYXRoOiBzdHJpbmcgfT4gfT4oXG4gICAgICAgICAgICBcInBhY2thZ2VfZmlsZXMvbGlzdFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBgJHthdXRob3J9LyR7c25pcHBldE5hbWV9YCxcbiAgICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuanNvbigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGZldGNoIHBhY2thZ2UgZmlsZXM6XCIsXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShgJHthdXRob3J9LiR7c25pcHBldE5hbWV9YClcbiAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZUluZm8uZmlsZV9wYXRoLnJlcGxhY2UoL15cXC98ZGlzdFxcLy9nLCBcIlwiKVxuICAgICAgICBpZiAoIWZpbGVQYXRoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHsgcGFja2FnZV9maWxlOiB7IGNvbnRlbnRfdGV4dDogc3RyaW5nIH0gfT4oXG4gICAgICAgICAgICAgIFwicGFja2FnZV9maWxlcy9nZXRcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVJbmZvLmZpbGVfcGF0aCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgbGV0IGZpbGVUZXh0ID0gZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dFxuXG4gICAgICAgICAgLy8gRW5zdXJlIGFsbCAudHN4IGZpbGVzIGNvbnRhaW4gXCJpbXBvcnQgJ0B0c2NpcmN1aXQvY29yZSc7XCJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aChcIi50c3hcIikgJiZcbiAgICAgICAgICAgICFmaWxlVGV4dC5pbmNsdWRlcyhcIkB0c2NpcmN1aXQvY29yZVwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsZVRleHQgPSBgaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XFxuXFxuJHtmaWxlVGV4dH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZVRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFNraXBwaW5nICR7ZmlsZVBhdGh9IGR1ZSB0byBlcnJvcjpgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKGRpclBhdGgsIFwiLm5wbXJjXCIpLFxuICAgICAgICBcIkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cIixcbiAgICAgIClcblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhkaXJQYXRoKVxuICAgICAgc2V0dXBUc2NpUHJvamVjdChkaXJQYXRoKVxuXG4gICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAke2RpclBhdGh9L2ApXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFJ1biBcImNkICR7cGF0aC5kaXJuYW1lKGRpclBhdGgpfSAmJiB0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciB9IGZyb20gXCJAdHNjaXJjdWl0L2V2YWxcIlxuaW1wb3J0IHdlYldvcmtlckJ1bmRsZVVybCBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsL2Jsb2ItdXJsXCJcbmltcG9ydCB7IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGggfSBmcm9tIFwibWFrZS12ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHtcbiAgY29udmVydENpcmN1aXRKc29uVG9TY2hlbWF0aWNTdmcsXG4gIGNvbnZlcnRDaXJjdWl0SnNvblRvUGNiU3ZnLFxufSBmcm9tIFwiY2lyY3VpdC10by1zdmdcIlxuaW1wb3J0IHsgY29udmVydENpcmN1aXRKc29uVG9Ec25TdHJpbmcgfSBmcm9tIFwiZHNuLWNvbnZlcnRlclwiXG5pbXBvcnQgeyBjb252ZXJ0Q2lyY3VpdEpzb25Ub1JlYWRhYmxlTmV0bGlzdCB9IGZyb20gXCJjaXJjdWl0LWpzb24tdG8tcmVhZGFibGUtbmV0bGlzdFwiXG5cbmNvbnN0IEFMTE9XRURfRk9STUFUUyA9IFtcbiAgXCJqc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiLFxuICBcInBjYi1zdmdcIixcbiAgXCJnZXJiZXJzXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiLFxuICBcImdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIixcbl0gYXMgY29uc3RcblxudHlwZSBGb3JtYXQgPSAodHlwZW9mIEFMTE9XRURfRk9STUFUUylbbnVtYmVyXVxuXG5jb25zdCBPVVRQVVRfRVhURU5TSU9OUyA9IHtcbiAganNvbjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCI6IFwiLmNpcmN1aXQuanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIjogXCItc2NoZW1hdGljLnN2Z1wiLFxuICBcInBjYi1zdmdcIjogXCItcGNiLnN2Z1wiLFxuICBnZXJiZXJzOiBcIi1nZXJiZXJzLnppcFwiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIjogXCItcmVhZGFibGUubmV0bGlzdFwiLFxuICBnbHRmOiBcIi5nbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCI6IFwiLmRzblwiLFxufVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJFeHBvcnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJleHBvcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBvcnQgdHNjaXJjdWl0IGNvZGUgdG8gdmFyaW91cyBmb3JtYXRzXCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1mLCAtLWZvcm1hdCA8Zm9ybWF0PlwiLCBcIk91dHB1dCBmb3JtYXRcIilcbiAgICAub3B0aW9uKFwiLW8sIC0tb3V0cHV0IDxwYXRoPlwiLCBcIk91dHB1dCBmaWxlIHBhdGhcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1hdCA9IFwiY2lyY3VpdC1qc29uXCIgfSA9IG9wdGlvbnNcbiAgICAgIGxldCB7IG91dHB1dCB9ID0gb3B0aW9uc1xuICAgICAgaWYgKCFBTExPV0VEX0ZPUk1BVFMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1cXG5TdXBwb3J0ZWQgZm9ybWF0czogJHtBTExPV0VEX0ZPUk1BVFMuam9pbihcIixcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW91dHB1dCkge1xuICAgICAgICBvdXRwdXQgPSBwYXRoLmJhc2VuYW1lKGZpbGUpLnJlcGxhY2UoL1xcLlteLl0rJC8sIFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIoe1xuICAgICAgICB3ZWJXb3JrZXJVcmw6IHdlYldvcmtlckJ1bmRsZVVybCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICAgICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0RGlyLCBmaWxlKVxuXG4gICAgICBhd2FpdCB3b3JrZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgICAgIGVudHJ5cG9pbnQ6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgZnNNYXA6IHtcbiAgICAgICAgICAuLi4oKGF3YWl0IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGgoe1xuICAgICAgICAgICAgZGlyUGF0aDogcHJvamVjdERpcixcbiAgICAgICAgICAgIGNvbnRlbnRGb3JtYXQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAgIFwiZW50cnlwb2ludC50c3hcIjogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50UGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuICAgICAgICBgLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd29ya2VyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgd29ya2VyLmdldENpcmN1aXRKc29uKClcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHByb2plY3REaXIsXG4gICAgICAgIGAke291dHB1dH0ke09VVFBVVF9FWFRFTlNJT05TW2Zvcm1hdCBhcyBGb3JtYXRdfWAsXG4gICAgICApXG5cbiAgICAgIGxldCBvdXRwdXRDb250ZW50OiBzdHJpbmdcblxuICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgY2FzZSBcInNjaGVtYXRpYy1zdmdcIjpcbiAgICAgICAgICBvdXRwdXRDb250ZW50ID0gY29udmVydENpcmN1aXRKc29uVG9TY2hlbWF0aWNTdmcoY2lyY3VpdEpzb24pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBjYi1zdmdcIjpcbiAgICAgICAgICBvdXRwdXRDb250ZW50ID0gY29udmVydENpcmN1aXRKc29uVG9QY2JTdmcoY2lyY3VpdEpzb24pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInNwZWNjdHJhLWRzblwiOlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBjb252ZXJ0Q2lyY3VpdEpzb25Ub0RzblN0cmluZyhjaXJjdWl0SnNvbilcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicmVhZGFibGUtbmV0bGlzdFwiOlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBjb252ZXJ0Q2lyY3VpdEpzb25Ub1JlYWRhYmxlTmV0bGlzdChjaXJjdWl0SnNvbilcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG91dHB1dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShjaXJjdWl0SnNvbilcbiAgICAgIH1cblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBvdXRwdXRDb250ZW50KVxuXG4gICAgICBjb25zb2xlLmxvZyhgRXhwb3J0ZWQgdG8gJHtvdXRwdXRQYXRofWApXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInByaW50LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnRzIHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gY29uc29sZS5sb2coXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gYWNjZXNzIHRoaXMuXCIpXG4gICAgICBjb25zb2xlLmxvZyhcIllvdXIgVG9rZW46XFxuXCIsIHRva2VuKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMyAmJiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhTZXRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInNldC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cGxpY2l0bHkgc2V0IHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hcmd1bWVudChcIjx0b2tlbj5cIiwgXCJOZXcgdG9rZW4gdG8gbWFudWFsbHkgY29uZmlndXJlXCIpXG4gICAgLmFjdGlvbigodG9rZW4pID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVKV1RMZW5ndGgodG9rZW4pKVxuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJJbnZhbGlkIHRva2VuIHByb3ZpZGVkXCIpXG4gICAgICBzZXRTZXNzaW9uVG9rZW4odG9rZW4pXG4gICAgICBjb25zb2xlLmxvZyhcIlRva2VuIG1hbnVhbGx5IHVwZGF0ZWQuXCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBwdXNoU25pcHBldCB9IGZyb20gXCJsaWIvc2hhcmVkL3B1c2gtc25pcHBldFwiXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUHVzaCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInB1c2hcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTYXZlIHNuaXBwZXQgY29kZSB0byBSZWdpc3RyeSBBUElcIilcbiAgICAuYXJndW1lbnQoXCJbZmlsZV1cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb25FeGl0OiAoY29kZSkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLFxuICAgICAgICBvbkVycm9yOiAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgICAgICAgb25TdWNjZXNzOiAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG4gICAgICB9KVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0N4QixZQUFZQSxTQUFRO0FBQ3BCLFlBQVlDLFdBQVU7OztBQ0h0QixPQUFPLFFBQVE7QUFHUixJQUFNLHVCQUF1QixNQUFjO0FBQ2hELFFBQU0sWUFBWSxRQUFRLElBQUkseUJBQXlCO0FBQ3ZELE1BQUksVUFBVSxXQUFX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QU87QUFFcEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUNyQixhQUFhLE9BQU87QUFFcEIsYUFBYSxPQUFPO0FBQ3BCLGtCQUFrQixPQUFPO0FBQ3pCLG1CQUFtQixPQUFPO0FBQzFCLHVCQUF1QixPQUFPO0FBQzlCLHFCQUFxQixPQUFPO0FBRTVCLGVBQWUsT0FBTztBQUN0QixvQkFBb0IsT0FBTztBQUUzQixlQUFlLE9BQU87QUFFdEIsSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdCLGFBQVcsU0FBUyxRQUFRLElBQUk7QUFDbEMsT0FBTztBQUNMLFVBQVEsTUFBTTtBQUNoQjsiLAogICJuYW1lcyI6IFsiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgInByb2dyYW0iLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImt5IiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidHMiLCAiZnMiLCAicGF0aCIsICJreSIsICJwYXRoIiwgImt5IiwgImZzIiwgInByb2dyYW0iLCAicG9ydCIsICJyZXNvbHZlIiwgInNlcnZlciIsICJwcm9ncmFtIiwgImt5IiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAiZnMiLCAicGF0aCIsICJwcm9ncmFtIiwgImt5IiwgInNlbXZlciIsICJwYXRoIiwgImZzIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAic2VtdmVyIl0KfQo=
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@tscircuit/cli",
|
|
3
3
|
"main": "dist/main.js",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.39",
|
|
6
6
|
"bin": {
|
|
7
7
|
"tsci": "./dist/main.js"
|
|
8
8
|
},
|
|
@@ -36,11 +36,13 @@
|
|
|
36
36
|
"@tscircuit/runframe": "^0.0.167",
|
|
37
37
|
"bun-match-svg": "^0.0.9",
|
|
38
38
|
"chokidar": "4.0.1",
|
|
39
|
+
"circuit-json-to-readable-netlist": "^0.0.8",
|
|
39
40
|
"circuit-to-svg": "^0.0.101",
|
|
40
41
|
"commander": "^12.1.0",
|
|
41
42
|
"configstore": "^7.0.0",
|
|
42
43
|
"cosmiconfig": "^9.0.0",
|
|
43
44
|
"delay": "^6.0.0",
|
|
45
|
+
"dsn-converter": "^0.0.63",
|
|
44
46
|
"jwt-decode": "^4.0.0",
|
|
45
47
|
"ky": "^1.7.4",
|
|
46
48
|
"make-vfs": "^1.0.15",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" style="background-color: rgb(245, 241, 237)" data-real-to-screen-transform="matrix(144.84007242,0,0,-144.84007242,601.2614556427,
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" style="background-color: rgb(245, 241, 237)" data-real-to-screen-transform="matrix(144.84007242,0,0,-144.84007242,601.2614556427,325.1634278817)"><style>
|
|
2
2
|
.boundary { fill: rgb(245, 241, 237); }
|
|
3
3
|
.schematic-boundary { fill: none; stroke: #fff; }
|
|
4
4
|
.component { fill: none; stroke: rgb(132, 0, 0); }
|
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
.pin-number { fill: rgb(169, 0, 0); }
|
|
15
15
|
.port-label { fill: rgb(0, 100, 100); }
|
|
16
16
|
.component-name { fill: rgb(0, 100, 100); }
|
|
17
|
-
</style><rect class="boundary" x="0" y="0" width="1200" height="600"/><g data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0"><rect class="component-overlay" x="961.6451659624652" y="
|
|
17
|
+
</style><rect class="boundary" x="0" y="0" width="1200" height="600"/><g data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_0"><rect class="component-overlay" x="961.6451659624652" y="299.31626795412626" width="153.28907181649743" height="38.32227881712976" fill="transparent"/><path d="M 961.6451659624652 318.47740736269117 L 999.9674302955876 318.47740736269117" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><path d="M 1076.611958961833 318.47740736269117 L 1114.9342377789626 318.47740736269117" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><path d="M 1038.289680144703 299.31626795412626 L 1076.6119444778255 299.31626795412626 L 1076.6119444778255 337.638546771256 L 999.967401327573 337.638546771256 L 999.967401327573 299.31626795412626 L 1038.2896801447027 299.31626795412626" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><text x="1035.7816729027" y="291.9555567105437" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="auto" font-size="26.0712130356px">R1</text><text x="1035.7816729027" y="348.2324939834565" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="26.0712130356px">1kΩ</text><circle cx="958.4673892575775" cy="318.5289993964875" r="2.8968014484px" stroke-width="2.8968014484px" fill="none" stroke="rgb(132, 0, 0)"/><circle cx="1113.0959565478224" cy="318.6081544960648" r="2.8968014484px" stroke-width="2.8968014484px" fill="none" stroke="rgb(132, 0, 0)"/></g><g data-circuit-json-type="schematic_component" data-schematic-component-id="schematic_component_1"><rect class="component-overlay" x="89.19451538935782" y="284.337885334939" width="153.2890718164976" height="76.64452866624515" fill="transparent"/><path d="M 242.48358720585543 322.6601496680613 L 177.33573928794772 322.6601496680613" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><path d="M 154.34237779127272 322.6601496680613 L 89.19451538935782 322.6601496680613" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><path d="M 177.33573928794766 284.337885334939 L 177.33573928794772 360.98241400118417" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><path d="M 154.34237779127272 284.337885334939 L 154.34237779127272 360.98241400118417" stroke="rgb(132, 0, 0)" fill="none" stroke-width="2.8968014484px"/><text x="164.87794327105283" y="264.38226125867334" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="auto" font-size="26.0712130356px">C1</text><text x="166.18353168384664" y="385.9445945047267" fill="rgb(15, 15, 15)" font-family="sans-serif" text-anchor="middle" dominant-baseline="hanging" font-size="26.0712130356px">1nF</text><circle cx="86.90404345212234" cy="322.7909112854422" r="2.8968014484px" stroke-width="2.8968014484px" fill="none" stroke="rgb(132, 0, 0)"/><circle cx="246.57843331327743" cy="322.71172721785024" r="2.8968014484px" stroke-width="2.8968014484px" fill="none" stroke="rgb(132, 0, 0)"/></g><g class="trace" data-circuit-json-type="schematic_trace" data-schematic-trace-id="schematic_trace_0"><path d="M 958.4673892575775 318.5289993964875 L 304.5144622812775 318.5289993964875 L 304.5144622812775 221.24449245625834 L 86.90404345212232 221.24449245625834 L 86.90404345212232 322.7909112854421" class="trace-invisible-hover-outline" stroke="rgb(0, 150, 0)" fill="none" stroke-width="23.1744115872px" stroke-linecap="round" opacity="0" stroke-linejoin="round"/><path d="M 958.4673892575775 318.5289993964875 L 304.5144622812775 318.5289993964875 L 304.5144622812775 221.24449245625834 L 86.90404345212232 221.24449245625834 L 86.90404345212232 322.7909112854421" stroke="rgb(0, 150, 0)" fill="none" stroke-width="2.8968014484px" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
|
|
@@ -60,3 +60,47 @@ test("export schematic-svg", async () => {
|
|
|
60
60
|
)
|
|
61
61
|
expect(schematicSvg).toMatchSvgSnapshot(import.meta.path, "schematic")
|
|
62
62
|
})
|
|
63
|
+
|
|
64
|
+
test("export specctra-dsn", async () => {
|
|
65
|
+
const { tmpDir, runCommand } = await getCliTestFixture()
|
|
66
|
+
await setupTestCircuit(tmpDir)
|
|
67
|
+
|
|
68
|
+
const { stdout, stderr } = await runCommand(
|
|
69
|
+
`tsci export ${path.join(tmpDir, "test-circuit.tsx")} -f specctra-dsn`,
|
|
70
|
+
)
|
|
71
|
+
expect(stderr).toBe("")
|
|
72
|
+
|
|
73
|
+
const specctraDSN = await readFile(
|
|
74
|
+
path.join(tmpDir, "test-circuit.dsn"),
|
|
75
|
+
"utf-8",
|
|
76
|
+
)
|
|
77
|
+
expect(specctraDSN).toContain("(layer F.Cu")
|
|
78
|
+
expect(specctraDSN).toContain("(layer B.Cu")
|
|
79
|
+
expect(specctraDSN).toContain('(component "simple_resistor')
|
|
80
|
+
expect(specctraDSN).toContain('(net "Net-(R1_source_component_0-Pad1)"')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
test("export readable-netlist", async () => {
|
|
84
|
+
const { tmpDir, runCommand } = await getCliTestFixture()
|
|
85
|
+
await setupTestCircuit(tmpDir)
|
|
86
|
+
|
|
87
|
+
const { stdout, stderr } = await runCommand(
|
|
88
|
+
`tsci export ${path.join(tmpDir, "test-circuit.tsx")} -f readable-netlist`,
|
|
89
|
+
)
|
|
90
|
+
expect(stderr).toBe("")
|
|
91
|
+
|
|
92
|
+
const readableNetlist = await readFile(
|
|
93
|
+
path.join(tmpDir, "test-circuit-readable.netlist"),
|
|
94
|
+
"utf-8",
|
|
95
|
+
)
|
|
96
|
+
expect(readableNetlist).toMatchInlineSnapshot(`
|
|
97
|
+
"COMPONENTS:
|
|
98
|
+
- R1: 1kΩ 0402 resistor
|
|
99
|
+
- C1: 1nF 0402 capacitor
|
|
100
|
+
|
|
101
|
+
NET: C1_pos
|
|
102
|
+
- R1 pin1
|
|
103
|
+
- C1 pin1 (+)
|
|
104
|
+
"
|
|
105
|
+
`)
|
|
106
|
+
})
|