@bitgo/sdk-coin-stx 3.12.7 → 3.13.1

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.
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const transactions_1 = require("@stacks/transactions");
41
+ const sdk_test_1 = require("@bitgo/sdk-test");
42
+ const sdk_api_1 = require("@bitgo/sdk-api");
43
+ const statics_1 = require("@bitgo/statics");
44
+ const src_1 = require("../../../src");
45
+ const testData = __importStar(require("../resources"));
46
+ describe('Stacks: sBTC Withdraw Builder', function () {
47
+ const coinNameTest = 'tstx';
48
+ let bitgo;
49
+ before(function () {
50
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
51
+ env: 'mock',
52
+ });
53
+ bitgo.initializeTestVars();
54
+ bitgo.safeRegister('stx', src_1.Stx.createInstance);
55
+ bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
56
+ });
57
+ describe('sBTC Withdraw Builder', () => {
58
+ const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
59
+ const initTxBuilder = () => {
60
+ const txBuilder = factory.getSbtcWithdrawBuilder();
61
+ txBuilder.fee({ fee: '1000' });
62
+ txBuilder.nonce(1);
63
+ return txBuilder;
64
+ };
65
+ describe('should build', function () {
66
+ it('a withdrawal with P2PKH address', async () => {
67
+ const builder = initTxBuilder();
68
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
69
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
70
+ builder.fromPubKey(pubKeyStrings);
71
+ builder.numberSignatures(2);
72
+ builder.withdraw({
73
+ amount: '100000',
74
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
75
+ maxFee: '5000',
76
+ });
77
+ builder.sign({ key: testData.prvKeysString[0] });
78
+ builder.sign({ key: testData.prvKeysString[1] });
79
+ const tx = await builder.build();
80
+ const txJson = tx.toJson();
81
+ txJson.fee.should.equal('1000');
82
+ txJson.nonce.should.equal(1);
83
+ should_1.default.exist(txJson.payload);
84
+ txJson.payload.should.have.property('contractName', 'sbtc-withdrawal');
85
+ txJson.payload.should.have.property('functionName', 'initiate-withdrawal-request');
86
+ // Verify hashbytes is 20 bytes for P2PKH
87
+ const payload = tx.stxTransaction.payload;
88
+ const recipientTuple = payload.functionArgs[1];
89
+ should_1.default.equal(recipientTuple.type, transactions_1.ClarityType.Tuple);
90
+ if (recipientTuple.type === transactions_1.ClarityType.Tuple) {
91
+ const hashbytes = recipientTuple.data['hashbytes'];
92
+ should_1.default.equal(hashbytes.type, transactions_1.ClarityType.Buffer);
93
+ if (hashbytes.type === transactions_1.ClarityType.Buffer) {
94
+ hashbytes.buffer.length.should.equal(20);
95
+ }
96
+ }
97
+ });
98
+ it('a withdrawal with P2SH address', async () => {
99
+ const builder = initTxBuilder();
100
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
101
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
102
+ builder.fromPubKey(pubKeyStrings);
103
+ builder.numberSignatures(2);
104
+ builder.withdraw({
105
+ amount: '200000',
106
+ btcAddress: '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy',
107
+ maxFee: '3000',
108
+ });
109
+ const tx = await builder.build();
110
+ const txJson = tx.toJson();
111
+ txJson.payload.should.have.property('functionName', 'initiate-withdrawal-request');
112
+ // Verify hashbytes is 20 bytes for P2SH
113
+ const payload = tx.stxTransaction.payload;
114
+ const recipientTuple = payload.functionArgs[1];
115
+ if (recipientTuple.type === transactions_1.ClarityType.Tuple) {
116
+ const hashbytes = recipientTuple.data['hashbytes'];
117
+ if (hashbytes.type === transactions_1.ClarityType.Buffer) {
118
+ hashbytes.buffer.length.should.equal(20);
119
+ }
120
+ }
121
+ });
122
+ it('a withdrawal with P2WPKH (bech32) address', async () => {
123
+ const builder = initTxBuilder();
124
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
125
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
126
+ builder.fromPubKey(pubKeyStrings);
127
+ builder.numberSignatures(2);
128
+ builder.withdraw({
129
+ amount: '50000',
130
+ btcAddress: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4',
131
+ maxFee: '2000',
132
+ });
133
+ const tx = await builder.build();
134
+ const txJson = tx.toJson();
135
+ txJson.payload.should.have.property('functionName', 'initiate-withdrawal-request');
136
+ // Verify hashbytes is 20 bytes for P2WPKH
137
+ const payload = tx.stxTransaction.payload;
138
+ const recipientTuple = payload.functionArgs[1];
139
+ if (recipientTuple.type === transactions_1.ClarityType.Tuple) {
140
+ const hashbytes = recipientTuple.data['hashbytes'];
141
+ if (hashbytes.type === transactions_1.ClarityType.Buffer) {
142
+ hashbytes.buffer.length.should.equal(20);
143
+ }
144
+ }
145
+ });
146
+ it('a withdrawal with P2WSH (bech32) address', async () => {
147
+ const builder = initTxBuilder();
148
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
149
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
150
+ builder.fromPubKey(pubKeyStrings);
151
+ builder.numberSignatures(2);
152
+ builder.withdraw({
153
+ amount: '75000',
154
+ btcAddress: 'bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3',
155
+ maxFee: '4000',
156
+ });
157
+ const tx = await builder.build();
158
+ const txJson = tx.toJson();
159
+ txJson.payload.should.have.property('functionName', 'initiate-withdrawal-request');
160
+ // Verify hashbytes is 32 bytes for P2WSH
161
+ const payload = tx.stxTransaction.payload;
162
+ const recipientTuple = payload.functionArgs[1];
163
+ if (recipientTuple.type === transactions_1.ClarityType.Tuple) {
164
+ const hashbytes = recipientTuple.data['hashbytes'];
165
+ if (hashbytes.type === transactions_1.ClarityType.Buffer) {
166
+ hashbytes.buffer.length.should.equal(32);
167
+ }
168
+ }
169
+ });
170
+ it('a withdrawal with P2TR (bech32m) address', async () => {
171
+ const builder = initTxBuilder();
172
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
173
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
174
+ builder.fromPubKey(pubKeyStrings);
175
+ builder.numberSignatures(2);
176
+ builder.withdraw({
177
+ amount: '300000',
178
+ btcAddress: 'bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0',
179
+ maxFee: '10000',
180
+ });
181
+ const tx = await builder.build();
182
+ const txJson = tx.toJson();
183
+ txJson.payload.should.have.property('functionName', 'initiate-withdrawal-request');
184
+ // Verify hashbytes is 32 bytes for P2TR
185
+ const payload = tx.stxTransaction.payload;
186
+ const recipientTuple = payload.functionArgs[1];
187
+ if (recipientTuple.type === transactions_1.ClarityType.Tuple) {
188
+ const hashbytes = recipientTuple.data['hashbytes'];
189
+ if (hashbytes.type === transactions_1.ClarityType.Buffer) {
190
+ hashbytes.buffer.length.should.equal(32);
191
+ }
192
+ }
193
+ });
194
+ });
195
+ describe('round-trip: serialize → deserialize → rebuild', function () {
196
+ it('should rebuild a signed withdrawal transaction from raw hex', async () => {
197
+ const builder = initTxBuilder();
198
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
199
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
200
+ builder.fromPubKey(pubKeyStrings);
201
+ builder.numberSignatures(2);
202
+ builder.withdraw({
203
+ amount: '100000',
204
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
205
+ maxFee: '5000',
206
+ });
207
+ builder.sign({ key: testData.prvKeysString[0] });
208
+ builder.sign({ key: testData.prvKeysString[1] });
209
+ const tx = await builder.build();
210
+ const rawHex = tx.toBroadcastFormat();
211
+ should_1.default.exist(rawHex);
212
+ // Deserialize
213
+ const rebuilder = factory.from(rawHex);
214
+ const tx2 = await rebuilder.build();
215
+ tx2.toBroadcastFormat().should.equal(rawHex);
216
+ });
217
+ it('should rebuild an unsigned withdrawal transaction from raw hex', async () => {
218
+ const builder = initTxBuilder();
219
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
220
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
221
+ builder.fromPubKey(pubKeyStrings);
222
+ builder.numberSignatures(2);
223
+ builder.withdraw({
224
+ amount: '100000',
225
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
226
+ maxFee: '5000',
227
+ });
228
+ const tx = await builder.build();
229
+ const rawHex = tx.toBroadcastFormat();
230
+ // Deserialize and sign
231
+ const rebuilder = factory.from(rawHex);
232
+ rebuilder.sign({ key: testData.prvKeysString[0] });
233
+ rebuilder.sign({ key: testData.prvKeysString[1] });
234
+ const tx2 = await rebuilder.build();
235
+ should_1.default.exist(tx2.toBroadcastFormat());
236
+ });
237
+ });
238
+ describe('validation', function () {
239
+ it('should reject invalid amount', function () {
240
+ const builder = initTxBuilder();
241
+ should_1.default.throws(() => builder.withdraw({
242
+ amount: '-1',
243
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
244
+ maxFee: '5000',
245
+ }), /Invalid or missing amount/);
246
+ });
247
+ it('should reject zero amount', function () {
248
+ const builder = initTxBuilder();
249
+ should_1.default.throws(() => builder.withdraw({
250
+ amount: '0',
251
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
252
+ maxFee: '5000',
253
+ }), /Invalid or missing amount/);
254
+ });
255
+ it('should reject empty amount', function () {
256
+ const builder = initTxBuilder();
257
+ should_1.default.throws(() => builder.withdraw({
258
+ amount: '',
259
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
260
+ maxFee: '5000',
261
+ }), /Invalid or missing amount/);
262
+ });
263
+ it('should reject invalid BTC address', function () {
264
+ const builder = initTxBuilder();
265
+ should_1.default.throws(() => builder.withdraw({
266
+ amount: '100000',
267
+ btcAddress: 'invalidaddress',
268
+ maxFee: '5000',
269
+ }), /Invalid or missing btcAddress/);
270
+ });
271
+ it('should reject invalid maxFee', function () {
272
+ const builder = initTxBuilder();
273
+ should_1.default.throws(() => builder.withdraw({
274
+ amount: '100000',
275
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
276
+ maxFee: '-100',
277
+ }), /Invalid or missing maxFee/);
278
+ });
279
+ it('should reject zero maxFee', function () {
280
+ const builder = initTxBuilder();
281
+ should_1.default.throws(() => builder.withdraw({
282
+ amount: '100000',
283
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
284
+ maxFee: '0',
285
+ }), /Invalid or missing maxFee/);
286
+ });
287
+ it('should reject empty maxFee', function () {
288
+ const builder = initTxBuilder();
289
+ should_1.default.throws(() => builder.withdraw({
290
+ amount: '100000',
291
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
292
+ maxFee: '',
293
+ }), /Invalid or missing maxFee/);
294
+ });
295
+ it('should fail to build without withdraw params', async () => {
296
+ const builder = initTxBuilder();
297
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
298
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
299
+ builder.fromPubKey(pubKeyStrings);
300
+ builder.numberSignatures(2);
301
+ await builder.build().should.be.rejectedWith(/Withdrawal params are not set/);
302
+ });
303
+ });
304
+ });
305
+ });
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2J0Y1dpdGhkcmF3QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc2J0Y1dpdGhkcmF3QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qix1REFBeUY7QUFHekYsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyw0Q0FBdUM7QUFFdkMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxRQUFRLENBQUMsK0JBQStCLEVBQUU7SUFDeEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUV4QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUU5RSxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7WUFDekIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUs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b0JBQ2hELE1BQU0sRUFBRSxHQUFHO2lCQUNaLENBQUMsRUFDSiwyQkFBMkIsQ0FDNUIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFO2dCQUMvQixNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDaEMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQ0gsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDZixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsVUFBVSxFQUFFLG9DQUFvQztvQkFDaEQsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQyxFQUNKLDJCQUEyQixDQUM1QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzVELE1BQU0sT0FBTyxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxnQ0FBaUIsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFpQixDQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IENsYXJpdHlUeXBlLCBwdWJLZXlmcm9tUHJpdktleSwgcHVibGljS2V5VG9TdHJpbmcgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBDb250cmFjdENhbGxQYXlsb2FkIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMvZGlzdC9wYXlsb2FkJztcblxuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHsgU3R4LCBUc3R4LCBTdHhMaWIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1N0YWNrczogc0JUQyBXaXRoZHJhdyBCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luTmFtZVRlc3QgPSAndHN0eCc7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3R4JywgU3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdHgnLCBUc3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NCVEMgV2l0aGRyYXcgQnVpbGRlcicsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZVRlc3QpKTtcblxuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFNidGNXaXRoZHJhd0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5ub25jZSgxKTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnYSB3aXRoZHJhd2FsIHdpdGggUDJQS0ggYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgIGFtb3VudDogJzEwMDAwMCcsXG4gICAgICAgICAgYnRjQWRkcmVzczogJzFCdkJNU0VZc3RXZXRxVEZuNUF1NG00R0ZnN3hKYU5WTjInLFxuICAgICAgICAgIG1heEZlZTogJzUwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnZLZXlzU3RyaW5nWzBdIH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydktleXNTdHJpbmdbMV0gfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgdHhKc29uLmZlZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5wYXlsb2FkKTtcbiAgICAgICAgdHhKc29uLnBheWxvYWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NvbnRyYWN0TmFtZScsICdzYnRjLXdpdGhkcmF3YWwnKTtcbiAgICAgICAgdHhKc29uLnBheWxvYWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Z1bmN0aW9uTmFtZScsICdpbml0aWF0ZS13aXRoZHJhd2FsLXJlcXVlc3QnKTtcblxuICAgICAgICAvLyBWZXJpZnkgaGFzaGJ5dGVzIGlzIDIwIGJ5dGVzIGZvciBQMlBLSFxuICAgICAgICBjb25zdCBwYXlsb2FkID0gKHR4IGFzIFN0eExpYi5UcmFuc2FjdGlvbikuc3R4VHJhbnNhY3Rpb24ucGF5bG9hZCBhcyBDb250cmFjdENhbGxQYXlsb2FkO1xuICAgICAgICBjb25zdCByZWNpcGllbnRUdXBsZSA9IHBheWxvYWQuZnVuY3Rpb25BcmdzWzFdO1xuICAgICAgICBzaG91bGQuZXF1YWwocmVjaXBpZW50VHVwbGUudHlwZSwgQ2xhcml0eVR5cGUuVHVwbGUpO1xuICAgICAgICBpZiAocmVjaXBpZW50VHVwbGUudHlwZSA9PT0gQ2xhcml0eVR5cGUuVHVwbGUpIHtcbiAgICAgICAgICBjb25zdCBoYXNoYnl0ZXMgPSByZWNpcGllbnRUdXBsZS5kYXRhWydoYXNoYnl0ZXMnXTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoaGFzaGJ5dGVzLnR5cGUsIENsYXJpdHlUeXBlLkJ1ZmZlcik7XG4gICAgICAgICAgaWYgKGhhc2hieXRlcy50eXBlID09PSBDbGFyaXR5VHlwZS5CdWZmZXIpIHtcbiAgICAgICAgICAgIGhhc2hieXRlcy5idWZmZXIubGVuZ3RoLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egd2l0aGRyYXdhbCB3aXRoIFAyU0ggYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgIGFtb3VudDogJzIwMDAwMCcsXG4gICAgICAgICAgYnRjQWRkcmVzczogJzNKOTh0MVdwRVo3M0NObVF2aWVjcm55aVdybnFSaFdOTHknLFxuICAgICAgICAgIG1heEZlZTogJzMwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24ucGF5bG9hZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZnVuY3Rpb25OYW1lJywgJ2luaXRpYXRlLXdpdGhkcmF3YWwtcmVxdWVzdCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBoYXNoYnl0ZXMgaXMgMjAgYnl0ZXMgZm9yIFAyU0hcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9ICh0eCBhcyBTdHhMaWIuVHJhbnNhY3Rpb24pLnN0eFRyYW5zYWN0aW9uLnBheWxvYWQgYXMgQ29udHJhY3RDYWxsUGF5bG9hZDtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50VHVwbGUgPSBwYXlsb2FkLmZ1bmN0aW9uQXJnc1sxXTtcbiAgICAgICAgaWYgKHJlY2lwaWVudFR1cGxlLnR5cGUgPT09IENsYXJpdHlUeXBlLlR1cGxlKSB7XG4gICAgICAgICAgY29uc3QgaGFzaGJ5dGVzID0gcmVjaXBpZW50VHVwbGUuZGF0YVsnaGFzaGJ5dGVzJ107XG4gICAgICAgICAgaWYgKGhhc2hieXRlcy50eXBlID09PSBDbGFyaXR5VHlwZS5CdWZmZXIpIHtcbiAgICAgICAgICAgIGhhc2hieXRlcy5idWZmZXIubGVuZ3RoLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egd2l0aGRyYXdhbCB3aXRoIFAyV1BLSCAoYmVjaDMyKSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBjb25zdCBwdWJLZXlzID0gdGVzdERhdGEucHJ2S2V5c1N0cmluZy5tYXAocHViS2V5ZnJvbVByaXZLZXkpO1xuICAgICAgICBjb25zdCBwdWJLZXlTdHJpbmdzID0gcHViS2V5cy5tYXAocHVibGljS2V5VG9TdHJpbmcpO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkocHViS2V5U3RyaW5ncyk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgYnVpbGRlci53aXRoZHJhdyh7XG4gICAgICAgICAgYW1vdW50OiAnNTAwMDAnLFxuICAgICAgICAgIGJ0Y0FkZHJlc3M6ICdiYzFxdzUwOGQ2cWVqeHRkZzR5NXIzemFydmFyeTBjNXh3N2t2OGYzdDQnLFxuICAgICAgICAgIG1heEZlZTogJzIwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24ucGF5bG9hZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZnVuY3Rpb25OYW1lJywgJ2luaXRpYXRlLXdpdGhkcmF3YWwtcmVxdWVzdCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBoYXNoYnl0ZXMgaXMgMjAgYnl0ZXMgZm9yIFAyV1BLSFxuICAgICAgICBjb25zdCBwYXlsb2FkID0gKHR4IGFzIFN0eExpYi5UcmFuc2FjdGlvbikuc3R4VHJhbnNhY3Rpb24ucGF5bG9hZCBhcyBDb250cmFjdENhbGxQYXlsb2FkO1xuICAgICAgICBjb25zdCByZWNpcGllbnRUdXBsZSA9IHBheWxvYWQuZnVuY3Rpb25BcmdzWzFdO1xuICAgICAgICBpZiAocmVjaXBpZW50VHVwbGUudHlwZSA9PT0gQ2xhcml0eVR5cGUuVHVwbGUpIHtcbiAgICAgICAgICBjb25zdCBoYXNoYnl0ZXMgPSByZWNpcGllbnRUdXBsZS5kYXRhWydoYXNoYnl0ZXMnXTtcbiAgICAgICAgICBpZiAoaGFzaGJ5dGVzLnR5cGUgPT09IENsYXJpdHlUeXBlLkJ1ZmZlcikge1xuICAgICAgICAgICAgaGFzaGJ5dGVzLmJ1ZmZlci5sZW5ndGguc2hvdWxkLmVxdWFsKDIwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB3aXRoZHJhd2FsIHdpdGggUDJXU0ggKGJlY2gzMikgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgIGFtb3VudDogJzc1MDAwJyxcbiAgICAgICAgICBidGNBZGRyZXNzOiAnYmMxcXJwMzNnMHE1YzV0eHNwOWFyeXNyeDRrNnpka2ZzNG5jZTR4ajBnZGNjY2VmdnB5c3hmM3FjY2ZtdjMnLFxuICAgICAgICAgIG1heEZlZTogJzQwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24ucGF5bG9hZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZnVuY3Rpb25OYW1lJywgJ2luaXRpYXRlLXdpdGhkcmF3YWwtcmVxdWVzdCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBoYXNoYnl0ZXMgaXMgMzIgYnl0ZXMgZm9yIFAyV1NIXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSAodHggYXMgU3R4TGliLlRyYW5zYWN0aW9uKS5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkIGFzIENvbnRyYWN0Q2FsbFBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudFR1cGxlID0gcGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV07XG4gICAgICAgIGlmIChyZWNpcGllbnRUdXBsZS50eXBlID09PSBDbGFyaXR5VHlwZS5UdXBsZSkge1xuICAgICAgICAgIGNvbnN0IGhhc2hieXRlcyA9IHJlY2lwaWVudFR1cGxlLmRhdGFbJ2hhc2hieXRlcyddO1xuICAgICAgICAgIGlmIChoYXNoYnl0ZXMudHlwZSA9PT0gQ2xhcml0eVR5cGUuQnVmZmVyKSB7XG4gICAgICAgICAgICBoYXNoYnl0ZXMuYnVmZmVyLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHdpdGhkcmF3YWwgd2l0aCBQMlRSIChiZWNoMzJtKSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBjb25zdCBwdWJLZXlzID0gdGVzdERhdGEucHJ2S2V5c1N0cmluZy5tYXAocHViS2V5ZnJvbVByaXZLZXkpO1xuICAgICAgICBjb25zdCBwdWJLZXlTdHJpbmdzID0gcHViS2V5cy5tYXAocHVibGljS2V5VG9TdHJpbmcpO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkocHViS2V5U3RyaW5ncyk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgYnVpbGRlci53aXRoZHJhdyh7XG4gICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICBidGNBZGRyZXNzOiAnYmMxcDB4bHh2bGhlbWphNmM0ZHF2MjJ1YXBjdHF1cGZobHhtOWg4ejNrMmU3MnE0azloY3o3dnF6azVqajAnLFxuICAgICAgICAgIG1heEZlZTogJzEwMDAwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgdHhKc29uLnBheWxvYWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Z1bmN0aW9uTmFtZScsICdpbml0aWF0ZS13aXRoZHJhd2FsLXJlcXVlc3QnKTtcblxuICAgICAgICAvLyBWZXJpZnkgaGFzaGJ5dGVzIGlzIDMyIGJ5dGVzIGZvciBQMlRSXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSAodHggYXMgU3R4TGliLlRyYW5zYWN0aW9uKS5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkIGFzIENvbnRyYWN0Q2FsbFBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudFR1cGxlID0gcGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV07XG4gICAgICAgIGlmIChyZWNpcGllbnRUdXBsZS50eXBlID09PSBDbGFyaXR5VHlwZS5UdXBsZSkge1xuICAgICAgICAgIGNvbnN0IGhhc2hieXRlcyA9IHJlY2lwaWVudFR1cGxlLmRhdGFbJ2hhc2hieXRlcyddO1xuICAgICAgICAgIGlmIChoYXNoYnl0ZXMudHlwZSA9PT0gQ2xhcml0eVR5cGUuQnVmZmVyKSB7XG4gICAgICAgICAgICBoYXNoYnl0ZXMuYnVmZmVyLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncm91bmQtdHJpcDogc2VyaWFsaXplIOKGkiBkZXNlcmlhbGl6ZSDihpIgcmVidWlsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgcmVidWlsZCBhIHNpZ25lZCB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uIGZyb20gcmF3IGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgIGFtb3VudDogJzEwMDAwMCcsXG4gICAgICAgICAgYnRjQWRkcmVzczogJzFCdkJNU0VZc3RXZXRxVEZuNUF1NG00R0ZnN3hKYU5WTjInLFxuICAgICAgICAgIG1heEZlZTogJzUwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnZLZXlzU3RyaW5nWzBdIH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydktleXNTdHJpbmdbMV0gfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIGNvbnN0IHJhd0hleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5leGlzdChyYXdIZXgpO1xuXG4gICAgICAgIC8vIERlc2VyaWFsaXplXG4gICAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdIZXgpO1xuICAgICAgICBjb25zdCB0eDIgPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd0hleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWJ1aWxkIGFuIHVuc2lnbmVkIHdpdGhkcmF3YWwgdHJhbnNhY3Rpb24gZnJvbSByYXcgaGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBjb25zdCBwdWJLZXlzID0gdGVzdERhdGEucHJ2S2V5c1N0cmluZy5tYXAocHViS2V5ZnJvbVByaXZLZXkpO1xuICAgICAgICBjb25zdCBwdWJLZXlTdHJpbmdzID0gcHViS2V5cy5tYXAocHVibGljS2V5VG9TdHJpbmcpO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkocHViS2V5U3RyaW5ncyk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgYnVpbGRlci53aXRoZHJhdyh7XG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwJyxcbiAgICAgICAgICBidGNBZGRyZXNzOiAnMUJ2Qk1TRVlzdFdldHFURm41QXU0bTRHRmc3eEphTlZOMicsXG4gICAgICAgICAgbWF4RmVlOiAnNTAwMCcsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCByYXdIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIERlc2VyaWFsaXplIGFuZCBzaWduXG4gICAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdIZXgpO1xuICAgICAgICByZWJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2S2V5c1N0cmluZ1swXSB9KTtcbiAgICAgICAgcmVidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydktleXNTdHJpbmdbMV0gfSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBidWlsZGVyLndpdGhkcmF3KHtcbiAgICAgICAgICAgICAgYW1vdW50OiAnLTEnLFxuICAgICAgICAgICAgICBidGNBZGRyZXNzOiAnMUJ2Qk1TRVlzdFdldHFURm41QXU0bTRHRmc3eEphTlZOMicsXG4gICAgICAgICAgICAgIG1heEZlZTogJzUwMDAnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgemVybyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgICAgYnRjQWRkcmVzczogJzFCdkJNU0VZc3RXZXRxVEZuNUF1NG00R0ZnN3hKYU5WTjInLFxuICAgICAgICAgICAgICBtYXhGZWU6ICc1MDAwJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIC9JbnZhbGlkIG9yIG1pc3NpbmcgYW1vdW50L1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLnRocm93cyhcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgYnVpbGRlci53aXRoZHJhdyh7XG4gICAgICAgICAgICAgIGFtb3VudDogJycsXG4gICAgICAgICAgICAgIGJ0Y0FkZHJlc3M6ICcxQnZCTVNFWXN0V2V0cVRGbjVBdTRtNEdGZzd4SmFOVk4yJyxcbiAgICAgICAgICAgICAgbWF4RmVlOiAnNTAwMCcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudC9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIEJUQyBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBidWlsZGVyLndpdGhkcmF3KHtcbiAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwJyxcbiAgICAgICAgICAgICAgYnRjQWRkcmVzczogJ2ludmFsaWRhZGRyZXNzJyxcbiAgICAgICAgICAgICAgbWF4RmVlOiAnNTAwMCcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvSW52YWxpZCBvciBtaXNzaW5nIGJ0Y0FkZHJlc3MvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBtYXhGZWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAnLFxuICAgICAgICAgICAgICBidGNBZGRyZXNzOiAnMUJ2Qk1TRVlzdFdldHFURm41QXU0bTRHRmc3eEphTlZOMicsXG4gICAgICAgICAgICAgIG1heEZlZTogJy0xMDAnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL0ludmFsaWQgb3IgbWlzc2luZyBtYXhGZWUvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgemVybyBtYXhGZWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGJ1aWxkZXIud2l0aGRyYXcoe1xuICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAnLFxuICAgICAgICAgICAgICBidGNBZGRyZXNzOiAnMUJ2Qk1TRVlzdFdldHFURm41QXU0bTRHRmc3eEphTlZOMicsXG4gICAgICAgICAgICAgIG1heEZlZTogJzAnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL0ludmFsaWQgb3IgbWlzc2luZyBtYXhGZWUvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgbWF4RmVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBidWlsZGVyLndpdGhkcmF3KHtcbiAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwJyxcbiAgICAgICAgICAgICAgYnRjQWRkcmVzczogJzFCdkJNU0VZc3RXZXRxVEZuNUF1NG00R0ZnN3hKYU5WTjInLFxuICAgICAgICAgICAgICBtYXhGZWU6ICcnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL0ludmFsaWQgb3IgbWlzc2luZyBtYXhGZWUvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIHdpdGhvdXQgd2l0aGRyYXcgcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBjb25zdCBwdWJLZXlzID0gdGVzdERhdGEucHJ2S2V5c1N0cmluZy5tYXAocHViS2V5ZnJvbVByaXZLZXkpO1xuICAgICAgICBjb25zdCBwdWJLZXlTdHJpbmdzID0gcHViS2V5cy5tYXAocHVibGljS2V5VG9TdHJpbmcpO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkocHViS2V5U3RyaW5ncyk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL1dpdGhkcmF3YWwgcGFyYW1zIGFyZSBub3Qgc2V0Lyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -288,6 +288,20 @@ describe('Stx util library', function () {
288
288
  Utils.getAddressVersion('SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255').should.equal(21);
289
289
  });
