@bitgo-beta/utxo-bin 2.8.3-beta.9 → 2.8.3-beta.91

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.
Files changed (67) hide show
  1. package/README.md +107 -86
  2. package/dist/bin/index.js +9 -2
  3. package/dist/src/AddressParser.d.ts +1 -0
  4. package/dist/src/AddressParser.d.ts.map +1 -1
  5. package/dist/src/AddressParser.js +7 -1
  6. package/dist/src/InputParser.d.ts +44 -0
  7. package/dist/src/InputParser.d.ts.map +1 -0
  8. package/dist/src/InputParser.js +239 -0
  9. package/dist/src/OutputParser.d.ts +24 -0
  10. package/dist/src/OutputParser.d.ts.map +1 -0
  11. package/dist/src/OutputParser.js +52 -0
  12. package/dist/src/Parser.d.ts +7 -1
  13. package/dist/src/Parser.d.ts.map +1 -1
  14. package/dist/src/Parser.js +29 -2
  15. package/dist/src/ParserTx.d.ts +28 -0
  16. package/dist/src/ParserTx.d.ts.map +1 -0
  17. package/dist/src/ParserTx.js +94 -0
  18. package/dist/src/ScriptParser.d.ts +21 -0
  19. package/dist/src/ScriptParser.d.ts.map +1 -0
  20. package/dist/src/ScriptParser.js +77 -0
  21. package/dist/src/TxParser.d.ts +9 -6
  22. package/dist/src/TxParser.d.ts.map +1 -1
  23. package/dist/src/TxParser.js +21 -23
  24. package/dist/src/commands.d.ts +36 -1
  25. package/dist/src/commands.d.ts.map +1 -1
  26. package/dist/src/commands.js +151 -19
  27. package/dist/src/fetch.d.ts +4 -3
  28. package/dist/src/fetch.d.ts.map +1 -1
  29. package/dist/src/fetch.js +14 -3
  30. package/dist/src/format.d.ts +1 -1
  31. package/dist/src/format.d.ts.map +1 -1
  32. package/dist/src/format.js +17 -7
  33. package/dist/src/generateAddress.d.ts +32 -0
  34. package/dist/src/generateAddress.d.ts.map +1 -0
  35. package/dist/src/generateAddress.js +104 -0
  36. package/dist/src/parseString.d.ts +5 -0
  37. package/dist/src/parseString.d.ts.map +1 -0
  38. package/dist/src/parseString.js +29 -0
  39. package/dist/src/parseUnknown.d.ts +5 -0
  40. package/dist/src/parseUnknown.d.ts.map +1 -0
  41. package/dist/src/parseUnknown.js +50 -0
  42. package/dist/src/readStdin.d.ts +5 -0
  43. package/dist/src/readStdin.d.ts.map +1 -0
  44. package/dist/src/readStdin.js +42 -0
  45. package/dist/test/fixtures.d.ts +24 -0
  46. package/dist/test/fixtures.d.ts.map +1 -0
  47. package/dist/test/fixtures.js +95 -0
  48. package/dist/test/generateAddress.d.ts +2 -0
  49. package/dist/test/generateAddress.d.ts.map +1 -0
  50. package/dist/test/generateAddress.js +29 -0
  51. package/dist/test/parseAddress.d.ts +10 -0
  52. package/dist/test/parseAddress.d.ts.map +1 -0
  53. package/dist/test/parseAddress.js +87 -0
  54. package/dist/test/parseScript.d.ts +2 -0
  55. package/dist/test/parseScript.d.ts.map +1 -0
  56. package/dist/test/parseScript.js +38 -0
  57. package/dist/test/parseTransaction.d.ts +2 -0
  58. package/dist/test/parseTransaction.d.ts.map +1 -0
  59. package/dist/test/parseTransaction.js +66 -0
  60. package/dist/test/stringToBuffer.d.ts +2 -0
  61. package/dist/test/stringToBuffer.d.ts.map +1 -0
  62. package/dist/test/stringToBuffer.js +16 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -4635
  64. package/package.json +8 -6
  65. package/dist/src/InputOutputParser.d.ts +0 -35
  66. package/dist/src/InputOutputParser.d.ts.map +0 -1
  67. package/dist/src/InputOutputParser.js +0 -196
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitgo-beta/utxo-bin",
3
3
  "description": "Command-line utility for BitGo UTXO transactions",
4
- "version": "2.8.3-beta.9",
4
+ "version": "2.8.3-beta.91",
5
5
  "files": [
6
6
  "dist/**/*"
7
7
  ],
@@ -15,7 +15,7 @@
15
15
  "prepare": "npm run build",
16
16
  "build": "yarn tsc --build --incremental --verbose .",
17
17
  "lint": "eslint --quiet .",
18
- "unit-test": "mocha",
18
+ "unit-test": "mocha --recursive test/",
19
19
  "fmt": "prettier --write '{bin,src,test}/**/*.{ts,js}'",
20
20
  "precommit": "yarn lint-staged"
21
21
  },
@@ -26,16 +26,18 @@
26
26
  },
27
27
  "bin": "./dist/bin/index.js",
28
28
  "dependencies": {
29
- "@bitgo-beta/blockapis": "1.0.5-beta.245",
30
- "@bitgo-beta/statics": "15.1.1-beta.10",
31
- "@bitgo-beta/utxo-lib": "8.0.3-beta.9",
29
+ "@bitgo-beta/blockapis": "1.0.5-beta.327",
30
+ "@bitgo-beta/statics": "15.1.1-beta.93",
31
+ "@bitgo-beta/utxo-lib": "8.0.3-beta.91",
32
32
  "archy": "^1.0.0",
33
33
  "bech32": "^2.0.0",
34
34
  "bitcoinjs-lib": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.2",
35
35
  "bn.js": "^5.2.1",
36
+ "bs58": "^5.0.0",
36
37
  "bs58check": "^2.1.2",
37
38
  "cashaddress": "^1.1.0",
38
39
  "chalk": "4",
40
+ "clipboardy-cjs": "^3.0.0",
39
41
  "elliptic": "^6.5.2",
40
42
  "yargs": "^17.3.1"
41
43
  },