290
290
  });
291
+ describe('getEncodedPrincipal', function () {
292
+ it('should encode a testnet standard principal as the 22-byte Clarity blob', function () {
293
+ Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C').should.equal('051ad206838b7981a116c334e8cb1b950afb73eb54a5');
294
+ });
295
+ it('should reject contract principals', function () {
296
+ should_1.default.throws(() => Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C.my-contract'), /contract principals are not supported/);
297
+ });
298
+ it('should reject addresses with a memoId suffix', function () {
299
+ should_1.default.throws(() => Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C?memoId=0'), /must not include a query string/);
300
+ });
301
+ it('should reject invalid addresses', function () {
302
+ should_1.default.throws(() => Utils.getEncodedPrincipal('not-a-stacks-address'), /invalid Stacks address/);
303
+ });
304
+ });
291
305
  describe('xpubToSTXPubkey', function () {
292
306
  it('should succeed to convert for valid xpubs', function () {
293
307
  Utils.xpubToSTXPubkey('xpub661MyMwAqRbcGS2HMdvANN7o8ESWqwvr5U4ry5fZdD9VHhymWyfoDQF4vzfKotXgGtJTrwrFRz7XbGFov4FqdKKo6mRYNWvMp7P23DjuJnS').should.equal('03f0f3581a4256797fa8478cb6b1da6588f4c4bedc80ab2601e3a1572cf57b6156');
@@ -323,4 +337,4 @@ describe('Stx util library', function () {
323
337
  });
324
338
  });
325
339
  });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qix1REFBMEc7QUFDMUcsa0RBQTJCO0FBQzNCLHNEQUF3QztBQUN4QyxtQ0FBbUM7QUFFbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFNLENBQUM7QUFFbEMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDbEIsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sY0FBYyxHQUFHO2dCQUNyQiwwQ0FBMEM7Z0JBQzFDLDJDQUEyQztnQkFDM0MsMkNBQTJDO2dCQUMzQyxvREFBb0Q7Z0JBQ3BELG1EQUFtRDtnQkFDbkQsc0RBQXNEO2FBQ3ZELENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsMENBQTBDO2dCQUMxQywyQ0FBMkM7Z0JBQzNDLHNEQUFzRDtnQkFDdEQsa0RBQWtEO2dCQUNsRCwwREFBMEQ7Z0JBQzFELEVBQUU7Z0JBQ0YsS0FBSzthQUNOLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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LENBQUMsRUFBRSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQVc7Z0JBQ3BCLElBQUksRUFBRSwwQkFBVyxDQUFDLFlBQVk7Z0JBQzlCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQzNELENBQUM7WUFDRixLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FB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LE1BQU0sWUFBWSxHQUFHLDJDQUEyQyxDQUFDO1lBQ2pFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTlELE1BQU0sUUFBUSxHQUFHLHNEQUFzRCxDQUFDO1lBQ3hFLE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRS9ELE1BQU0sUUFBUSxHQUFHLDJDQUEyQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRS9ELE1BQU0sUUFBUSxHQUFHLDJDQUEyQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLDBDQUEwQyxDQUFDO1lBQ2hFLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUNwRSxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsUUFBUSxFQUFFLENBQUMsQ0FDM0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEFkZHJlc3NWZXJzaW9uLCBDbGFyaXR5VHlwZSwgSW50Q1YsIE5vbmVDViwgU29tZUNWLCBVSW50Q1YsIExpc3RDViB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCBCaWdOdW0gZnJvbSAnYm4uanMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgU3R4TGliIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuY29uc3QgeyBLZXlQYWlyLCBVdGlscyB9ID0gU3R4TGliO1xuXG5kZXNjcmliZSgnU3R4IHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2FkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ1NUQjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnLFxuICAgICAgICAnU1QxMU5KVFRLR1ZUNkQxSFk0TkpSVlFXTVFNN1RWQVIwOTFFSjhQMlknLFxuICAgICAgICAnU1AyVDc1OEs2VDJZUktHOVEwVEoxNkI2RlA1UVFSRVdaU0VTUlMwUFknLFxuICAgICAgICAnU1QxV1ZKTVM1VlM0MUYwWU1IN0QyTTBWSFhSRzRDWTQzWkpaQlM2MEE/bWVtb0lkPTQnLFxuICAgICAgICAnU1BTWkJaM1cwSkMyTUVCTjBNOVBBTTJRQjVTSDcyUVlFUUFNTjZIRD9tZW1vSWQ9MCcsXG4gICAgICAgICdTUDNCVjcwOTJLOVpTOU5KOVpZTVBYRTY5U1Y2WTYwNzJNN0hFWjQ5RT9tZW1vSWQ9MjU1JyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB2YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkQWRkcmVzc1dpdGhQYXltZW50SWQoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICdTUDI0NEhZUFlBVDJCQjJRRTUxM05TUDgxSFRNWVdCSlAwMkhQR0s2JyxcbiAgICAgICAgJ1NUMVQ3NThLNlQyWVJLRzlRMFRKMTZCNkZQNVFRUkVXWlNFU1JTMFBZJyxcbiAgICAgICAgJ1NUMVdWSk1TNVZTNDFGMFlNSDdEMk0wVkhYUkc0Q1k0M1pKWkJTNjBBP21lbW9JZD1OYU4nLFxuICAgICAgICAnU1BTWkJaM1cwSkMyTUVCTjBNOVBBTTJRQjVTSDcyUVlFUUFNTjZIRD9tZW1vSWQ9JyxcbiAgICAgICAgJ1NQM0JWNzA5Mks5WlM5Tko5WllNUFhFNjlTVjZZNjA3Mk03SEVaNDlFP21lbW9JZD10ZXN0aW5nJyxcbiAgICAgICAgJycsXG4gICAgICAgICdhYmMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBVdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gY29tcHJlc3NlZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleXMgPSBbXG4gICAgICAgICcwMjYzZTFmMmYzMjJmYjc0MjI0ZTIxMGY5ZDYxNmZjZTE0ZDEwZmE4OTUyMGRjZGUzZDZkMDI1MTRjZGIxNjg0NmEnLFxuICAgICAgICAnMDJkNWRlOWUxYjljMTNmYzdiNjc0NDZlYmNmZjRmYmI5YWE2YjE5MzNmOTA3ZTlhYWJmMzJmNDhkNmUwYTUwNjRkJyxcbiAgICAgICAgJzAyOTZjNGI4MzUzYzRhOTM4MTczZjgwNzA2ZGY0ODBjZjZmODU1MjNiNDI4ZDU5ZWU4MWQ5ZWZmY2Y2MWU1ZWFlOCcsXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhZGRyZXNzID0gVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpO1xuXG4gICAgICBhZGRyZXNzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTTFXOVBCVlRaQTlTUk5CUUoyQTA1UjNUMFpWWUM5NFBEMEFOOUtERycpO1xuICAgICAgYWRkcmVzcy5oYXNoMTYwLnNob3VsZC5lcXVhbCgnNzg5YjJmN2FmYTkzOWM1NTc3OTA5NDAyZTA3YTA3ZjdlNjI0OTY2OCcpO1xuXG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uVGVzdG5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NOMVc5UEJWVFpBOVNSTkJRSjJBMDVSM1QwWlZZQzk0UEQwQTlHR01aJ1xuICAgICAgKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5NYWlubmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU00xVzlQQlZUWkE5U1JOQlFKMkEwNVIzVDBaVllDOTRQRDBBTjlLREcnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBtdWx0aXNpZyBhZGRyZXNzZXMgZnJvbSB1bmNvbXByZXNzZWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlzID0gW1xuICAgICAgICAnMDQ5NzQyYjkwODU3OWZmZDIyNWQ1ZTFkOTQ4NjQ3MWYxOWExMDFkZDA0YjdhODFkMTFkYTg4MmU3YWM3ZjNlMDQyOTg5YzMxMTUyNGEzMzM1ZTE1ZGVjOTMzOGEwN2JkMjFiNmU0NDQ0YjZiNzc0NGQzMTRjYzkyNmExZjAzODNkYicsXG4gICAgICAgICcwNDY0MDk3Y2NiYzIyOTA1ZWM2ZjY3OGM4NDYzNDYyOTQwMzNlMTFhMjE2ZDEzM2FiZjZhZjI1MjI5NDY5NWIzNTM4ZDY1ZjY1YjE4OGI2ZTcyZTE4OTBlNzczOGY5ZTIyMTk0NGU2MThkZWExMTc4ZWY3NDk3MTdiMzU0OTJkZTZhJyxcbiAgICAgICAgJzA0MmM2MDg0MDgzNTJhYjQxNDc3YWQ5ZGQxY2FiY2E5ZTcxMmRlMmRmZjNjNWM4YmZhNGI1ZjdmMWEwZjc0YTMyNDAyYTgyNmQyY2U1ZjNhNmIwMWMxNmFlZWJkZDMwNGUyMzU3OTE5NThiYmY5N2EwOGI1ZDRlOWRkNGRiMzk5YjcnLFxuICAgICAgXTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTTJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WODZGQ0NRNCcpO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLlRlc3RuZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTjJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WOTBQN1lHUydcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNMlRGOEMwMDNKRTVZQThCNDNDMlpBWTBLOTVRRlZKTlY4NkZDQ1E0J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5cyA9IFtcbiAgICAgICAgJzA0ZDZmMGY3ZDk3YTcyOTc5NTk2YTE3ZmEyOTQ2ZWFlZmYzNzAzMjUwYTYyNjQwMjcxZWVhNTk0NzdmNWIxOWYzOWFkMDFjZTJhNTMwMjVlYmEzNjVhNGY0MGRkMDg1MjM0MTk0ZDFkMDZhZWZlYzJhOWQ0NDM5YmUwZjNjMmRmMzQnLFxuICAgICAgICAnMDJmNmQwNTk3ZmI2ZDU0NjcyMDNkMDgwZTE3ZjdiNGY3NjdlYWQ1OWZjMzAzYjdkNzI2MWE4MzJjYjQ0MzA1YmIwJyxcbiAgICAgICAgJzAzNGM4MGY5OTE0MTAwODI4MjRhZWU0Y2E0ODE0NzA4Mjk5N2Q0NGU4MDBkYTk4NzdlNjk0ZjljYjY0YjNjYjY0YScsXG4gICAgICBdO1xuXG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cykuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ1NNRThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTUNLTTY3RVYnKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5UZXN0bmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU05FOFBLUkhTQ0I2OTlGRUs1OUY3VDdDQkIyMjVLSDFNRFBCVktGOSdcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNRThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTUNLTTY3RVYnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gaW52YWxpZCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKFtdKSwgL0ludmFsaWQgbnVtYmVyIG9mIHB1YmxpYyBrZXlzLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbJ2JhZGtleScsICdiYWRrZXkyJ10pLCAvSW52YWxpZCBwdWJsaWMga2V5Lyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbXG4gICAgICAgICAgICAnMDJmNmQwNTk3ZmI2ZDU0NjcyMDNkMDgwZTE3ZjdiNGY3NjdlYWQ1OWZjMzAzYjdkNzI2MWE4MzJjYjQ0MzA1YmIwJyxcbiAgICAgICAgICAgICdiYWRrZXknLFxuICAgICAgICAgIF0pLFxuICAgICAgICAvSW52YWxpZCBwdWJsaWMga2V5L1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Ftb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMuaXNWYWxpZEFtb3VudCgnMTAnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ludmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMuaXNWYWxpZEFtb3VudCgnLTEwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcml2YXRlIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByb3BlciBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFt0ZXN0RGF0YS5zZWNyZXRLZXkxLCB0ZXN0RGF0YS5zZWNyZXRLZXkyLCB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJ2XTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkUHJpdmF0ZUtleShrZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBpbnZhbGlkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlzID0gW1xuICAgICAgICAnNjZjODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNDA5JyxcbiAgICAgICAgJzY4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzNDhlYTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgICAgJzB4NjZjODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0IDhlYTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDNycnh4OTA4MDE3YjZlNjA0ZGU1MWEzYTdkOTU3ZDU4NTI0JyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3B1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbdGVzdERhdGEucHViS2V5MSwgdGVzdERhdGEucHViS2V5MiwgdGVzdERhdGEucHViS2V5MkNvbXByZXNzZWRdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJzA0MjFkNmY0MmM5N2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU4NmUzY2VhNmY0MWE5NGE5YTdjMjRhMWNjZDgzNzkyMTczZjQ3NWZkYjU5MGNjODJmOTRmZjYxNWRmMzkxNDI3NjZlNzU5Y2U2Mzg3JyxcbiAgICAgICAgJzAzMjFkNmY0MmM5OWY3ZDIzZWMgMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU2ZTNjZWE2ZjQxYScsXG4gICAgICAgICcwYWE2OGMyZDZmZGIzNzA2YjM5ZjMyZDZmNDIyNTI3NWNlMDYyNTYxOTA4ZmQ3Y2E1NDBhNDRjOTJlYjg1OTRlYTZkYjlmY2ZlMGIzOTBjMGVhZDNmNDVjMzZhZmQ2ODJlYWI2MmViMTI0YTYzYjQ2MDk0NWZlMWY3YzdmOGEwOWUyJyxcbiAgICAgICAgJycsXG4gICAgICAgICdiaXRnby1zdGFja3MnLFxuICAgICAgICAnMDkyMWQ2ZjQyYzk5ZjdkMjNlYzJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlODZlM2NlYTZmNDFhJyxcbiAgICAgICAgJzAzMjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZXp6ZTNjZWE2ZjQxYScsXG4gICAgICAgICcweDAzMjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZTg2ZTNjZWE2ZjQxYScsXG4gICAgICAgIHRlc3REYXRhLmludmFsaWRQdWJLZXkxLFxuICAgICAgICB0ZXN0RGF0YS5pbnZhbGlkUHViS2V5MixcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFB1YmxpY0tleShrZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIgaWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhJZHMgPSBbXG4gICAgICAgICcweDIwOWEzZTE5NjE5NTA2M2IyZTUxOTUyMzIwODdhNzFmZTIzMjlhNmRjOGQyZmNhNTMxZDQ4YzVhNzgyNGY2NzknLFxuICAgICAgICAnNmE1OTAzNzhjMDU5Zjc4ZmI2OThlYzBhZjFmZjYxMDU4NmNiMWE1MmVlNzlmZGFlNjllNTY0MzBmZGUwOGNmNCcsXG4gICAgICAgICcwZTAxNDliYzJjODE5ZjNhZTQwY2VmOTVjYTU4OTU1YzgwYmJjOWUxNWY4YzdjNjUxYzdiODZjMjIxNGI3ZjAyJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgdHhJZCBvZiB0eElkcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eElkcyA9IFtcbiAgICAgICAgJycsXG4gICAgICAgICdiaXRnby1zdGFja3MnLFxuICAgICAgICAnMHgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjcnLFxuICAgICAgICAnNmE1OTAzNzhjMDU5Zjc4ZmI2OThlYzBhZjFmZjYxMDU4NmNiNTJlZTc5ZmRhZTY5ZTU2NDMwZmRlMDhjZjQnLFxuICAgICAgICAnMXgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjc5JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjFhenoyZWU3OWZkYWU2OWU1NjQzMGZkZTA4Y2Y0JyxcbiAgICAgICAgJzBlMDE0OWJjMmM4MTlmM2FlNDBjZWY5NWNhNTg5NTVjODBiYmM5ZTEgICA1ZjhjN2M2NTFjN2I4NmMyMjE0YjdmMDInLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCB0eElkIG9mIHR4SWRzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gbWVtbycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY2hlY2sgZm9yIHZhbGlkIG1lbW8gc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lbW9TdHJpbmdzID0gWycnLCAnVGhpcyBpcyBhIHRlc3QuJywgJ09rYXknLCAnISFUaGlzIGlzIHRoaXJ0eSBmb3VyIGJ5dGVzIGxvbmchISddO1xuICAgICAgZm9yIChjb25zdCBtZW1vIG9mIG1lbW9TdHJpbmdzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRNZW1vKG1lbW8pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaXQoJ2NoZWNrIGZvciB2YWxpZCBtZW1vIHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZW1vU3RyaW5ncyA9IFsn6pyf6pyfVGhpcyBpcyB0aGlydHkgZm91ciBjaGFycyBsb25nISEnLCAnSXQgd2FzIHRoZSBiZXN0IG9mIHRpbWVzLCBpdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzJ107XG4gICAgICBmb3IgKGNvbnN0IG1lbW8gb2YgbWVtb1N0cmluZ3MpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZE1lbW8obWVtbykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIGFuZCB2ZXJpZnknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5UGFpcjEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc2VjcmV0S2V5MSB9KTtcbiAgICBjb25zdCBrZXlQYWlyMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5zZWNyZXRLZXkyIH0pO1xuXG4gICAgaXQoJ3NpZ24gYSBtZXNzYWdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLnNpZ25NZXNzYWdlKGtleVBhaXIxLCB0ZXN0RGF0YS5tZXNzYWdlMSksIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuc2lnbk1lc3NhZ2Uoa2V5UGFpcjIsIHRlc3REYXRhLm1lc3NhZ2UyKSwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZnkgYSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBVdGlscy52ZXJpZnlTaWduYXR1cmUodGVzdERhdGEubWVzc2FnZTEsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjEuZ2V0S2V5cygpLnB1Yikuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cyBwcm9wZXJseVxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5tZXNzYWdlMixcbiAgICAgICAgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyLFxuICAgICAgICBrZXlQYWlyMi5nZXRLZXlzKGZhbHNlKS5wdWJcbiAgICAgICkuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5tZXNzYWdlMixcbiAgICAgICAgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUyLFxuICAgICAgICBrZXlQYWlyMi5nZXRLZXlzKHRydWUpLnB1YlxuICAgICAgKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlbXB0eSBtZXNzYWdlXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoJycsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjEuZ2V0S2V5cygpLnB1YiksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0Nhbm5vdCB2ZXJpZnkgZW1wdHkgbWVzc2FnZXMnKVxuICAgICAgKTtcblxuICAgICAgLy8gd3JvbmcgcHVibGljIGtleVxuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKHRlc3REYXRhLm1lc3NhZ2UxLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIyLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS5mYWxzZSgpO1xuXG4gICAgICAvLyB3cm9uZyBzaWduYXR1cmVcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0ZXN0RGF0YS5tZXNzYWdlMiwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUxLCBrZXlQYWlyMi5nZXRLZXlzKCkucHViKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmluZ2lmeUN2JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdJbnQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBJbnRDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAwLCB2YWx1ZTogJzEwMDAwMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnVUludCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFVJbnRDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuVUludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMSwgdmFsdWU6ICcxMDAwMDAnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsTm9uZSB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IE5vbmVDViA9IHsgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxOb25lIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnT3B0aW9uYWxTb21lIHR5cGUgd2l0aCB1aW50IHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFNvbWVDViA9IHtcbiAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lLFxuICAgICAgICB2YWx1ZTogeyB0eXBlOiBDbGFyaXR5VHlwZS5VSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9LFxuICAgICAgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMTAsIHZhbHVlOiB7IHR5cGU6IDEsIHZhbHVlOiAnMTAwMDAwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsU29tZSB0eXBlIHdpdGggdHVwbGUgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogU29tZUNWID0ge1xuICAgICAgICB0eXBlOiBDbGFyaXR5VHlwZS5PcHRpb25hbFNvbWUsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuVHVwbGUsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaGFzaGJ5dGVzOiB7IHR5cGU6IENsYXJpdHlUeXBlLkJ1ZmZlciwgYnVmZmVyOiBCdWZmZXIuZnJvbSgnc29tZS1oYXNoJykgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogQ2xhcml0eVR5cGUuQnVmZmVyLCBidWZmZXI6IG5ldyBCaWdOdW0oMSkudG9CdWZmZXIoKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0xpc3QgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBMaXN0Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkxpc3QsIGxpc3Q6IFt7IHR5cGU6IENsYXJpdHlUeXBlLlVJbnQsIHZhbHVlOiBCaWdJbnQoJzEwMDAwMCcpIH1dIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDExLCBsaXN0OiBbeyB0eXBlOiAxLCB2YWx1ZTogJzEwMDAwMCcgfV0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnTGlzdCB0eXBlIHdpdGggZW1wdHkgbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBMaXN0Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkxpc3QsIGxpc3Q6IFtdIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDExLCBsaXN0OiBbXSB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEFkZHJlc3NWZXJzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBmb3IgdmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTWFpbm5ldCBzaW5nbGUgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU1AxRE4yTkdSQjJSM1c3NVNUMEdBQTdEQlYxVkVCQldZWjFEMzNERVEnKS5zaG91bGQuZXF1YWwoMjIpO1xuICAgICAgLy8gTWFpbm5ldCBtdWx0aSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTTTQ2OFZFVEtBNURCMTVIV0cyUU03WTA0RUZRS1Y0NFI5RDZEMFFDJykuc2hvdWxkLmVxdWFsKDIwKTtcbiAgICAgIC8vIFRlc3RuZXQgc2luZ2xlIHNpZ1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnKS5zaG91bGQuZXF1YWwoMjYpO1xuICAgICAgLy8gVGVzdG5ldCBtdWx0aSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCcpLnNob3VsZC5lcXVhbCgyMSk7XG4gICAgICAvLyBXaXRoIE1lbW8gSWRcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTUDFETjJOR1JCMlIzVzc1U1QwR0FBN0RCVjFWRUJCV1laMUQzM0RFUT9tZW1vSWQ9MCcpLnNob3VsZC5lcXVhbCgyMik7XG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NScpLnNob3VsZC5lcXVhbCgyMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd4cHViVG9TVFhQdWJrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNvbnZlcnQgZm9yIHZhbGlkIHhwdWJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dTMkhNZHZBTk43bzhFU1dxd3ZyNVU0cnk1ZlpkRDlWSGh5bVd5Zm9EUUY0dnpmS290WGdHdEpUcndyRlJ6N1hiR0ZvdjRGcWRLS282bVJZTld2TXA3UDIzRGp1Sm5TJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAzZjBmMzU4MWE0MjU2Nzk3ZmE4NDc4Y2I2YjFkYTY1ODhmNGM0YmVkYzgwYWIyNjAxZTNhMTU3MmNmNTdiNjE1NicpO1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZFenI1Q2NwRnpQRzQ1cm1QZjc1RFR2RG9iTjVnSmltQ2F0Ykh0elI1M1NiSHpEWjFKNTZieUtTc2RjOHZTdWpHdVFweVBqYjdMc3VhMk5mQURKZXdQeE56TDNONlRqJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAyNjJiN2U4NmMxZTM2ZTQ1ZDQ1MTI2M2I1NGExYzNkNzQwYWJlYWI2MWQyMjFkMTE3NWZjM2ZkYWQ3NTI4NTNhYicpO1xuICAgICAgVXRpbHMueHB1YlRvU1RYUHVia2V5KFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dQMWFkazM0VnpSUUpFTVgyNXJDeGpFeVU5WUZGV05oV056d1BvcWdqTG9LZm5xb3RMd3J6N2tCZXZXYlJabnFUU1FyUUR1SnVZVVFhRFE1RERQRXpFWE13UFM5UEVmJ1xuICAgICAgKS5zaG91bGQuZXF1YWwoJzAzNjUyOWEwZTQxY2ZkMWE5ZDI2NWI3NGY4ZDAwMDJjOTJjNWFlYzEwZDQyMzkwMDAyNjBhMjVjZmQ1NGU0NzI2YycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QmFzZUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NXaXRoTWVtbyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIFV0aWxzLmdldEJhc2VBZGRyZXNzKGFkZHJlc3NXaXRoTWVtbykuc2hvdWxkLmVxdWFsKGJhc2VBZGRyZXNzKTtcbiAgICAgIFV0aWxzLmdldEJhc2VBZGRyZXNzKGJhc2VBZGRyZXNzKS5zaG91bGQuZXF1YWwoYmFzZUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTYW1lQmFzZUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBpZiBiYXNlIGFkZHJlc3MgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYP21lbW9JZD0yNTUnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3MgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzcywgYmFzZUFkZHJlc3MpLnNob3VsZC50cnVlKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3MyID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzMiA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzMiwgYmFzZUFkZHJlc3MyKS5zaG91bGQudHJ1ZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzMyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzMyA9ICdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJztcbiAgICAgIFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3MzLCBiYXNlQWRkcmVzczMpLnNob3VsZC5mYWxzZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzNCA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczQgPSAnU1QxU1JDQTkzQ0UxV0Q4VEVHMjhCU1dCRlI2OEoyNFpUQUIyRkFKMCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzNCwgYmFzZUFkZHJlc3M0KS5zaG91bGQuZmFsc2UoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczUgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFOREYnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3M1ID0gJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczUsIGJhc2VBZGRyZXNzNSkuc2hvdWxkLmZhbHNlKCksXG4gICAgICAgIG5ldyBSZWdFeHAoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzNX1gKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qix1REFBMEc7QUFDMUcsa0RBQTJCO0FBQzNCLHNEQUF3QztBQUN4QyxtQ0FBbUM7QUFFbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFNLENBQUM7QUFFbEMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDbEIsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sY0FBYyxHQUFHO2dCQUNyQiwwQ0FBMEM7Z0JBQzFDLDJDQUEyQztnQkFDM0MsMkNBQTJDO2dCQUMzQyxvREFBb0Q7Z0JBQ3BELG1EQUFtRDtnQkFDbkQsc0RBQXNEO2FBQ3ZELENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsMENBQTBDO2dCQUMxQywyQ0FBMkM7Z0JBQzNDLHNEQUFzRDtnQkFDdEQsa0RBQWtEO2dCQUNsRCwwREFBMEQ7Z0JBQzFELEVBQUU7Z0JBQ0YsS0FBSzthQUNOLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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LENBQUMsRUFBRSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQVc7Z0JBQ3BCLElBQUksRUFBRSwwQkFBVyxDQUFDLFlBQVk7Z0JBQzlCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQzNELENBQUM7WUFDRixLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FB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QztZQUM3RCxNQUFNLFlBQVksR0FBRywwQ0FBMEMsQ0FBQztZQUNoRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvRCxNQUFNLFFBQVEsR0FBRywyQ0FBMkMsQ0FBQztZQUM3RCxNQUFNLFlBQVksR0FBRywwQ0FBMEMsQ0FBQztZQUNoRSxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFDcEUsSUFBSSxNQUFNLENBQUMsb0JBQW9CLFFBQVEsRUFBRSxDQUFDLENBQzNDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBBZGRyZXNzVmVyc2lvbiwgQ2xhcml0eVR5cGUsIEludENWLCBOb25lQ1YsIFNvbWVDViwgVUludENWLCBMaXN0Q1YgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgQmlnTnVtIGZyb20gJ2JuLmpzJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4vcmVzb3VyY2VzJztcbmltcG9ydCB7IFN0eExpYiB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmNvbnN0IHsgS2V5UGFpciwgVXRpbHMgfSA9IFN0eExpYjtcblxuZGVzY3JpYmUoJ1N0eCB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICdTVEI0NEhZUFlBVDJCQjJRRTUxM05TUDgxSFRNWVdCSlAwMkhQR0s2JyxcbiAgICAgICAgJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJyxcbiAgICAgICAgJ1NQMlQ3NThLNlQyWVJLRzlRMFRKMTZCNkZQNVFRUkVXWlNFU1JTMFBZJyxcbiAgICAgICAgJ1NUMVdWSk1TNVZTNDFGMFlNSDdEMk0wVkhYUkc0Q1k0M1pKWkJTNjBBP21lbW9JZD00JyxcbiAgICAgICAgJ1NQU1pCWjNXMEpDMk1FQk4wTTlQQU0yUUI1U0g3MlFZRVFBTU42SEQ/bWVtb0lkPTAnLFxuICAgICAgICAnU1AzQlY3MDkySzlaUzlOSjlaWU1QWEU2OVNWNlk2MDcyTTdIRVo0OUU/bWVtb0lkPTI1NScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkQWRkcmVzc2VzID0gW1xuICAgICAgICAnU1AyNDRIWVBZQVQyQkIyUUU1MTNOU1A4MUhUTVlXQkpQMDJIUEdLNicsXG4gICAgICAgICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWScsXG4gICAgICAgICdTVDFXVkpNUzVWUzQxRjBZTUg3RDJNMFZIWFJHNENZNDNaSlpCUzYwQT9tZW1vSWQ9TmFOJyxcbiAgICAgICAgJ1NQU1pCWjNXMEpDMk1FQk4wTTlQQU0yUUI1U0g3MlFZRVFBTU42SEQ/bWVtb0lkPScsXG4gICAgICAgICdTUDNCVjcwOTJLOVpTOU5KOVpZTVBYRTY5U1Y2WTYwNzJNN0hFWjQ5RT9tZW1vSWQ9dGVzdGluZycsXG4gICAgICAgICcnLFxuICAgICAgICAnYWJjJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBpbnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBVdGlscy5pc1ZhbGlkQWRkcmVzc1dpdGhQYXltZW50SWQoYWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGNvbXByZXNzZWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlzID0gW1xuICAgICAgICAnMDI2M2UxZjJmMzIyZmI3NDIyNGUyMTBmOWQ2MTZmY2UxNGQxMGZhODk1MjBkY2RlM2Q2ZDAyNTE0Y2RiMTY4NDZhJyxcbiAgICAgICAgJzAyZDVkZTllMWI5YzEzZmM3YjY3NDQ2ZWJjZmY0ZmJiOWFhNmIxOTMzZjkwN2U5YWFiZjMyZjQ4ZDZlMGE1MDY0ZCcsXG4gICAgICAgICcwMjk2YzRiODM1M2M0YTkzODE3M2Y4MDcwNmRmNDgwY2Y2Zjg1NTIzYjQyOGQ1OWVlODFkOWVmZmNmNjFlNWVhZTgnLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWRkcmVzcyA9IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzKTtcblxuICAgICAgYWRkcmVzcy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU00xVzlQQlZUWkE5U1JOQlFKMkEwNVIzVDBaVllDOTRQRDBBTjlLREcnKTtcbiAgICAgIGFkZHJlc3MuaGFzaDE2MC5zaG91bGQuZXF1YWwoJzc4OWIyZjdhZmE5MzljNTU3NzkwOTQwMmUwN2EwN2Y3ZTYyNDk2NjgnKTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLlRlc3RuZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTjFXOVBCVlRaQTlTUk5CUUoyQTA1UjNUMFpWWUM5NFBEMEE5R0dNWidcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNMVc5UEJWVFpBOVNSTkJRSjJBMDVSM1QwWlZZQzk0UEQwQU45S0RHJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5cyA9IFtcbiAgICAgICAgJzA0OTc0MmI5MDg1NzlmZmQyMjVkNWUxZDk0ODY0NzFmMTlhMTAxZGQwNGI3YTgxZDExZGE4ODJlN2FjN2YzZTA0Mjk4OWMzMTE1MjRhMzMzNWUxNWRlYzkzMzhhMDdiZDIxYjZlNDQ0NGI2Yjc3NDRkMzE0Y2M5MjZhMWYwMzgzZGInLFxuICAgICAgICAnMDQ2NDA5N2NjYmMyMjkwNWVjNmY2NzhjODQ2MzQ2Mjk0MDMzZTExYTIxNmQxMzNhYmY2YWYyNTIyOTQ2OTViMzUzOGQ2NWY2NWIxODhiNmU3MmUxODkwZTc3MzhmOWUyMjE5NDRlNjE4ZGVhMTE3OGVmNzQ5NzE3YjM1NDkyZGU2YScsXG4gICAgICAgICcwNDJjNjA4NDA4MzUyYWI0MTQ3N2FkOWRkMWNhYmNhOWU3MTJkZTJkZmYzYzVjOGJmYTRiNWY3ZjFhMGY3NGEzMjQwMmE4MjZkMmNlNWYzYTZiMDFjMTZhZWViZGQzMDRlMjM1NzkxOTU4YmJmOTdhMDhiNWQ0ZTlkZDRkYjM5OWI3JyxcbiAgICAgIF07XG5cbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzKS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU00yVEY4QzAwM0pFNVlBOEI0M0MyWkFZMEs5NVFGVkpOVjg2RkNDUTQnKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5UZXN0bmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU04yVEY4QzAwM0pFNVlBOEI0M0MyWkFZMEs5NVFGVkpOVjkwUDdZR1MnXG4gICAgICApO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLk1haW5uZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTTJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WODZGQ0NRNCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleXMgPSBbXG4gICAgICAgICcwNGQ2ZjBmN2Q5N2E3Mjk3OTU5NmExN2ZhMjk0NmVhZWZmMzcwMzI1MGE2MjY0MDI3MWVlYTU5NDc3ZjViMTlmMzlhZDAxY2UyYTUzMDI1ZWJhMzY1YTRmNDBkZDA4NTIzNDE5NGQxZDA2YWVmZWMyYTlkNDQzOWJlMGYzYzJkZjM0JyxcbiAgICAgICAgJzAyZjZkMDU5N2ZiNmQ1NDY3MjAzZDA4MGUxN2Y3YjRmNzY3ZWFkNTlmYzMwM2I3ZDcyNjFhODMyY2I0NDMwNWJiMCcsXG4gICAgICAgICcwMzRjODBmOTkxNDEwMDgyODI0YWVlNGNhNDgxNDcwODI5OTdkNDRlODAwZGE5ODc3ZTY5NGY5Y2I2NGIzY2I2NGEnLFxuICAgICAgXTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTUU4UEtSSFNDQjY5OUZFSzU5RjdUN0NCQjIyNUtIMU1DS002N0VWJyk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uVGVzdG5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NORThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTURQQlZLRjknXG4gICAgICApO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLk1haW5uZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTUU4UEtSSFNDQjY5OUZFSzU5RjdUN0NCQjIyNUtIMU1DS002N0VWJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGludmFsaWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbXSksIC9JbnZhbGlkIG51bWJlciBvZiBwdWJsaWMga2V5cy8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMoWydiYWRrZXknLCAnYmFka2V5MiddKSwgL0ludmFsaWQgcHVibGljIGtleS8pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMoW1xuICAgICAgICAgICAgJzAyZjZkMDU5N2ZiNmQ1NDY3MjAzZDA4MGUxN2Y3YjRmNzY3ZWFkNTlmYzMwM2I3ZDcyNjFhODMyY2I0NDMwNWJiMCcsXG4gICAgICAgICAgICAnYmFka2V5JyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgL0ludmFsaWQgcHVibGljIGtleS9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3ZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmlzVmFsaWRBbW91bnQoJzEwJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdpbnZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmlzVmFsaWRBbW91bnQoJy0xMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbdGVzdERhdGEuc2VjcmV0S2V5MSwgdGVzdERhdGEuc2VjcmV0S2V5MiwgdGVzdERhdGEuQUNDT1VOVF8xLnBydl07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0OGVhMDgwMTdiNmU2MDRkZTUxYTNhN2Q5NTdkNTg1MjQwOScsXG4gICAgICAgICc2ODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICcweDY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0OGVhMDgwMTdiNmU2MDRkZTUxYTNhN2Q5NTdkNTg1MjQnLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2JpdGdvLXN0YWNrcycsXG4gICAgICAgICc2NmM4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzNCA4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICc2NmM4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzcnJ4eDkwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KGtleSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlzID0gW3Rlc3REYXRhLnB1YktleTEsIHRlc3REYXRhLnB1YktleTIsIHRlc3REYXRhLnB1YktleTJDb21wcmVzc2VkXTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkUHVibGljS2V5KGtleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGludmFsaWQga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICAgICcwNDIxZDZmNDJjOTdkMjNlYzJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlODZlM2NlYTZmNDFhOTRhOWE3YzI0YTFjY2Q4Mzc5MjE3M2Y0NzVmZGI1OTBjYzgyZjk0ZmY2MTVkZjM5MTQyNzY2ZTc1OWNlNjM4NycsXG4gICAgICAgICcwMzIxZDZmNDJjOTlmN2QyM2VjIDJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlNmUzY2VhNmY0MWEnLFxuICAgICAgICAnMGFhNjhjMmQ2ZmRiMzcwNmIzOWYzMmQ2ZjQyMjUyNzVjZTA2MjU2MTkwOGZkN2NhNTQwYTQ0YzkyZWI4NTk0ZWE2ZGI5ZmNmZTBiMzkwYzBlYWQzZjQ1YzM2YWZkNjgyZWFiNjJlYjEyNGE2M2I0NjA5NDVmZTFmN2M3ZjhhMDllMicsXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzA5MjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZTg2ZTNjZWE2ZjQxYScsXG4gICAgICAgICcwMzIxZDZmNDJjOTlmN2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGV6emUzY2VhNmY0MWEnLFxuICAgICAgICAnMHgwMzIxZDZmNDJjOTlmN2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU4NmUzY2VhNmY0MWEnLFxuICAgICAgICB0ZXN0RGF0YS5pbnZhbGlkUHViS2V5MSxcbiAgICAgICAgdGVzdERhdGEuaW52YWxpZFB1YktleTIsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIGlkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIGlkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SWRzID0gW1xuICAgICAgICAnMHgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjc5JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjFhNTJlZTc5ZmRhZTY5ZTU2NDMwZmRlMDhjZjQnLFxuICAgICAgICAnMGUwMTQ5YmMyYzgxOWYzYWU0MGNlZjk1Y2E1ODk1NWM4MGJiYzllMTVmOGM3YzY1MWM3Yjg2YzIyMTRiN2YwMicsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IHR4SWQgb2YgdHhJZHMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGludmFsaWQgaWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhJZHMgPSBbXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzB4MjA5YTNlMTk2MTk1MDYzYjJlNTE5NTIzMjA4N2E3MWZlMjMyOWE2ZGM4ZDJmY2E1MzFkNDhjNWE3ODI0ZjY3JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjUyZWU3OWZkYWU2OWU1NjQzMGZkZTA4Y2Y0JyxcbiAgICAgICAgJzF4MjA5YTNlMTk2MTk1MDYzYjJlNTE5NTIzMjA4N2E3MWZlMjMyOWE2ZGM4ZDJmY2E1MzFkNDhjNWE3ODI0ZjY3OScsXG4gICAgICAgICc2YTU5MDM3OGMwNTlmNzhmYjY5OGVjMGFmMWZmNjEwNTg2Y2IxYXp6MmVlNzlmZGFlNjllNTY0MzBmZGUwOGNmNCcsXG4gICAgICAgICcwZTAxNDliYzJjODE5ZjNhZTQwY2VmOTVjYTU4OTU1YzgwYmJjOWUxICAgNWY4YzdjNjUxYzdiODZjMjIxNGI3ZjAyJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgdHhJZCBvZiB0eElkcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIG1lbW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2NoZWNrIGZvciB2YWxpZCBtZW1vIHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZW1vU3RyaW5ncyA9IFsnJywgJ1RoaXMgaXMgYSB0ZXN0LicsICdPa2F5JywgJyEhVGhpcyBpcyB0aGlydHkgZm91ciBieXRlcyBsb25nISEnXTtcbiAgICAgIGZvciAoY29uc3QgbWVtbyBvZiBtZW1vU3RyaW5ncykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkTWVtbyhtZW1vKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdjaGVjayBmb3IgdmFsaWQgbWVtbyBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVtb1N0cmluZ3MgPSBbJ+qcn+qcn1RoaXMgaXMgdGhpcnR5IGZvdXIgY2hhcnMgbG9uZyEhJywgJ0l0IHdhcyB0aGUgYmVzdCBvZiB0aW1lcywgaXQgd2FzIHRoZSB3b3JzdCBvZiB0aW1lcyddO1xuICAgICAgZm9yIChjb25zdCBtZW1vIG9mIG1lbW9TdHJpbmdzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRNZW1vKG1lbW8pLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbiBhbmQgdmVyaWZ5JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGtleVBhaXIxID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnNlY3JldEtleTEgfSk7XG4gICAgY29uc3Qga2V5UGFpcjIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc2VjcmV0S2V5MiB9KTtcblxuICAgIGl0KCdzaWduIGEgbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5zaWduTWVzc2FnZShrZXlQYWlyMSwgdGVzdERhdGEubWVzc2FnZTEpLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLnNpZ25NZXNzYWdlKGtleVBhaXIyLCB0ZXN0RGF0YS5tZXNzYWdlMiksIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMik7XG4gICAgfSk7XG5cbiAgICBpdCgndmVyaWZ5IGEgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKHRlc3REYXRhLm1lc3NhZ2UxLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIxLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIC8vIGhhbmRsZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgcHVibGljIGtleXMgcHJvcGVybHlcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEubWVzc2FnZTIsXG4gICAgICAgIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMixcbiAgICAgICAga2V5UGFpcjIuZ2V0S2V5cyhmYWxzZSkucHViXG4gICAgICApLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEubWVzc2FnZTIsXG4gICAgICAgIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMixcbiAgICAgICAga2V5UGFpcjIuZ2V0S2V5cyh0cnVlKS5wdWJcbiAgICAgICkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZlcmlmeSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZW1wdHkgbWVzc2FnZVxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gVXRpbHMudmVyaWZ5U2lnbmF0dXJlKCcnLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIxLmdldEtleXMoKS5wdWIpLFxuICAgICAgICBuZXcgUmVnRXhwKCdDYW5ub3QgdmVyaWZ5IGVtcHR5IG1lc3NhZ2VzJylcbiAgICAgICk7XG5cbiAgICAgIC8vIHdyb25nIHB1YmxpYyBrZXlcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0ZXN0RGF0YS5tZXNzYWdlMSwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUxLCBrZXlQYWlyMi5nZXRLZXlzKCkucHViKS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgICAgLy8gd3Jvbmcgc2lnbmF0dXJlXG4gICAgICBVdGlscy52ZXJpZnlTaWduYXR1cmUodGVzdERhdGEubWVzc2FnZTIsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjIuZ2V0S2V5cygpLnB1Yikuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpbmdpZnlDdicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnSW50IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogSW50Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMCwgdmFsdWU6ICcxMDAwMDAnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1VJbnQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBVSW50Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLlVJbnQsIHZhbHVlOiBCaWdJbnQoJzEwMDAwMCcpIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDEsIHZhbHVlOiAnMTAwMDAwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdPcHRpb25hbE5vbmUgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBOb25lQ1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLk9wdGlvbmFsTm9uZSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsU29tZSB0eXBlIHdpdGggdWludCB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBTb21lQ1YgPSB7XG4gICAgICAgIHR5cGU6IENsYXJpdHlUeXBlLk9wdGlvbmFsU29tZSxcbiAgICAgICAgdmFsdWU6IHsgdHlwZTogQ2xhcml0eVR5cGUuVUludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfSxcbiAgICAgIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDEwLCB2YWx1ZTogeyB0eXBlOiAxLCB2YWx1ZTogJzEwMDAwMCcgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdPcHRpb25hbFNvbWUgdHlwZSB3aXRoIHR1cGxlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFNvbWVDViA9IHtcbiAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHR5cGU6IENsYXJpdHlUeXBlLlR1cGxlLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGhhc2hieXRlczogeyB0eXBlOiBDbGFyaXR5VHlwZS5CdWZmZXIsIGJ1ZmZlcjogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IHR5cGU6IENsYXJpdHlUeXBlLkJ1ZmZlciwgYnVmZmVyOiBuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdMaXN0IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogTGlzdENWID0geyB0eXBlOiBDbGFyaXR5VHlwZS5MaXN0LCBsaXN0OiBbeyB0eXBlOiBDbGFyaXR5VHlwZS5VSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9XSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAxMSwgbGlzdDogW3sgdHlwZTogMSwgdmFsdWU6ICcxMDAwMDAnIH1dIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ0xpc3QgdHlwZSB3aXRoIGVtcHR5IGxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogTGlzdENWID0geyB0eXBlOiBDbGFyaXR5VHlwZS5MaXN0LCBsaXN0OiBbXSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAxMSwgbGlzdDogW10gfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzVmVyc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gZm9yIHZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE1haW5uZXQgc2luZ2xlIHNpZ1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NQMUROMk5HUkIyUjNXNzVTVDBHQUE3REJWMVZFQkJXWVoxRDMzREVRJykuc2hvdWxkLmVxdWFsKDIyKTtcbiAgICAgIC8vIE1haW5uZXQgbXVsdGkgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU000NjhWRVRLQTVEQjE1SFdHMlFNN1kwNEVGUUtWNDRSOUQ2RDBRQycpLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgICAvLyBUZXN0bmV0IHNpbmdsZSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJykuc2hvdWxkLmVxdWFsKDI2KTtcbiAgICAgIC8vIFRlc3RuZXQgbXVsdGkgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnKS5zaG91bGQuZXF1YWwoMjEpO1xuICAgICAgLy8gV2l0aCBNZW1vIElkXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU1AxRE4yTkdSQjJSM1c3NVNUMEdBQTdEQlYxVkVCQldZWjFEMzNERVE/bWVtb0lkPTAnKS5zaG91bGQuZXF1YWwoMjIpO1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYP21lbW9JZD0yNTUnKS5zaG91bGQuZXF1YWwoMjEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0RW5jb2RlZFByaW5jaXBhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSBhIHRlc3RuZXQgc3RhbmRhcmQgcHJpbmNpcGFsIGFzIHRoZSAyMi1ieXRlIENsYXJpdHkgYmxvYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDJykuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUxYWQyMDY4MzhiNzk4MWExMTZjMzM0ZThjYjFiOTUwYWZiNzNlYjU0YTUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY29udHJhY3QgcHJpbmNpcGFscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDLm15LWNvbnRyYWN0JyksXG4gICAgICAgIC9jb250cmFjdCBwcmluY2lwYWxzIGFyZSBub3Qgc3VwcG9ydGVkL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIGEgbWVtb0lkIHN1ZmZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDP21lbW9JZD0wJyksXG4gICAgICAgIC9tdXN0IG5vdCBpbmNsdWRlIGEgcXVlcnkgc3RyaW5nL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBVdGlscy5nZXRFbmNvZGVkUHJpbmNpcGFsKCdub3QtYS1zdGFja3MtYWRkcmVzcycpLCAvaW52YWxpZCBTdGFja3MgYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgneHB1YlRvU1RYUHVia2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBjb252ZXJ0IGZvciB2YWxpZCB4cHVicycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHUzJITWR2QU5ON284RVNXcXd2cjVVNHJ5NWZaZEQ5VkhoeW1XeWZvRFFGNHZ6ZktvdFhnR3RKVHJ3ckZSejdYYkdGb3Y0RnFkS0tvNm1SWU5Xdk1wN1AyM0RqdUpuUydcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwM2YwZjM1ODFhNDI1Njc5N2ZhODQ3OGNiNmIxZGE2NTg4ZjRjNGJlZGM4MGFiMjYwMWUzYTE1NzJjZjU3YjYxNTYnKTtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGRXpyNUNjcEZ6UEc0NXJtUGY3NURUdkRvYk41Z0ppbUNhdGJIdHpSNTNTYkh6RFoxSjU2YnlLU3NkYzh2U3VqR3VRcHlQamI3THN1YTJOZkFESmV3UHhOekwzTjZUaidcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwMjYyYjdlODZjMWUzNmU0NWQ0NTEyNjNiNTRhMWMzZDc0MGFiZWFiNjFkMjIxZDExNzVmYzNmZGFkNzUyODUzYWInKTtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHUDFhZGszNFZ6UlFKRU1YMjVyQ3hqRXlVOVlGRldOaFdOendQb3FnakxvS2ZucW90THdyejdrQmV2V2JSWm5xVFNRclFEdUp1WVVRYURRNUREUEV6RVhNd1BTOVBFZidcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwMzY1MjlhMGU0MWNmZDFhOWQyNjViNzRmOGQwMDAyYzkyYzVhZWMxMGQ0MjM5MDAwMjYwYTI1Y2ZkNTRlNDcyNmMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhc2VBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzV2l0aE1lbW8gPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NSc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzcyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBVdGlscy5nZXRCYXNlQWRkcmVzcyhhZGRyZXNzV2l0aE1lbW8pLnNob3VsZC5lcXVhbChiYXNlQWRkcmVzcyk7XG4gICAgICBVdGlscy5nZXRCYXNlQWRkcmVzcyhiYXNlQWRkcmVzcykuc2hvdWxkLmVxdWFsKGJhc2VBZGRyZXNzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzU2FtZUJhc2VBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaWYgYmFzZSBhZGRyZXNzIG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3MsIGJhc2VBZGRyZXNzKS5zaG91bGQudHJ1ZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzMiA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczIgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczIsIGJhc2VBZGRyZXNzMikuc2hvdWxkLnRydWUoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczMgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NSc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczMgPSAnU1QxU1JDQTkzQ0UxV0Q4VEVHMjhCU1dCRlI2OEoyNFpUQUIyRkFKMCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzMywgYmFzZUFkZHJlc3MzKS5zaG91bGQuZmFsc2UoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczQgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3M0ID0gJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczQsIGJhc2VBZGRyZXNzNCkuc2hvdWxkLmZhbHNlKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3M1ID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRGJztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzNSA9ICdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJztcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3M1LCBiYXNlQWRkcmVzczUpLnNob3VsZC5mYWxzZSgpLFxuICAgICAgICBuZXcgUmVnRXhwKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzczV9YClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=