@@ -54,5 +56,5 @@
54
56
  "access": "public"
55
57
  },
56
58
  "license": "MIT",
57
- "gitHead": "c877cc34b3b38aea6e2a17c1047a3d92bb1c910d"
59
+ "gitHead": "36e711281ae3cc569c6e7a5b9ff1a9a9e594cc61"
58
60
  }
@@ -1,35 +0,0 @@
1
- /// <reference types="node" />
2
- import * as utxolib from '@bitgo-beta/utxo-lib';
3
- import { OutputSpend } from '@bitgo-beta/blockapis';
4
- import { Parser, ParserNode } from './Parser';
5
- import { ChainInfo } from './TxParser';
6
- import { HollowSegwitSpend } from './hollowSegwitSpend';
7
- export declare class InputOutputParser extends Parser {
8
- private params;
9
- constructor(params: {
10
- parseOutputScript: boolean;
11
- parseScriptAsm: boolean;
12
- parseScriptData: boolean;
13
- parseSignatureData: {
14
- script: boolean;
15
- ecdsa: boolean;
16
- schnorr: boolean;
17
- };
18
- });
19
- parseScriptAsm(type: string, part: Buffer, i: number, n: number): string | undefined;
20
- parseScriptParts(type: string, parts: Array<Buffer | number>): ParserNode[];
21
- parseInputScript(buffer: Buffer): ParserNode;
22
- parseWitness(script: Buffer[]): ParserNode;
23
- parsePubkeys(parsed: utxolib.bitgo.ParsedSignatureScriptP2ms): ParserNode;
24
- parseSignatureBuffer(type: utxolib.bitgo.outputScripts.ScriptType2Of3 | utxolib.bitgo.ParsedScriptType2Of3, buf: Buffer | 0, signerIndex: number): ParserNode[];
25
- parseSignatures(parsed: utxolib.bitgo.ParsedSignatureScriptP2ms, tx: utxolib.bitgo.UtxoTransaction, inputIndex: number, prevOutputs?: utxolib.TxOutput[]): ParserNode;
26
- parseSigScriptWithType(tx: utxolib.bitgo.UtxoTransaction, inputIndex: number, parsed: utxolib.bitgo.ParsedSignatureScript | HollowSegwitSpend, prevOutputs?: utxolib.TxOutput[]): ParserNode;
27
- parseSigScript(tx: utxolib.bitgo.UtxoTransaction, inputIndex: number, prevOutputs?: utxolib.TxOutput[]): ParserNode;
28
- parsePrevOut(input: utxolib.TxInput, i: number, network: utxolib.Network, prevOutputs?: utxolib.TxOutput[]): ParserNode[];
29
- parseInput(txid: string, tx: utxolib.bitgo.UtxoTransaction, i: number, input: utxolib.TxInput, outputInfo: ChainInfo): ParserNode;
30
- parseSpend(txid: string, index: number, spends: OutputSpend[] | undefined, params: {
31
- conflict: boolean;
32
- }): ParserNode[];
33
- parseOutput(txid: string, o: utxolib.TxOutput, i: number, network: utxolib.Network, params: ChainInfo): ParserNode;
34
- }
35
- //# sourceMappingURL=InputOutputParser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InputOutputParser.d.ts","sourceRoot":"","sources":["../../src/InputOutputParser.ts"],"names":[],"mappings":"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"}
@@ -1,196 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InputOutputParser = void 0;
4
- const utxolib = require("@bitgo-beta/utxo-lib");
5
- const bitcoinjs_lib_1 = require("bitcoinjs-lib");
6
- const Parser_1 = require("./Parser");
7
- const AddressParser_1 = require("./AddressParser");
8
- const format_1 = require("./format");
9
- const hollowSegwitSpend_1 = require("./hollowSegwitSpend");
10
- const ecdsa_1 = require("./ecdsa");
11
- function toBufferUInt32BE(n) {
12
- const buf = Buffer.alloc(4);
13
- buf.writeUInt32LE(n, 0);
14
- return buf;
15
- }
16
- function parseSignatureScript(input, network) {
17
- return hollowSegwitSpend_1.parseHollowSegwitSpend(input, network) || utxolib.bitgo.parseSignatureScript(input);
18
- }
19
- class InputOutputParser extends Parser_1.Parser {
20
- constructor(params) {
21
- super();
22
- this.params = params;
23
- }
24
- parseScriptAsm(type, part, i, n) {
25
- if ((type === 'taproot' && i === n - 2) ||
26
- ((type === 'scripthash' || type === 'witnessscripthash') && i === n - 1)) {
27
- let parsed;
28
- try {
29
- parsed = utxolib.script.toASM(part);
30
- }
31
- catch (e) {
32
- return 'error';
33
- }
34
- if (parsed) {
35
- return ['', ...parsed.split(' ')].join('\n');
36
- }
37
- }
38
- }
39
- parseScriptParts(type, parts) {
40
- return parts.map((v, i) => {
41
- let asmNode;
42
- if (this.params.parseScriptAsm && Buffer.isBuffer(v)) {
43
- const parsed = this.parseScriptAsm(type, v, i, parts.length);
44
- asmNode = parsed ? this.node('asm', parsed) : undefined;
45
- }
46
- return this.node(i, this.params.parseScriptData ? v : undefined, asmNode ? [asmNode] : undefined);
47
- });
48
- }
49
- parseInputScript(buffer) {
50
- var _a;
51
- let value;
52
- let nodes;
53
- if (buffer.length && this.params.parseSignatureData.script) {
54
- const type = (_a = utxolib.classify.input(buffer, true)) !== null && _a !== void 0 ? _a : 'unknown';
55
- const decompiled = utxolib.script.decompile(buffer);
56
- if (decompiled) {
57
- nodes = this.parseScriptParts(type, decompiled);
58
- }
59
- value = type;
60
- }
61
- else {
62
- value = buffer;
63
- }
64
- return this.node('scriptSig', value, nodes);
65
- }
66
- parseWitness(script) {
67
- var _a;
68
- if (script.length === 0) {
69
- return this.node('witness', '[]');
70
- }
71
- const type = (_a = utxolib.classify.witness(script, true)) !== null && _a !== void 0 ? _a : 'unknown';
72
- return this.node('witness', type, this.params.parseScriptData ? this.parseScriptParts(type, script) : undefined);
73
- }
74
- parsePubkeys(parsed) {
75
- return this.node('pubkeys', parsed.publicKeys.length, parsed.publicKeys.map((k, i) => this.node(i, k)));
76
- }
77
- parseSignatureBuffer(type, buf, signerIndex) {
78
- if (buf === 0) {
79
- return [this.node('type', 'placeholder (0)')];
80
- }
81
- const nodes = [this.node('bytes', buf), this.node('valid', 0 <= signerIndex)];
82
- if (0 <= signerIndex) {
83
- nodes.push(this.node('signedBy', ['user', 'backup', 'bitgo'][signerIndex]));
84
- }
85
- if (type === 'taprootScriptPathSpend') {
86
- // TODO
87
- }
88
- else {
89
- const { signature, hashType } = bitcoinjs_lib_1.ScriptSignature.decode(buf);
90
- const r = signature.subarray(0, 32);
91
- const s = signature.subarray(32);
92
- if (r.length !== 32 || s.length !== 32) {
93
- throw new Error(`invalid scalar length`);
94
- }
95
- nodes.push(this.node('isCanonical', bitcoinjs_lib_1.script.isCanonicalScriptSignature(buf)), this.node('hashType', hashType), this.node('r', r), this.node('s', s), this.node('highS', ecdsa_1.isHighS(s)));
96
- }
97
- return nodes;
98
- }
99
- parseSignatures(parsed, tx, inputIndex, prevOutputs) {
100
- const nodes = [];
101
- if (prevOutputs) {
102
- const signedBy = utxolib.bitgo.getSignaturesWithPublicKeys(tx, inputIndex, prevOutputs, parsed.publicKeys);
103
- nodes.push(this.node('signed by', `[${signedBy.flatMap((v, i) => (v ? [i] : [])).join(', ')}]`));
104
- if (this.params.parseSignatureData.ecdsa || this.params.parseSignatureData.schnorr) {
105
- nodes.push(...parsed.signatures.map((s, i) => this.node(i, undefined, this.parseSignatureBuffer(parsed.scriptType, s, s === 0 ? -1 : signedBy.indexOf(s)))));
106
- }
107
- }
108
- return this.node('signatures', parsed.signatures
109
- .map((s) => utxolib.bitgo.isPlaceholderSignature(s) ? '[]' : Buffer.isBuffer(s) ? `[${s.length}byte]` : `[${s}]`)
110
- .join(' '), nodes);
111
- }
112
- parseSigScriptWithType(tx, inputIndex, parsed, prevOutputs) {
113
- var _a;
114
- if (parsed.scriptType &&
115
- (utxolib.bitgo.outputScripts.isScriptType2Of3(parsed.scriptType) ||
116
- parsed.scriptType === 'taprootScriptPathSpend' ||
117
- parsed.scriptType === 'taprootKeyPathSpend')) {
118
- const parsed2Of3 = parsed.scriptType === 'taprootScriptPathSpend' ? { ...parsed, scriptType: 'p2tr' } : parsed;
119
- return this.node('sigScript', parsed2Of3.scriptType, [
120
- this.parsePubkeys(parsed),
121
- this.parseSignatures(parsed, tx, inputIndex, prevOutputs),
122
- ]);
123
- }
124
- if (parsed.scriptType === 'p2shP2wshHollow' || parsed.scriptType === 'p2shP2wpkhHollow') {
125
- return this.node('sigScript', parsed.scriptType, [this.node('info', hollowSegwitSpend_1.getHollowSpendMessage())]);
126
- }
127
- return this.node('sigScript', (_a = parsed.scriptType) !== null && _a !== void 0 ? _a : 'unknown');
128
- }
129
- parseSigScript(tx, inputIndex, prevOutputs) {
130
- try {
131
- return this.parseSigScriptWithType(tx, inputIndex, parseSignatureScript(tx.ins[inputIndex], tx.network), prevOutputs);
132
- }
133
- catch (e) {
134
- return this.node('error', String(e));
135
- }
136
- }
137
- parsePrevOut(input, i, network, prevOutputs) {
138
- if (!prevOutputs || !prevOutputs[i]) {
139
- return [];
140
- }
141
- const { script, value } = prevOutputs[i];
142
- let address;
143
- try {
144
- address = utxolib.address.fromOutputScript(script, network);
145
- }
146
- catch (e) {
147
- address = '(error)';
148
- }
149
- return [
150
- this.node('value', value / 1e8),
151
- this.node('pubScript', script, address ? [this.node('address', address)] : undefined),
152
- ];
153
- }
154
- parseInput(txid, tx, i, input, outputInfo) {
155
- return this.node(i, utxolib.bitgo.formatOutputId(utxolib.bitgo.getOutputIdForInput(input)), [
156
- this.node('sequence', toBufferUInt32BE(input.sequence)),
157
- this.parseInputScript(input.script),
158
- this.parseWitness(input.witness),
159
- this.parseSigScript(tx, i, outputInfo.prevOutputs),
160
- ...this.parsePrevOut(input, i, tx.network, outputInfo.prevOutputs),
161
- ...this.parseSpend(txid, i, outputInfo.prevOutputSpends, { conflict: true }),
162
- ]);
163
- }
164
- parseSpend(txid, index, spends, params) {
165
- if (!spends || !spends[index]) {
166
- // no spend data available
167
- return [];
168
- }
169
- const spend = spends[index];
170
- if (spend.txid === undefined) {
171
- return [this.node('spent', false)];
172
- }
173
- if (spend.txid === txid) {
174
- // if input is spent by this transaction we don't display it
175
- return [];
176
- }
177
- return [this.node('spent', `${spend.txid}:${spend.vin}`, params.conflict ? [this.node('conflict', true)] : [])];
178
- }
179
- parseOutput(txid, o, i, network, params) {
180
- let address;
181
- try {
182
- address = utxolib.address.fromOutputScript(o.script, network);
183
- }
184
- catch (e) {
185
- // ignore
186
- }
187
- const addressParser = new AddressParser_1.AddressParser({ network, all: false, convert: false });
188
- return this.node(i, address !== null && address !== void 0 ? address : '(no address)', [
189
- this.node(`value`, format_1.formatSat(o.value)),
190
- ...(this.params.parseOutputScript || address === undefined ? addressParser.parseOutputScript(o.script) : []),
191
- ...this.parseSpend(txid, i, params.outputSpends, { conflict: false }),
192
- ]);
193
- }
194
- }
195
- exports.InputOutputParser = InputOutputParser;
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRPdXRwdXRQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvSW5wdXRPdXRwdXRQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQWdEO0FBRWhELGlEQUF3RDtBQUV4RCxxQ0FBOEM7QUFDOUMsbURBQWdEO0FBQ2hELHFDQUFxQztBQUVyQywyREFBdUc7QUFDdkcsbUNBQWtDO0FBRWxDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLEtBQXNCLEVBQ3RCLE9BQXdCO0lBRXhCLE9BQU8sMENBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUVELE1BQWEsaUJBQWtCLFNBQVEsZUFBTTtJQUMzQyxZQUNVLE1BU1A7UUFFRCxLQUFLLEVBQUUsQ0FBQztRQVhBLFdBQU0sR0FBTixNQUFNLENBU2I7SUFHSCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDN0QsSUFDRSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLElBQUksSUFBSSxLQUFLLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDeEU7WUFDQSxJQUFJLE1BQU0sQ0FBQztZQUVYLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JDO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxPQUFPLENBQUM7YUFDaEI7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUNGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVksRUFBRSxLQUE2QjtRQUMxRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxPQUErQixDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdELE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7YUFDekQ7WUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLE1BQWM7O1FBQzdCLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDMUQsTUFBTSxJQUFJLEdBQUcsTUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1DQUFJLFNBQVMsQ0FBQztZQUMvRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzthQUNqRDtZQUNELEtBQUssR0FBRyxJQUFJLENBQUM7U0FDZDthQUFNO1lBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBZ0I7O1FBQzNCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNuQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxtQ0FBSSxTQUFTLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFRCxZQUFZLENBQUMsTUFBK0M7UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLFNBQVMsRUFDVCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDeEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUNsQixJQUFxRixFQUNyRixHQUFlLEVBQ2YsV0FBbUI7UUFFbkIsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUMvQztRQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3RTtRQUVELElBQUksSUFBSSxLQUFLLHdCQUF3QixFQUFFO1lBQ3JDLE9BQU87U0FDUjthQUFNO1lBQ0wsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRywrQkFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWpDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQzthQUMxQztZQUVELEtBQUssQ0FBQyxJQUFJLENBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsc0JBQU0sQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDL0IsQ0FBQztTQUNIO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsZUFBZSxDQUNiLE1BQStDLEVBQy9DLEVBQWlDLEVBQ2pDLFVBQWtCLEVBQ2xCLFdBQWdDO1FBRWhDLE1BQU0sS0FBSyxHQUFpQixFQUFFLENBQUM7UUFDL0IsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFO2dCQUNsRixLQUFLLENBQUMsSUFBSSxDQUNSLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFhLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzdHLENBQ0YsQ0FBQzthQUNIO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQ2QsWUFBWSxFQUNaLE1BQU0sQ0FBQyxVQUFVO2FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBYSxFQUFFLEVBQUUsQ0FDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDckc7YUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ1osS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCLENBQ3BCLEVBQWlDLEVBQ2pDLFVBQWtCLEVBQ2xCLE1BQStELEVBQy9ELFdBQWdDOztRQUVoQyxJQUNFLE1BQU0sQ0FBQyxVQUFVO1lBQ2pCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDOUQsTUFBTSxDQUFDLFVBQVUsS0FBSyx3QkFBd0I7Z0JBQzlDLE1BQU0sQ0FBQyxVQUFVLEtBQUsscUJBQXFCLENBQUMsRUFDOUM7WUFDQSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxLQUFLLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQy9HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFpRCxDQUFDO2dCQUNwRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQWlELEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7YUFDckcsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssaUJBQWlCLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsRUFBRTtZQUN2RixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSx5Q0FBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hHO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFBLE1BQU0sQ0FBQyxVQUFVLG1DQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxjQUFjLENBQUMsRUFBaUMsRUFBRSxVQUFrQixFQUFFLFdBQWdDO1FBQ3BHLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FDaEMsRUFBRSxFQUNGLFVBQVUsRUFDVixvQkFBb0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFDcEQsV0FBVyxDQUNaLENBQUM7U0FDSDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCxZQUFZLENBQ1YsS0FBc0IsRUFDdEIsQ0FBUyxFQUNULE9BQXdCLEVBQ3hCLFdBQWdDO1FBRWhDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSTtZQUNGLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM3RDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxHQUFHLFNBQVMsQ0FBQztTQUNyQjtRQUNELE9BQU87WUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ3RGLENBQUM7SUFDSixDQUFDO0lBRUQsVUFBVSxDQUNSLElBQVksRUFDWixFQUFpQyxFQUNqQyxDQUFTLEVBQ1QsS0FBc0IsRUFDdEIsVUFBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDMUYsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDbEUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQzdFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQ1IsSUFBWSxFQUNaLEtBQWEsRUFDYixNQUFpQyxFQUNqQyxNQUE2QjtRQUU3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLDBCQUEwQjtZQUMxQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLDREQUE0RDtZQUM1RCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBWSxFQUFFLENBQW1CLEVBQUUsQ0FBUyxFQUFFLE9BQXdCLEVBQUUsTUFBaUI7UUFDbkcsSUFBSSxPQUFPLENBQUM7UUFDWixJQUFJO1lBQ0YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUMvRDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsU0FBUztTQUNWO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFakYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxjQUFjLEVBQUU7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsa0JBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDdEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBclFELDhDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgT3V0cHV0U3BlbmQgfSBmcm9tICdAYml0Z28tYmV0YS9ibG9ja2FwaXMnO1xuaW1wb3J0IHsgc2NyaXB0LCBTY3JpcHRTaWduYXR1cmUgfSBmcm9tICdiaXRjb2luanMtbGliJztcblxuaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJOb2RlIH0gZnJvbSAnLi9QYXJzZXInO1xuaW1wb3J0IHsgQWRkcmVzc1BhcnNlciB9IGZyb20gJy4vQWRkcmVzc1BhcnNlcic7XG5pbXBvcnQgeyBmb3JtYXRTYXQgfSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQgeyBDaGFpbkluZm8gfSBmcm9tICcuL1R4UGFyc2VyJztcbmltcG9ydCB7IHBhcnNlSG9sbG93U2Vnd2l0U3BlbmQsIEhvbGxvd1NlZ3dpdFNwZW5kLCBnZXRIb2xsb3dTcGVuZE1lc3NhZ2UgfSBmcm9tICcuL2hvbGxvd1NlZ3dpdFNwZW5kJztcbmltcG9ydCB7IGlzSGlnaFMgfSBmcm9tICcuL2VjZHNhJztcblxuZnVuY3Rpb24gdG9CdWZmZXJVSW50MzJCRShuOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoNCk7XG4gIGJ1Zi53cml0ZVVJbnQzMkxFKG4sIDApO1xuICByZXR1cm4gYnVmO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpZ25hdHVyZVNjcmlwdChcbiAgaW5wdXQ6IHV0eG9saWIuVHhJbnB1dCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiB1dHhvbGliLmJpdGdvLlBhcnNlZFNpZ25hdHVyZVNjcmlwdCB8IEhvbGxvd1NlZ3dpdFNwZW5kIHtcbiAgcmV0dXJuIHBhcnNlSG9sbG93U2Vnd2l0U3BlbmQoaW5wdXQsIG5ldHdvcmspIHx8IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQoaW5wdXQpO1xufVxuXG5leHBvcnQgY2xhc3MgSW5wdXRPdXRwdXRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmFtczoge1xuICAgICAgcGFyc2VPdXRwdXRTY3JpcHQ6IGJvb2xlYW47XG4gICAgICBwYXJzZVNjcmlwdEFzbTogYm9vbGVhbjtcbiAgICAgIHBhcnNlU2NyaXB0RGF0YTogYm9vbGVhbjtcbiAgICAgIHBhcnNlU2lnbmF0dXJlRGF0YToge1xuICAgICAgICBzY3JpcHQ6IGJvb2xlYW47XG4gICAgICAgIGVjZHNhOiBib29sZWFuO1xuICAgICAgICBzY2hub3JyOiBib29sZWFuO1xuICAgICAgfTtcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwYXJzZVNjcmlwdEFzbSh0eXBlOiBzdHJpbmcsIHBhcnQ6IEJ1ZmZlciwgaTogbnVtYmVyLCBuOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgICh0eXBlID09PSAndGFwcm9vdCcgJiYgaSA9PT0gbiAtIDIpIHx8XG4gICAgICAoKHR5cGUgPT09ICdzY3JpcHRoYXNoJyB8fCB0eXBlID09PSAnd2l0bmVzc3NjcmlwdGhhc2gnKSAmJiBpID09PSBuIC0gMSlcbiAgICApIHtcbiAgICAgIGxldCBwYXJzZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IHV0eG9saWIuc2NyaXB0LnRvQVNNKHBhcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICByZXR1cm4gWycnLCAuLi5wYXJzZWQuc3BsaXQoJyAnKV0uam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTY3JpcHRQYXJ0cyh0eXBlOiBzdHJpbmcsIHBhcnRzOiBBcnJheTxCdWZmZXIgfCBudW1iZXI+KTogUGFyc2VyTm9kZVtdIHtcbiAgICByZXR1cm4gcGFydHMubWFwKCh2LCBpKSA9PiB7XG4gICAgICBsZXQgYXNtTm9kZTogUGFyc2VyTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnBhcmFtcy5wYXJzZVNjcmlwdEFzbSAmJiBCdWZmZXIuaXNCdWZmZXIodikpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNjcmlwdEFzbSh0eXBlLCB2LCBpLCBwYXJ0cy5sZW5ndGgpO1xuICAgICAgICBhc21Ob2RlID0gcGFyc2VkID8gdGhpcy5ub2RlKCdhc20nLCBwYXJzZWQpIDogdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ub2RlKGksIHRoaXMucGFyYW1zLnBhcnNlU2NyaXB0RGF0YSA/IHYgOiB1bmRlZmluZWQsIGFzbU5vZGUgPyBbYXNtTm9kZV0gOiB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFyc2VJbnB1dFNjcmlwdChidWZmZXI6IEJ1ZmZlcik6IFBhcnNlck5vZGUge1xuICAgIGxldCB2YWx1ZTtcbiAgICBsZXQgbm9kZXM7XG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggJiYgdGhpcy5wYXJhbXMucGFyc2VTaWduYXR1cmVEYXRhLnNjcmlwdCkge1xuICAgICAgY29uc3QgdHlwZSA9IHV0eG9saWIuY2xhc3NpZnkuaW5wdXQoYnVmZmVyLCB0cnVlKSA/PyAndW5rbm93bic7XG4gICAgICBjb25zdCBkZWNvbXBpbGVkID0gdXR4b2xpYi5zY3JpcHQuZGVjb21waWxlKGJ1ZmZlcik7XG4gICAgICBpZiAoZGVjb21waWxlZCkge1xuICAgICAgICBub2RlcyA9IHRoaXMucGFyc2VTY3JpcHRQYXJ0cyh0eXBlLCBkZWNvbXBpbGVkKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBidWZmZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubm9kZSgnc2NyaXB0U2lnJywgdmFsdWUsIG5vZGVzKTtcbiAgfVxuXG4gIHBhcnNlV2l0bmVzcyhzY3JpcHQ6IEJ1ZmZlcltdKTogUGFyc2VyTm9kZSB7XG4gICAgaWYgKHNjcmlwdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3dpdG5lc3MnLCAnW10nKTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHV0eG9saWIuY2xhc3NpZnkud2l0bmVzcyhzY3JpcHQsIHRydWUpID8/ICd1bmtub3duJztcbiAgICByZXR1cm4gdGhpcy5ub2RlKCd3aXRuZXNzJywgdHlwZSwgdGhpcy5wYXJhbXMucGFyc2VTY3JpcHREYXRhID8gdGhpcy5wYXJzZVNjcmlwdFBhcnRzKHR5cGUsIHNjcmlwdCkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcGFyc2VQdWJrZXlzKHBhcnNlZDogdXR4b2xpYi5iaXRnby5QYXJzZWRTaWduYXR1cmVTY3JpcHRQMm1zKTogUGFyc2VyTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZShcbiAgICAgICdwdWJrZXlzJyxcbiAgICAgIHBhcnNlZC5wdWJsaWNLZXlzLmxlbmd0aCxcbiAgICAgIHBhcnNlZC5wdWJsaWNLZXlzLm1hcCgoaywgaSkgPT4gdGhpcy5ub2RlKGksIGspKVxuICAgICk7XG4gIH1cblxuICBwYXJzZVNpZ25hdHVyZUJ1ZmZlcihcbiAgICB0eXBlOiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjMgfCB1dHhvbGliLmJpdGdvLlBhcnNlZFNjcmlwdFR5cGUyT2YzLFxuICAgIGJ1ZjogQnVmZmVyIHwgMCxcbiAgICBzaWduZXJJbmRleDogbnVtYmVyXG4gICk6IFBhcnNlck5vZGVbXSB7XG4gICAgaWYgKGJ1ZiA9PT0gMCkge1xuICAgICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3R5cGUnLCAncGxhY2Vob2xkZXIgKDApJyldO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gW3RoaXMubm9kZSgnYnl0ZXMnLCBidWYpLCB0aGlzLm5vZGUoJ3ZhbGlkJywgMCA8PSBzaWduZXJJbmRleCldO1xuICAgIGlmICgwIDw9IHNpZ25lckluZGV4KSB7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnc2lnbmVkQnknLCBbJ3VzZXInLCAnYmFja3VwJywgJ2JpdGdvJ11bc2lnbmVySW5kZXhdKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgICAgLy8gVE9ET1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSwgaGFzaFR5cGUgfSA9IFNjcmlwdFNpZ25hdHVyZS5kZWNvZGUoYnVmKTtcbiAgICAgIGNvbnN0IHIgPSBzaWduYXR1cmUuc3ViYXJyYXkoMCwgMzIpO1xuICAgICAgY29uc3QgcyA9IHNpZ25hdHVyZS5zdWJhcnJheSgzMik7XG5cbiAgICAgIGlmIChyLmxlbmd0aCAhPT0gMzIgfHwgcy5sZW5ndGggIT09IDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzY2FsYXIgbGVuZ3RoYCk7XG4gICAgICB9XG5cbiAgICAgIG5vZGVzLnB1c2goXG4gICAgICAgIHRoaXMubm9kZSgnaXNDYW5vbmljYWwnLCBzY3JpcHQuaXNDYW5vbmljYWxTY3JpcHRTaWduYXR1cmUoYnVmKSksXG4gICAgICAgIHRoaXMubm9kZSgnaGFzaFR5cGUnLCBoYXNoVHlwZSksXG4gICAgICAgIHRoaXMubm9kZSgncicsIHIpLFxuICAgICAgICB0aGlzLm5vZGUoJ3MnLCBzKSxcbiAgICAgICAgdGhpcy5ub2RlKCdoaWdoUycsIGlzSGlnaFMocykpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIHBhcnNlU2lnbmF0dXJlcyhcbiAgICBwYXJzZWQ6IHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0UDJtcyxcbiAgICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24sXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHByZXZPdXRwdXRzPzogdXR4b2xpYi5UeE91dHB1dFtdXG4gICk6IFBhcnNlck5vZGUge1xuICAgIGNvbnN0IG5vZGVzOiBQYXJzZXJOb2RlW10gPSBbXTtcbiAgICBpZiAocHJldk91dHB1dHMpIHtcbiAgICAgIGNvbnN0IHNpZ25lZEJ5ID0gdXR4b2xpYi5iaXRnby5nZXRTaWduYXR1cmVzV2l0aFB1YmxpY0tleXModHgsIGlucHV0SW5kZXgsIHByZXZPdXRwdXRzLCBwYXJzZWQucHVibGljS2V5cyk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnc2lnbmVkIGJ5JywgYFske3NpZ25lZEJ5LmZsYXRNYXAoKHYsIGkpID0+ICh2ID8gW2ldIDogW10pKS5qb2luKCcsICcpfV1gKSk7XG4gICAgICBpZiAodGhpcy5wYXJhbXMucGFyc2VTaWduYXR1cmVEYXRhLmVjZHNhIHx8IHRoaXMucGFyYW1zLnBhcnNlU2lnbmF0dXJlRGF0YS5zY2hub3JyKSB7XG4gICAgICAgIG5vZGVzLnB1c2goXG4gICAgICAgICAgLi4ucGFyc2VkLnNpZ25hdHVyZXMubWFwKChzOiBCdWZmZXIgfCAwLCBpOiBudW1iZXIpID0+XG4gICAgICAgICAgICB0aGlzLm5vZGUoaSwgdW5kZWZpbmVkLCB0aGlzLnBhcnNlU2lnbmF0dXJlQnVmZmVyKHBhcnNlZC5zY3JpcHRUeXBlLCBzLCBzID09PSAwID8gLTEgOiBzaWduZWRCeS5pbmRleE9mKHMpKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vZGUoXG4gICAgICAnc2lnbmF0dXJlcycsXG4gICAgICBwYXJzZWQuc2lnbmF0dXJlc1xuICAgICAgICAubWFwKChzOiBCdWZmZXIgfCAwKSA9PlxuICAgICAgICAgIHV0eG9saWIuYml0Z28uaXNQbGFjZWhvbGRlclNpZ25hdHVyZShzKSA/ICdbXScgOiBCdWZmZXIuaXNCdWZmZXIocykgPyBgWyR7cy5sZW5ndGh9Ynl0ZV1gIDogYFske3N9XWBcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpLFxuICAgICAgbm9kZXNcbiAgICApO1xuICB9XG5cbiAgcGFyc2VTaWdTY3JpcHRXaXRoVHlwZShcbiAgICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24sXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHBhcnNlZDogdXR4b2xpYi5iaXRnby5QYXJzZWRTaWduYXR1cmVTY3JpcHQgfCBIb2xsb3dTZWd3aXRTcGVuZCxcbiAgICBwcmV2T3V0cHV0cz86IHV0eG9saWIuVHhPdXRwdXRbXVxuICApOiBQYXJzZXJOb2RlIHtcbiAgICBpZiAoXG4gICAgICBwYXJzZWQuc2NyaXB0VHlwZSAmJlxuICAgICAgKHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1NjcmlwdFR5cGUyT2YzKHBhcnNlZC5zY3JpcHRUeXBlKSB8fFxuICAgICAgICBwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnIHx8XG4gICAgICAgIHBhcnNlZC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpXG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJzZWQyT2YzID0gcGFyc2VkLnNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJyA/IHsgLi4ucGFyc2VkLCBzY3JpcHRUeXBlOiAncDJ0cicgfSA6IHBhcnNlZDtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3NpZ1NjcmlwdCcsIHBhcnNlZDJPZjMuc2NyaXB0VHlwZSwgW1xuICAgICAgICB0aGlzLnBhcnNlUHVia2V5cyhwYXJzZWQgYXMgdXR4b2xpYi5iaXRnby5QYXJzZWRTaWduYXR1cmVTY3JpcHRQMm1zKSxcbiAgICAgICAgdGhpcy5wYXJzZVNpZ25hdHVyZXMocGFyc2VkIGFzIHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0UDJtcywgdHgsIGlucHV0SW5kZXgsIHByZXZPdXRwdXRzKSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaEhvbGxvdycgfHwgcGFyc2VkLnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3cGtoSG9sbG93Jykge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZSgnc2lnU2NyaXB0JywgcGFyc2VkLnNjcmlwdFR5cGUsIFt0aGlzLm5vZGUoJ2luZm8nLCBnZXRIb2xsb3dTcGVuZE1lc3NhZ2UoKSldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ub2RlKCdzaWdTY3JpcHQnLCBwYXJzZWQuc2NyaXB0VHlwZSA/PyAndW5rbm93bicpO1xuICB9XG5cbiAgcGFyc2VTaWdTY3JpcHQodHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uLCBpbnB1dEluZGV4OiBudW1iZXIsIHByZXZPdXRwdXRzPzogdXR4b2xpYi5UeE91dHB1dFtdKTogUGFyc2VyTm9kZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlU2lnU2NyaXB0V2l0aFR5cGUoXG4gICAgICAgIHR4LFxuICAgICAgICBpbnB1dEluZGV4LFxuICAgICAgICBwYXJzZVNpZ25hdHVyZVNjcmlwdCh0eC5pbnNbaW5wdXRJbmRleF0sIHR4Lm5ldHdvcmspLFxuICAgICAgICBwcmV2T3V0cHV0c1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKCdlcnJvcicsIFN0cmluZyhlKSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQcmV2T3V0KFxuICAgIGlucHV0OiB1dHhvbGliLlR4SW5wdXQsXG4gICAgaTogbnVtYmVyLFxuICAgIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgICBwcmV2T3V0cHV0cz86IHV0eG9saWIuVHhPdXRwdXRbXVxuICApOiBQYXJzZXJOb2RlW10ge1xuICAgIGlmICghcHJldk91dHB1dHMgfHwgIXByZXZPdXRwdXRzW2ldKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHsgc2NyaXB0LCB2YWx1ZSB9ID0gcHJldk91dHB1dHNbaV07XG4gICAgbGV0IGFkZHJlc3M7XG4gICAgdHJ5IHtcbiAgICAgIGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIG5ldHdvcmspO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFkZHJlc3MgPSAnKGVycm9yKSc7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICB0aGlzLm5vZGUoJ3ZhbHVlJywgdmFsdWUgLyAxZTgpLFxuICAgICAgdGhpcy5ub2RlKCdwdWJTY3JpcHQnLCBzY3JpcHQsIGFkZHJlc3MgPyBbdGhpcy5ub2RlKCdhZGRyZXNzJywgYWRkcmVzcyldIDogdW5kZWZpbmVkKSxcbiAgICBdO1xuICB9XG5cbiAgcGFyc2VJbnB1dChcbiAgICB0eGlkOiBzdHJpbmcsXG4gICAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uLFxuICAgIGk6IG51bWJlcixcbiAgICBpbnB1dDogdXR4b2xpYi5UeElucHV0LFxuICAgIG91dHB1dEluZm86IENoYWluSW5mb1xuICApOiBQYXJzZXJOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlKGksIHV0eG9saWIuYml0Z28uZm9ybWF0T3V0cHV0SWQodXR4b2xpYi5iaXRnby5nZXRPdXRwdXRJZEZvcklucHV0KGlucHV0KSksIFtcbiAgICAgIHRoaXMubm9kZSgnc2VxdWVuY2UnLCB0b0J1ZmZlclVJbnQzMkJFKGlucHV0LnNlcXVlbmNlKSksXG4gICAgICB0aGlzLnBhcnNlSW5wdXRTY3JpcHQoaW5wdXQuc2NyaXB0KSxcbiAgICAgIHRoaXMucGFyc2VXaXRuZXNzKGlucHV0LndpdG5lc3MpLFxuICAgICAgdGhpcy5wYXJzZVNpZ1NjcmlwdCh0eCwgaSwgb3V0cHV0SW5mby5wcmV2T3V0cHV0cyksXG4gICAgICAuLi50aGlzLnBhcnNlUHJldk91dChpbnB1dCwgaSwgdHgubmV0d29yaywgb3V0cHV0SW5mby5wcmV2T3V0cHV0cyksXG4gICAgICAuLi50aGlzLnBhcnNlU3BlbmQodHhpZCwgaSwgb3V0cHV0SW5mby5wcmV2T3V0cHV0U3BlbmRzLCB7IGNvbmZsaWN0OiB0cnVlIH0pLFxuICAgIF0pO1xuICB9XG5cbiAgcGFyc2VTcGVuZChcbiAgICB0eGlkOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzcGVuZHM6IE91dHB1dFNwZW5kW10gfCB1bmRlZmluZWQsXG4gICAgcGFyYW1zOiB7IGNvbmZsaWN0OiBib29sZWFuIH1cbiAgKTogUGFyc2VyTm9kZVtdIHtcbiAgICBpZiAoIXNwZW5kcyB8fCAhc3BlbmRzW2luZGV4XSkge1xuICAgICAgLy8gbm8gc3BlbmQgZGF0YSBhdmFpbGFibGVcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgc3BlbmQgPSBzcGVuZHNbaW5kZXhdO1xuICAgIGlmIChzcGVuZC50eGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbdGhpcy5ub2RlKCdzcGVudCcsIGZhbHNlKV07XG4gICAgfVxuICAgIGlmIChzcGVuZC50eGlkID09PSB0eGlkKSB7XG4gICAgICAvLyBpZiBpbnB1dCBpcyBzcGVudCBieSB0aGlzIHRyYW5zYWN0aW9uIHdlIGRvbid0IGRpc3BsYXkgaXRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3NwZW50JywgYCR7c3BlbmQudHhpZH06JHtzcGVuZC52aW59YCwgcGFyYW1zLmNvbmZsaWN0ID8gW3RoaXMubm9kZSgnY29uZmxpY3QnLCB0cnVlKV0gOiBbXSldO1xuICB9XG5cbiAgcGFyc2VPdXRwdXQodHhpZDogc3RyaW5nLCBvOiB1dHhvbGliLlR4T3V0cHV0LCBpOiBudW1iZXIsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaywgcGFyYW1zOiBDaGFpbkluZm8pOiBQYXJzZXJOb2RlIHtcbiAgICBsZXQgYWRkcmVzcztcbiAgICB0cnkge1xuICAgICAgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG8uc2NyaXB0LCBuZXR3b3JrKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzUGFyc2VyID0gbmV3IEFkZHJlc3NQYXJzZXIoeyBuZXR3b3JrLCBhbGw6IGZhbHNlLCBjb252ZXJ0OiBmYWxzZSB9KTtcblxuICAgIHJldHVybiB0aGlzLm5vZGUoaSwgYWRkcmVzcyA/PyAnKG5vIGFkZHJlc3MpJywgW1xuICAgICAgdGhpcy5ub2RlKGB2YWx1ZWAsIGZvcm1hdFNhdChvLnZhbHVlKSksXG4gICAgICAuLi4odGhpcy5wYXJhbXMucGFyc2VPdXRwdXRTY3JpcHQgfHwgYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8gYWRkcmVzc1BhcnNlci5wYXJzZU91dHB1dFNjcmlwdChvLnNjcmlwdCkgOiBbXSksXG4gICAgICAuLi50aGlzLnBhcnNlU3BlbmQodHhpZCwgaSwgcGFyYW1zLm91dHB1dFNwZW5kcywgeyBjb25mbGljdDogZmFsc2UgfSksXG4gICAgXSk7XG4gIH1cbn1cbiJdfQ==