@bitgo-beta/bitgo 14.2.1-beta.2207 → 14.2.1-beta.2209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/{a02589640e9e719bb4ff.module.wasm → 3b44c44f53e243925ddb.module.wasm} +0 -0
- package/dist/browser/BitGoJS.min.js +2 -2
- package/dist/package.json +94 -94
- package/dist/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createKeychains.js +75 -39
- package/dist/test/v2/unit/internal/tssUtils/ecdsaVrfMPCv2/createSafeChildKeychains.js +75 -25
- package/dist/test/v2/unit/internal/tssUtils/eddsa.js +39 -1
- package/dist/test/v2/unit/wallet.js +42 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +94 -94
- package/npm-shrinkwrap.json +0 -22262
|
@@ -8,27 +8,11 @@ const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
|
8
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
9
|
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
10
10
|
const src_1 = require("../../../../../../src");
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
to: m.to,
|
|
17
|
-
payload: Buffer.from(m.payload).toString('base64'),
|
|
18
|
-
})),
|
|
19
|
-
];
|
|
20
|
-
return Buffer.from(JSON.stringify(transfers)).toString('base64');
|
|
21
|
-
}
|
|
22
|
-
function deserializeVrfMessages(blob, forParty) {
|
|
23
|
-
const transfers = JSON.parse(Buffer.from(blob, 'base64').toString());
|
|
24
|
-
return {
|
|
25
|
-
broadcastMessages: transfers
|
|
26
|
-
.filter((t) => t.to === undefined)
|
|
27
|
-
.map((t) => ({ from: t.from, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
28
|
-
p2pMessages: transfers
|
|
29
|
-
.filter((t) => t.to === forParty)
|
|
30
|
-
.map((t) => ({ from: t.from, to: t.to, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
31
|
-
};
|
|
11
|
+
/** Verifies a client VRF message the way BitGo does: signed by the sender's GPG key. */
|
|
12
|
+
async function verifyClientVrfMessage(message, expectedFrom, gpgPublicKey) {
|
|
13
|
+
assert.equal(message.from, expectedFrom);
|
|
14
|
+
assert.ok(await sdk_lib_mpc_1.DklsComms.verifySignedData(message, gpgPublicKey), `VRF message from ${expectedFrom} is not signed`);
|
|
15
|
+
return new Uint8Array(Buffer.from(message.message, 'base64'));
|
|
32
16
|
}
|
|
33
17
|
describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
34
18
|
const coinName = 'hteth';
|
|
@@ -49,7 +33,10 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
49
33
|
let bitgoGpgPrvKey;
|
|
50
34
|
let userGpgPubKey;
|
|
51
35
|
let backupGpgPubKey;
|
|
36
|
+
// Per-test simulated BitGo misbehaviour, reset before each test.
|
|
37
|
+
let tamper = {};
|
|
52
38
|
beforeEach(async function () {
|
|
39
|
+
tamper = {};
|
|
53
40
|
nock.cleanAll();
|
|
54
41
|
await nockGetBitgoPublicKeyBasedOnFeatureFlags(coinName, enterpriseId, bitGoGgpKey);
|
|
55
42
|
nock(bgUrl).get('/api/v1/client/constants').times(16).reply(200, { ttl: 3600, constants });
|
|
@@ -120,7 +107,7 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
120
107
|
assert.ok(backupKeychain);
|
|
121
108
|
assert.ok(backupKeychain.encryptedPrv);
|
|
122
109
|
assert.ok(bitgoKeychain);
|
|
123
|
-
// The VRF DKG must have completed on
|
|
110
|
+
// The VRF DKG must have completed on BitGo's (simulated) side as well.
|
|
124
111
|
assert.ok(bitgoVrfShare, 'BitGo VRF keyshare was not produced');
|
|
125
112
|
assert.ok(userKeychain.encryptedPrv);
|
|
126
113
|
const decryptedUserPrv = await bitgo.decrypt({ input: userKeychain.encryptedPrv, password: params.passphrase });
|
|
@@ -158,6 +145,33 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
158
145
|
assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
|
|
159
146
|
assert.equal(userKeychain.commonKeychain, bitgoKeychain.commonKeychain);
|
|
160
147
|
});
|
|
148
|
+
const keychainParams = () => ({
|
|
149
|
+
passphrase: 'test',
|
|
150
|
+
enterprise: enterpriseId,
|
|
151
|
+
originalPasscodeEncryptionCode: '123456',
|
|
152
|
+
safeId,
|
|
153
|
+
});
|
|
154
|
+
async function runWithTamperedBitgo() {
|
|
155
|
+
const bitgoSession = new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, 2);
|
|
156
|
+
const bitgoVrfSession = new sdk_lib_mpc_1.DklsVrf.VrfDkg(3, 2, 2);
|
|
157
|
+
await nockKeyGenRound1(bitgoSession, bitgoVrfSession);
|
|
158
|
+
await nockKeyGenRound2(bitgoSession, bitgoVrfSession);
|
|
159
|
+
await nockKeyGenRound3(bitgoSession, bitgoVrfSession);
|
|
160
|
+
await nockAddKeyChain(coinName, 3);
|
|
161
|
+
return tssUtils.createKeychains(keychainParams());
|
|
162
|
+
}
|
|
163
|
+
it('should reject a BitGo VRF round 1 commitment whose signature does not verify', async function () {
|
|
164
|
+
tamper.round1Commitment = true;
|
|
165
|
+
await assert.rejects(runWithTamperedBitgo(), /Failed to authenticate BitGo VRF message 1/);
|
|
166
|
+
});
|
|
167
|
+
it('should reject a BitGo VRF opening to the user whose signature does not verify', async function () {
|
|
168
|
+
tamper.round2OpeningToUser = true;
|
|
169
|
+
await assert.rejects(runWithTamperedBitgo(), /Signed digest did not match/);
|
|
170
|
+
});
|
|
171
|
+
it('should reject a BitGo VRF opening to the backup whose signature does not verify', async function () {
|
|
172
|
+
tamper.round2OpeningToBackup = true;
|
|
173
|
+
await assert.rejects(runWithTamperedBitgo(), /Signed digest did not match/);
|
|
174
|
+
});
|
|
161
175
|
async function nockGetBitgoPublicKeyBasedOnFeatureFlags(coin, enterpriseId, bitgoGpgKeyPair) {
|
|
162
176
|
const bitgoGPGPublicKeyResponse = {
|
|
163
177
|
name: 'irrelevant',
|
|
@@ -203,20 +217,28 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
203
217
|
assert.ok(bitgoToBackupMsg2, 'bitgoToBackupMsg2 not found');
|
|
204
218
|
assert.ok(bitgoToUserMsg2.commitment, 'bitgoToUserMsg2.commitment not found');
|
|
205
219
|
storedBitgoCommitment2 = bitgoToUserMsg2?.commitment;
|
|
206
|
-
// VRF DKG:
|
|
220
|
+
// VRF DKG: verify the signed client commitments, then BitGo commits and consumes them.
|
|
207
221
|
const bitgoVrfMsg1Unsigned = await bitgoVrfSession.initDkg();
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
assert.equal(userVrfCommitments.broadcastMessages.length, 1);
|
|
211
|
-
assert.equal(userVrfCommitments.broadcastMessages[0].from, 0);
|
|
212
|
-
assert.equal(backupVrfCommitments.broadcastMessages.length, 1);
|
|
213
|
-
assert.equal(backupVrfCommitments.broadcastMessages[0].from, 1);
|
|
222
|
+
const userVrfCommitment = await verifyClientVrfMessage(userVrfMsg1, 0, userGpgPublicKey);
|
|
223
|
+
const backupVrfCommitment = await verifyClientVrfMessage(backupVrfMsg1, 1, backupGpgPublicKey);
|
|
214
224
|
storedBitgoVrfOpenings = await bitgoVrfSession.handleIncomingMessages({
|
|
215
|
-
broadcastMessages: [
|
|
225
|
+
broadcastMessages: [
|
|
226
|
+
{ from: 0, payload: userVrfCommitment },
|
|
227
|
+
{ from: 1, payload: backupVrfCommitment },
|
|
228
|
+
],
|
|
216
229
|
p2pMessages: [],
|
|
217
230
|
});
|
|
218
231
|
// BitGo's openings are addressed to each party, itself included.
|
|
219
232
|
assert.equal(storedBitgoVrfOpenings.p2pMessages.length, 3);
|
|
233
|
+
assert.equal(bitgoVrfMsg1Unsigned.broadcastMessages.length, 1);
|
|
234
|
+
const bitgoVrfMsg1Signed = {
|
|
235
|
+
from: 2,
|
|
236
|
+
...(await sdk_lib_mpc_1.DklsComms.detachSignData(Buffer.from(bitgoVrfMsg1Unsigned.broadcastMessages[0].payload), bitgoGpgPrvKey.gpgKey)),
|
|
237
|
+
};
|
|
238
|
+
if (tamper.round1Commitment) {
|
|
239
|
+
// Valid signature, different payload: the signature no longer covers the message.
|
|
240
|
+
bitgoVrfMsg1Signed.message = Buffer.from('forged-commitment').toString('base64');
|
|
241
|
+
}
|
|
220
242
|
return {
|
|
221
243
|
sessionId: 'testid',
|
|
222
244
|
bitgoMsg1: { from: 2, ...bitgoMsg1.payload },
|
|
@@ -233,7 +255,7 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
233
255
|
signature: bitgoToUserMsg2.payload.signature,
|
|
234
256
|
},
|
|
235
257
|
walletGpgPubKeySigs: 'something',
|
|
236
|
-
bitgoVrfMsg1:
|
|
258
|
+
bitgoVrfMsg1: bitgoVrfMsg1Signed,
|
|
237
259
|
};
|
|
238
260
|
});
|
|
239
261
|
}
|
|
@@ -268,11 +290,11 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
268
290
|
const bitgoToBackupMsg3 = round3SignedMessages.p2pMessages.find((m) => m.to === 1);
|
|
269
291
|
assert.ok(bitgoToUserMsg3, 'bitgoToUserMsg3 not found');
|
|
270
292
|
assert.ok(bitgoToBackupMsg3, 'bitgoToBackupMsg3 not found');
|
|
271
|
-
// VRF DKG:
|
|
272
|
-
const
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
293
|
+
// VRF DKG: the SDK sends only the opening addressed to BitGo, signed by the sending party.
|
|
294
|
+
const userOpening = await verifyClientVrfMessage(userVrfMsg2, 0, userGpgPubKey.gpgKey);
|
|
295
|
+
const backupOpening = await verifyClientVrfMessage(backupVrfMsg2, 1, backupGpgPubKey.gpgKey);
|
|
296
|
+
const userOpenings = [{ from: 0, to: 2, payload: userOpening }];
|
|
297
|
+
const backupOpenings = [{ from: 1, to: 2, payload: backupOpening }];
|
|
276
298
|
assert.ok(storedBitgoVrfOpenings, 'BitGo VRF openings from round 1 not found');
|
|
277
299
|
await bitgoVrfSession.handleIncomingMessages({
|
|
278
300
|
broadcastMessages: [],
|
|
@@ -300,11 +322,25 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
300
322
|
encryptedMessage: bitgoToBackupMsg3.payload.encryptedMessage,
|
|
301
323
|
signature: bitgoToBackupMsg3.payload.signature,
|
|
302
324
|
},
|
|
303
|
-
// BitGo's
|
|
304
|
-
|
|
325
|
+
// BitGo's openings, each PGP-encrypted to its recipient and signed over the plaintext.
|
|
326
|
+
bitgoVrfMsgToUser: await encryptVrfOpening(storedBitgoVrfOpenings, 0, userGpgPubKey.gpgKey, tamper.round2OpeningToUser),
|
|
327
|
+
bitgoVrfMsgToBackup: await encryptVrfOpening(storedBitgoVrfOpenings, 1, backupGpgPubKey.gpgKey, tamper.round2OpeningToBackup),
|
|
305
328
|
};
|
|
306
329
|
});
|
|
307
330
|
}
|
|
331
|
+
/** Encrypts BitGo's VRF opening for `to` with that party's GPG key and signs the plaintext. */
|
|
332
|
+
async function encryptVrfOpening(openings, to, partyGpgPublicKey, tamperPlaintext = false) {
|
|
333
|
+
const opening = openings.p2pMessages.find((m) => m.to === to);
|
|
334
|
+
assert.ok(opening, `BitGo VRF opening for party ${to} not found`);
|
|
335
|
+
const signedFor = Buffer.from(opening.payload);
|
|
336
|
+
const { encryptedMessage, signature } = await sdk_lib_mpc_1.DklsComms.encryptAndDetachSignData(signedFor, partyGpgPublicKey, bitgoGpgPrvKey.gpgKey);
|
|
337
|
+
if (!tamperPlaintext) {
|
|
338
|
+
return { from: 2, to, encryptedMessage, signature };
|
|
339
|
+
}
|
|
340
|
+
// Encrypt a different plaintext but keep the signature over the original one.
|
|
341
|
+
const forged = await sdk_lib_mpc_1.DklsComms.encryptAndDetachSignData(Buffer.from('forged-opening'), partyGpgPublicKey, bitgoGpgPrvKey.gpgKey);
|
|
342
|
+
return { from: 2, to, encryptedMessage: forged.encryptedMessage, signature };
|
|
343
|
+
}
|
|
308
344
|
async function nockKeyGenRound3(bitgoSession, bitgoVrfSession, times = 1) {
|
|
309
345
|
return nock(bgUrl)
|
|
310
346
|
.post(`/api/v2/mpc/generatekey`, (body) => body.round === 'MPCv2-R3')
|
|
@@ -375,4 +411,4 @@ describe('TSS Ecdsa VRF MPCv2 Utils:', async function () {
|
|
|
375
411
|
});
|
|
376
412
|
}
|
|
377
413
|
});
|
|
378
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLG1EQUE2RDtBQUM3RCxtREFBMEc7QUFDMUcseURBQWlGO0FBVWpGLCtDQUFpRTtBQVlqRSxTQUFTLG9CQUFvQixDQUFDLFFBQXdDO0lBQ3BFLE1BQU0sU0FBUyxHQUF5QjtRQUN0QyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoSCxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ25ELENBQUMsQ0FBQztLQUNKLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxJ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YztnQkFDMUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO2FBQ3ZDLENBQUM7WUFDRixZQUFZO1lBQ1osSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxRQUFRLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0YsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcblxuaW1wb3J0IHsgVGVzdGFibGVCRywgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBCYXNlQ29pbiwgY29tbW9uLCBFQ0RTQVV0aWxzLCBLZXljaGFpbiwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRGtsc0NvbW1zLCBEa2xzRGtnLCBEa2xzVHlwZXMsIERrbHNWcmYgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQge1xuICBNUEN2MktleUdlblJvdW5kMVJlcXVlc3QsXG4gIE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdCxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXF1ZXN0LFxuICBNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHsgQml0R28sIEJpdGdvR1BHUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcblxuLyoqXG4gKiBWUkYgREtHIG1lc3NhZ2UgYmxvYnMgcmlkaW5nIHRoZSBNUEN2Mi1SMS9SMiBrZXlnZW4gcGF5bG9hZHMuIE1pcnJvcnMgdGhlIHdpcmVcbiAqIGZvcm1hdCBwcm9kdWNlZCBieSBzZGstY29yZSdzIGVjZHNhVnJmTVBDdjIudHMuXG4gKi9cbmludGVyZmFjZSBWcmZNZXNzYWdlVHJhbnNmZXIge1xuICBmcm9tOiBudW1iZXI7XG4gIHRvPzogbnVtYmVyO1xuICBwYXlsb2FkOiBzdHJpbmc7IC8vIGJhc2U2NFxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVWcmZNZXNzYWdlcyhtZXNzYWdlczogRGtsc1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzKTogc3RyaW5nIHtcbiAgY29uc3QgdHJhbnNmZXJzOiBWcmZNZXNzYWdlVHJhbnNmZXJbXSA9IFtcbiAgICAuLi5tZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5tYXAoKG0pID0+ICh7IGZyb206IG0uZnJvbSwgcGF5bG9hZDogQnVmZmVyLmZyb20obS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JykgfSkpLFxuICAgIC4uLm1lc3NhZ2VzLnAycE1lc3NhZ2VzLm1hcCgobSkgPT4gKHtcbiAgICAgIGZyb206IG0uZnJvbSxcbiAgICAgIHRvOiBtLnRvLFxuICAgICAgcGF5bG9hZDogQnVmZmVyLmZyb20obS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfSkpLFxuICBdO1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodHJhbnNmZXJzKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJsb2I6IHN0cmluZywgZm9yUGFydHk6IG51bWJlcik6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gIGNvbnN0IHRyYW5zZmVyczogVnJmTWVzc2FnZVRyYW5zZmVyW10gPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGJsb2IsICdiYXNlNjQnKS50b1N0cmluZygpKTtcbiAgcmV0dXJuIHtcbiAgICBicm9hZGNhc3RNZXNzYWdlczogdHJhbnNmZXJzXG4gICAgICAuZmlsdGVyKCh0KSA9PiB0LnRvID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKCh0KSA9PiAoeyBmcm9tOiB0LmZyb20sIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHQucGF5bG9hZCwgJ2Jhc2U2NCcpKSB9KSksXG4gICAgcDJwTWVzc2FnZXM6IHRyYW5zZmVyc1xuICAgICAgLmZpbHRlcigodCk6IHQgaXMgVnJmTWVzc2FnZVRyYW5zZmVyICYgeyB0bzogbnVtYmVyIH0gPT4gdC50byA9PT0gZm9yUGFydHkpXG4gICAgICAubWFwKCh0KSA9PiAoeyBmcm9tOiB0LmZyb20sIHRvOiB0LnRvLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0LnBheWxvYWQsICdiYXNlNjQnKSkgfSkpLFxuICB9O1xufVxuXG50eXBlIFZyZktleUdlblJlcXVlc3RGaWVsZHMgPSB7XG4gIHVzZXJWcmZNc2cxPzogc3RyaW5nO1xuICBiYWNrdXBWcmZNc2cxPzogc3RyaW5nO1xuICB1c2VyVnJmTXNnMj86IHN0cmluZztcbiAgYmFja3VwVnJmTXNnMj86IHN0cmluZztcbn07XG5cbnR5cGUgVnJmS2V5c2hhcmVEZWNvZGVkID0ge1xuICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgdG90YWxfcGFydGllczogbnVtYmVyO1xuICBwYXJ0eV9pZDogbnVtYmVyO1xuICBkX2k6IFVpbnQ4QXJyYXk7XG4gIHB1YmxpY19rZXk6IFVpbnQ4QXJyYXk7XG4gIHBhcnR5X3B1YmxpY19zaGFyZXM6IFVpbnQ4QXJyYXlbXTtcbiAga2V5X2lkOiBVaW50OEFycmF5O1xuICByb290X2NoYWluX2NvZGU6IFVpbnQ4QXJyYXk7XG4gIGZpbmFsX3Nlc3Npb25faWQ6IFVpbnQ4QXJyYXk7XG59O1xudHlwZSBWcmZLZXlHZW5SZXNwb25zZUZpZWxkcyA9IHtcbiAgYml0Z29WcmZNc2cxPzogc3RyaW5nO1xuICBiaXRnb1ZyZk1zZzI/OiBzdHJpbmc7XG59O1xuXG5kZXNjcmliZSgnVFNTIEVjZHNhIFZSRiBNUEN2MiBVdGlsczonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gJ2h0ZXRoJztcbiAgY29uc3QgZW50ZXJwcmlzZUlkID0gJzY0NDkxNTNhNmY2YmMyMDAwNmQ2Njc3MWNkYmUxNWQzJztcbiAgY29uc3Qgc2FmZUlkID0gJzZmYTg1MzdlM2VmNWE4NzhmZDNhZTg5OWYzYWI3ZTVhJztcbiAgbGV0IHN0b3JlZFVzZXJDb21taXRtZW50Mjogc3RyaW5nO1xuICBsZXQgc3RvcmVkQmFja3VwQ29tbWl0bWVudDI6IHN0cmluZztcbiAgbGV0IHN0b3JlZEJpdGdvQ29tbWl0bWVudDI6IHN0cmluZztcbiAgbGV0IHN0b3JlZEJpdGdvVnJmT3BlbmluZ3M6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyB8IHVuZGVmaW5lZDtcblxuICBsZXQgYmdVcmw6IHN0cmluZztcbiAgbGV0IHRzc1V0aWxzOiBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlscztcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgYml0Z286IFRlc3RhYmxlQkcgJiBCaXRHbztcbiAgbGV0IGJhc2VDb2luOiBCYXNlQ29pbjtcbiAgbGV0IGJpdGdvVnJmU2hhcmU6IFZyZktleXNoYXJlRGVjb2RlZCB8IHVuZGVmaW5lZDtcbiAgbGV0IGJpdEdvR2dwS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gJiB7XG4gICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiBzdHJpbmc7XG4gIH07XG4gIGxldCBjb25zdGFudHM6IHsgbXBjOiB7IGJpdGdvUHVibGljS2V5OiBzdHJpbmc7IGJpdGdvTVBDdjJQdWJsaWNLZXk6IHN0cmluZyB9IH07XG4gIGxldCBiaXRnb0dwZ1BydktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCB1c2VyR3BnUHViS2V5OiB7IHBhcnR5SWQ6IG51bWJlcjsgZ3BnS2V5OiBzdHJpbmcgfTtcbiAgbGV0IGJhY2t1cEdwZ1B1YktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG5cbiAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIGF3YWl0IG5vY2tHZXRCaXRnb1B1YmxpY0tleUJhc2VkT25GZWF0dXJlRmxhZ3MoY29pbk5hbWUsIGVudGVycHJpc2VJZCwgYml0R29HZ3BLZXkpO1xuICAgIG5vY2soYmdVcmwpLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJykudGltZXMoMTYpLnJlcGx5KDIwMCwgeyB0dGw6IDM2MDAsIGNvbnN0YW50cyB9KTtcbiAgfSk7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBBbGxvdyBzZWNwMjU2azEgR1BHIGtleXMgdXNlZCBieSB0aGVzZSBmaXh0dXJlcyAodGhlIGZ1bGwgc3VpdGUgZW5hYmxlcyB0aGlzXG4gICAgLy8gZ2xvYmFsbHkgdmlhIHNpYmxpbmcgdGVzdCBmaWxlczsgc2V0IGl0IGhlcmUgc28gdGhpcyBmaWxlIGFsc28gcnVucyBpbiBpc29sYXRpb24pLlxuICAgIG9wZW5wZ3AuY29uZmlnLnJlamVjdEN1cnZlcyA9IG5ldyBTZXQoKTtcbiAgICBiaXRHb0dncEtleSA9IGF3YWl0IG9wZW5wZ3AuZ2VuZXJhdGVLZXkoe1xuICAgICAgdXNlcklEczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2JpdGdvJyxcbiAgICAgICAgICBlbWFpbDogJ2JpdGdvQHRlc3QuY29tJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjdXJ2ZTogJ3NlY3AyNTZrMScsXG4gICAgfSk7XG4gICAgY29uc3RhbnRzID0ge1xuICAgICAgbXBjOiB7XG4gICAgICAgIGJpdGdvUHVibGljS2V5OiBiaXRHb0dncEtleS5wdWJsaWNLZXksXG4gICAgICAgIGJpdGdvTVBDdjJQdWJsaWNLZXk6IGJpdEdvR2dwS2V5LnB1YmxpY0tleSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGJpdGdvR3BnUHJ2S2V5ID0ge1xuICAgICAgcGFydHlJZDogMixcbiAgICAgIGdwZ0tleTogYml0R29HZ3BLZXkucHJpdmF0ZUtleSxcbiAgICB9O1xuXG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG5cbiAgICBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWUpO1xuXG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBjb2luOiBjb2luTmFtZSxcbiAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgIH07XG4gICAgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICAgIHRzc1V0aWxzID0gbmV3IEVDRFNBVXRpbHMuRWNkc2FWcmZNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0KTtcbiAgfSk7XG5cbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBUU1MgTVBDdjIga2V5cyB3aXRoIFZSRiBrZXlzaGFyZXMgZm9yIHNhZmUgcm9vdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYml0Z29TZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKDMsIDIsIDIpO1xuICAgIGNvbnN0IGJpdGdvVnJmU2Vzc2lvbiA9IG5ldyBEa2xzVnJmLlZyZkRrZygzLCAyLCAyKTtcblxuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrS2V5R2VuUm91bmQxKGJpdGdvU2Vzc2lvbiwgYml0Z29WcmZTZXNzaW9uKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0tleUdlblJvdW5kMihiaXRnb1Nlc3Npb24sIGJpdGdvVnJmU2Vzc2lvbik7XG4gICAgY29uc3Qgcm91bmQzTm9jayA9IGF3YWl0IG5vY2tLZXlHZW5Sb3VuZDMoYml0Z29TZXNzaW9uLCBiaXRnb1ZyZlNlc3Npb24pO1xuICAgIGNvbnN0IGFkZEtleU5vY2sgPSBhd2FpdCBub2NrQWRkS2V5Q2hhaW4oY29pbk5hbWUsIDMpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogJzEyMzQ1NicsXG4gICAgICBzYWZlSWQsXG4gICAgfTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZUtleWNoYWlucyhwYXJhbXMpO1xuICAgIGFzc2VydC5vayhyb3VuZDFOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQyTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKHJvdW5kM05vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhhZGRLZXlOb2NrLmlzRG9uZSgpKTtcblxuICAgIGFzc2VydC5vayh1c2VyS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uc291cmNlLCAndXNlcicpO1xuICAgIGFzc2VydC5vayh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5vayhFQ0RTQVV0aWxzLkVjZHNhTVBDdjJVdGlscy52YWxpZGF0ZUNvbW1vbktleWNoYWluUHVibGljS2V5KHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbikpO1xuICAgIGFzc2VydC5vayh1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KTtcbiAgICBhc3NlcnQub2soYmFja3VwS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5vayhiYWNrdXBLZXljaGFpbi5lbmNyeXB0ZWRQcnYpO1xuICAgIGFzc2VydC5vayhiaXRnb0tleWNoYWluKTtcblxuICAgIC8vIFRoZSBWUkYgREtHIG11c3QgaGF2ZSBjb21wbGV0ZWQgb24gdGhlIChzaW11bGF0ZWQpIEhTTSBzaWRlIGFzIHdlbGwuXG4gICAgYXNzZXJ0Lm9rKGJpdGdvVnJmU2hhcmUsICdCaXRHbyBWUkYga2V5c2hhcmUgd2FzIG5vdCBwcm9kdWNlZCcpO1xuXG4gICAgYXNzZXJ0Lm9rKHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpO1xuICAgIGNvbnN0IGRlY3J5cHRlZFVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCB1c2VyRW52ZWxvcGUgPSBkZWNvZGUoQnVmZmVyLmZyb20oZGVjcnlwdGVkVXNlclBydiwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckVudmVsb3BlLnZlcnNpb24sIDEpO1xuICAgIGFzc2VydC5vayh1c2VyRW52ZWxvcGUucHJ2S2V5U2hhcmUpO1xuICAgIGFzc2VydC5vayh1c2VyRW52ZWxvcGUudnJmKTtcbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbSh1c2VyRW52ZWxvcGUucHJ2S2V5U2hhcmUpO1xuICAgIGFzc2VydC5lcXVhbChEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4odXNlcktleVNoYXJlKSwgdXNlcktleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBjb25zdCB1c2VyVnJmU2hhcmUgPSBkZWNvZGUodXNlckVudmVsb3BlLnZyZik7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJWcmZTaGFyZS5wYXJ0eV9pZCwgMCk7XG4gICAgLy8gQWxsIHRocmVlIHBhcnRpZXMnIFZSRiBES0dzIGFncmVlIG9uIHRoZSBWUkYgcHVibGljIGtleS5cbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyVnJmU2hhcmUucHVibGljX2tleSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20oYml0Z29WcmZTaGFyZS5wdWJsaWNfa2V5KS50b1N0cmluZygnaGV4JylcbiAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKGJhY2t1cEtleWNoYWluLmVuY3J5cHRlZFBydik7XG4gICAgY29uc3QgZGVjcnlwdGVkQmFja3VwUHJ2ID0gYXdhaXQgYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogYmFja3VwS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEVudmVsb3BlID0gZGVjb2RlKEJ1ZmZlci5mcm9tKGRlY3J5cHRlZEJhY2t1cFBydiwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwRW52ZWxvcGUudmVyc2lvbiwgMSk7XG4gICAgY29uc3QgYmFja3VwVnJmU2hhcmUgPSBkZWNvZGUoYmFja3VwRW52ZWxvcGUudnJmKTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwVnJmU2hhcmUucGFydHlfaWQsIDEpO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIEJ1ZmZlci5mcm9tKGJhY2t1cFZyZlNoYXJlLnB1YmxpY19rZXkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKGJpdGdvVnJmU2hhcmUucHVibGljX2tleSkudG9TdHJpbmcoJ2hleCcpXG4gICAgKTtcbiAgICBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsKHVzZXJWcmZTaGFyZS5kX2ksIGJhY2t1cFZyZlNoYXJlLmRfaSk7XG5cbiAgICAvLyByZWR1Y2VkRW5jcnlwdGVkUHJ2IHRha2VzIHRoZSBzYW1lIGVudmVsb3BlIGFuZCBjYXJyaWVzIFZSRiBtYXRlcmlhbC5cbiAgICBjb25zdCByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gKHVzZXJLZXljaGFpbiBhcyBLZXljaGFpbiAmIHsgcmVkdWNlZEVuY3J5cHRlZFBydj86IHN0cmluZyB9KS5yZWR1Y2VkRW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhyZWR1Y2VkRW5jcnlwdGVkUHJ2KTtcbiAgICBjb25zdCByZWR1Y2VkRGVjcnlwdGVkID0gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiByZWR1Y2VkRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UgfSk7XG4gICAgY29uc3QgcmVkdWNlZEVudmVsb3BlID0gZGVjb2RlKEJ1ZmZlci5mcm9tKHJlZHVjZWREZWNyeXB0ZWQsICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlZHVjZWRFbnZlbG9wZS52ZXJzaW9uLCAxKTtcbiAgICBjb25zdCByZWR1Y2VkS2V5U2hhcmUgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShCdWZmZXIuZnJvbShyZWR1Y2VkRW52ZWxvcGUucHJ2S2V5U2hhcmUpKTtcbiAgICBhc3NlcnQub2socmVkdWNlZEtleVNoYXJlLnBydi5sZW5ndGggPiAwKTtcbiAgICBhc3NlcnQub2soQnVmZmVyLmZyb20ocmVkdWNlZEVudmVsb3BlLnZyZikubGVuZ3RoID4gMCk7XG5cbiAgICAvLyBjb21tb24ga2V5Y2hhaW5zIGFncmVlIGFjcm9zcyBwYXJ0aWVzXG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBub2NrR2V0Qml0Z29QdWJsaWNLZXlCYXNlZE9uRmVhdHVyZUZsYWdzKFxuICAgIGNvaW46IHN0cmluZyxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICBiaXRnb0dwZ0tleVBhaXI6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICApOiBQcm9taXNlPEJpdGdvR1BHUHVibGljS2V5PiB7XG4gICAgY29uc3QgYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTogQml0Z29HUEdQdWJsaWNLZXkgPSB7XG4gICAgICBuYW1lOiAnaXJyZWxldmFudCcsXG4gICAgICBwdWJsaWNLZXk6IGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICBtcGN2MlB1YmxpY0tleTogYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2VJZCxcbiAgICB9O1xuICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW59L3Rzcy9wdWJrZXlgKS5xdWVyeSh7IGVudGVycHJpc2VJZCB9KS5yZXBseSgyMDAsIGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2U7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrS2V5R2VuUm91bmQxKGJpdGdvU2Vzc2lvbjogRGtsc0RrZy5Ea2csIGJpdGdvVnJmU2Vzc2lvbjogRGtsc1ZyZi5WcmZEa2csIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvbXBjL2dlbmVyYXRla2V5YCwgKGJvZHkpID0+IGJvZHkucm91bmQgPT09ICdNUEN2Mi1SMScpXG4gICAgICAudGltZXModGltZXMpXG4gICAgICAucmVwbHkoXG4gICAgICAgIDIwMCxcbiAgICAgICAgYXN5bmMgKFxuICAgICAgICAgIHVyaSxcbiAgICAgICAgICB7IHBheWxvYWQgfTogeyBwYXlsb2FkOiBNUEN2MktleUdlblJvdW5kMVJlcXVlc3QgJiBWcmZLZXlHZW5SZXF1ZXN0RmllbGRzIH1cbiAgICAgICAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlICYgVnJmS2V5R2VuUmVzcG9uc2VGaWVsZHM+ID0+IHtcbiAgICAgICAgICBjb25zdCB7IHVzZXJHcGdQdWJsaWNLZXksIGJhY2t1cEdwZ1B1YmxpY0tleSwgdXNlck1zZzEsIGJhY2t1cE1zZzEsIHVzZXJWcmZNc2cxLCBiYWNrdXBWcmZNc2cxIH0gPSBwYXlsb2FkO1xuICAgICAgICAgIGFzc2VydC5vayh1c2VyVnJmTXNnMSwgJ3VzZXJWcmZNc2cxIG11c3QgYmUgcHJlc2VudCBvbiBhIHNhZmUga2V5Z2VuIHJvdW5kIDEgcGF5bG9hZCcpO1xuICAgICAgICAgIGFzc2VydC5vayhiYWNrdXBWcmZNc2cxLCAnYmFja3VwVnJmTXNnMSBtdXN0IGJlIHByZXNlbnQgb24gYSBzYWZlIGtleWdlbiByb3VuZCAxIHBheWxvYWQnKTtcbiAgICAgICAgICB1c2VyR3BnUHViS2V5ID0ge1xuICAgICAgICAgICAgcGFydHlJZDogMCxcbiAgICAgICAgICAgIGdwZ0tleTogdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJhY2t1cEdwZ1B1YktleSA9IHtcbiAgICAgICAgICAgIHBhcnR5SWQ6IDEsXG4gICAgICAgICAgICBncGdLZXk6IGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgYml0Z29Ccm9hZGNhc3RNc2cxVW5zaWduZWQgPSBhd2FpdCBiaXRnb1Nlc3Npb24uaW5pdERrZygpO1xuICAgICAgICAgIGNvbnN0IGJpdGdvTXNnczFTaWduZWQgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW0RrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvQnJvYWRjYXN0TXNnMVVuc2lnbmVkKV0sIHAycE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBiaXRnb01zZzEgPSBiaXRnb01zZ3MxU2lnbmVkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gMik7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvTXNnMSwgJ2JpdGdvTXNnMSBub3QgZm91bmQnKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kMUluY29taW5nTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHsgZnJvbTogMCwgcGF5bG9hZDogdXNlck1zZzEgfSxcbiAgICAgICAgICAgICAgICB7IGZyb206IDEsIHBheWxvYWQ6IGJhY2t1cE1zZzEgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbdXNlckdwZ1B1YktleSwgYmFja3VwR3BnUHViS2V5XSxcbiAgICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQyTWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICAgICAgICBiaXRnb1Nlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhyb3VuZDFJbmNvbWluZ01zZ3MpKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZDJTaWduZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAgICByb3VuZDJNZXNzYWdlcyxcbiAgICAgICAgICAgIFt1c2VyR3BnUHViS2V5LCBiYWNrdXBHcGdQdWJLZXldLFxuICAgICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBiaXRnb1RvVXNlck1zZzIgPSByb3VuZDJTaWduZWRNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKChtKSA9PiBtLnRvID09PSAwKTtcbiAgICAgICAgICBjb25zdCBiaXRnb1RvQmFja3VwTXNnMiA9IHJvdW5kMlNpZ25lZE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0udG8gPT09IDEpO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb1RvVXNlck1zZzIsICdiaXRnb1RvVXNlck1zZzIgbm90IGZvdW5kJyk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvVG9CYWNrdXBNc2cyLCAnYml0Z29Ub0JhY2t1cE1zZzIgbm90IGZvdW5kJyk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvVG9Vc2VyTXNnMi5jb21taXRtZW50LCAnYml0Z29Ub1VzZXJNc2cyLmNvbW1pdG1lbnQgbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICBzdG9yZWRCaXRnb0NvbW1pdG1lbnQyID0gYml0Z29Ub1VzZXJNc2cyPy5jb21taXRtZW50O1xuXG4gICAgICAgICAgLy8gVlJGIERLRzogQml0R28gY29tbWl0cywgdGhlbiBjb25zdW1lcyB1c2VyIGFuZCBiYWNrdXAgY29tbWl0bWVudHMuXG4gICAgICAgICAgY29uc3QgYml0Z29WcmZNc2cxVW5zaWduZWQgPSBhd2FpdCBiaXRnb1ZyZlNlc3Npb24uaW5pdERrZygpO1xuICAgICAgICAgIGNvbnN0IHVzZXJWcmZDb21taXRtZW50cyA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXModXNlclZyZk1zZzEsIDIpO1xuICAgICAgICAgIGNvbnN0IGJhY2t1cFZyZkNvbW1pdG1lbnRzID0gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWNrdXBWcmZNc2cxLCAyKTtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwodXNlclZyZkNvbW1pdG1lbnRzLmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCwgMSk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKHVzZXJWcmZDb21taXRtZW50cy5icm9hZGNhc3RNZXNzYWdlc1swXS5mcm9tLCAwKTtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoYmFja3VwVnJmQ29tbWl0bWVudHMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoLCAxKTtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoYmFja3VwVnJmQ29tbWl0bWVudHMuYnJvYWRjYXN0TWVzc2FnZXNbMF0uZnJvbSwgMSk7XG4gICAgICAgICAgc3RvcmVkQml0Z29WcmZPcGVuaW5ncyA9IGF3YWl0IGJpdGdvVnJmU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbLi4udXNlclZyZkNvbW1pdG1lbnRzLmJyb2FkY2FzdE1lc3NhZ2VzLCAuLi5iYWNrdXBWcmZDb21taXRtZW50cy5icm9hZGNhc3RNZXNzYWdlc10sXG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gQml0R28ncyBvcGVuaW5ncyBhcmUgYWRkcmVzc2VkIHRvIGVhY2ggcGFydHksIGl0c2VsZiBpbmNsdWRlZC5cbiAgICAgICAgICBhc3NlcnQuZXF1YWwoc3RvcmVkQml0Z29WcmZPcGVuaW5ncy5wMnBNZXNzYWdlcy5sZW5ndGgsIDMpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogJ3Rlc3RpZCcgYXMgTm9uRW1wdHlTdHJpbmcsXG4gICAgICAgICAgICBiaXRnb01zZzE6IHsgZnJvbTogMiwgLi4uYml0Z29Nc2cxLnBheWxvYWQgfSxcbiAgICAgICAgICAgIGJpdGdvVG9CYWNrdXBNc2cyOiB7XG4gICAgICAgICAgICAgIGZyb206IDIsXG4gICAgICAgICAgICAgIHRvOiAxLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiaXRnb1RvQmFja3VwTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHNpZ25hdHVyZTogYml0Z29Ub0JhY2t1cE1zZzIucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYml0Z29Ub1VzZXJNc2cyOiB7XG4gICAgICAgICAgICAgIGZyb206IDIsXG4gICAgICAgICAgICAgIHRvOiAwLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiaXRnb1RvVXNlck1zZzIucGF5bG9hZC5lbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICBzaWduYXR1cmU6IGJpdGdvVG9Vc2VyTXNnMi5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YWxsZXRHcGdQdWJLZXlTaWdzOiAnc29tZXRoaW5nJyBhcyBOb25FbXB0eVN0cmluZyxcbiAgICAgICAgICAgIGJpdGdvVnJmTXNnMTogc2VyaWFsaXplVnJmTWVzc2FnZXMoYml0Z29WcmZNc2cxVW5zaWduZWQpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrS2V5R2VuUm91bmQyKGJpdGdvU2Vzc2lvbjogRGtsc0RrZy5Ea2csIGJpdGdvVnJmU2Vzc2lvbjogRGtsc1ZyZi5WcmZEa2csIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvbXBjL2dlbmVyYXRla2V5YCwgKGJvZHkpID0+IGJvZHkucm91bmQgPT09ICdNUEN2Mi1SMicpXG4gICAgICAudGltZXModGltZXMpXG4gICAgICAucmVwbHkoXG4gICAgICAgIDIwMCxcbiAgICAgICAgYXN5bmMgKFxuICAgICAgICAgIHVyaSxcbiAgICAgICAgICB7IHBheWxvYWQgfTogeyBwYXlsb2FkOiBNUEN2MktleUdlblJvdW5kMlJlcXVlc3QgJiBWcmZLZXlHZW5SZXF1ZXN0RmllbGRzIH1cbiAgICAgICAgKTogUHJvbWlzZTxNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlICYgVnJmS2V5R2VuUmVzcG9uc2VGaWVsZHM+ID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlc3Npb25JZCwgdXNlck1zZzIsIGJhY2t1cE1zZzIsIHVzZXJDb21taXRtZW50MiwgYmFja3VwQ29tbWl0bWVudDIsIHVzZXJWcmZNc2cyLCBiYWNrdXBWcmZNc2cyIH0gPVxuICAgICAgICAgICAgcGF5bG9hZDtcbiAgICAgICAgICBhc3NlcnQub2sodXNlclZyZk1zZzIsICd1c2VyVnJmTXNnMiBtdXN0IGJlIHByZXNlbnQgb24gYSBzYWZlIGtleWdlbiByb3VuZCAyIHBheWxvYWQnKTtcbiAgICAgICAgICBhc3NlcnQub2soYmFja3VwVnJmTXNnMiwgJ2JhY2t1cFZyZk1zZzIgbXVzdCBiZSBwcmVzZW50IG9uIGEgc2FmZSBrZXlnZW4gcm91bmQgMiBwYXlsb2FkJyk7XG4gICAgICAgICAgc3RvcmVkVXNlckNvbW1pdG1lbnQyID0gdXNlckNvbW1pdG1lbnQyO1xuICAgICAgICAgIHN0b3JlZEJhY2t1cENvbW1pdG1lbnQyID0gYmFja3VwQ29tbWl0bWVudDI7XG4gICAgICAgICAgY29uc3Qgcm91bmQySW5jb21pbmdNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZyb206IHVzZXJNc2cyLmZyb20sXG4gICAgICAgICAgICAgICAgICB0bzogdXNlck1zZzIudG8sXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHNpZ25hdHVyZTogdXNlck1zZzIuc2lnbmF0dXJlLCBlbmNyeXB0ZWRNZXNzYWdlOiB1c2VyTXNnMi5lbmNyeXB0ZWRNZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBmcm9tOiBiYWNrdXBNc2cyLmZyb20sXG4gICAgICAgICAgICAgICAgICB0bzogYmFja3VwTXNnMi50byxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2lnbmF0dXJlOiBiYWNrdXBNc2cyLnNpZ25hdHVyZSwgZW5jcnlwdGVkTWVzc2FnZTogYmFja3VwTXNnMi5lbmNyeXB0ZWRNZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFt1c2VyR3BnUHViS2V5LCBiYWNrdXBHcGdQdWJLZXldLFxuICAgICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZDNNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgICAgICAgIGJpdGdvU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHJvdW5kMkluY29taW5nTXNncykpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kM1NpZ25lZE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgICAgICAgIHJvdW5kM01lc3NhZ2VzLFxuICAgICAgICAgICAgW3VzZXJHcGdQdWJLZXksIGJhY2t1cEdwZ1B1YktleV0sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJpdGdvVG9Vc2VyTXNnMyA9IHJvdW5kM1NpZ25lZE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0udG8gPT09IDApO1xuICAgICAgICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBNc2czID0gcm91bmQzU2lnbmVkTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZCgobSkgPT4gbS50byA9PT0gMSk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvVG9Vc2VyTXNnMywgJ2JpdGdvVG9Vc2VyTXNnMyBub3QgZm91bmQnKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Ub0JhY2t1cE1zZzMsICdiaXRnb1RvQmFja3VwTXNnMyBub3QgZm91bmQnKTtcblxuICAgICAgICAgIC8vIFZSRiBES0c6IEJpdEdvIGNvbnN1bWVzIHRoZSBvcGVuaW5ncyBhZGRyZXNzZWQgdG8gaXQgKGl0cyBvd24gaW5jbHVkZWQpIGFuZCBmaW5hbGl6ZXMuXG4gICAgICAgICAgY29uc3QgdXNlck9wZW5pbmdzID0gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyh1c2VyVnJmTXNnMiwgMikucDJwTWVzc2FnZXM7XG4gICAgICAgICAgY29uc3QgYmFja3VwT3BlbmluZ3MgPSBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJhY2t1cFZyZk1zZzIsIDIpLnAycE1lc3NhZ2VzO1xuICAgICAgICAgIGFzc2VydC5vayh1c2VyT3BlbmluZ3Muc29tZSgobSkgPT4gbS5mcm9tID09PSAwICYmIG0udG8gPT09IDIpKTtcbiAgICAgICAgICBhc3NlcnQub2soYmFja3VwT3BlbmluZ3Muc29tZSgobSkgPT4gbS5mcm9tID09PSAxICYmIG0udG8gPT09IDIpKTtcbiAgICAgICAgICBhc3NlcnQub2soc3RvcmVkQml0Z29WcmZPcGVuaW5ncywgJ0JpdEdvIFZSRiBvcGVuaW5ncyBmcm9tIHJvdW5kIDEgbm90IGZvdW5kJyk7XG4gICAgICAgICAgYXdhaXQgYml0Z29WcmZTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgLi4udXNlck9wZW5pbmdzLFxuICAgICAgICAgICAgICAuLi5iYWNrdXBPcGVuaW5ncyxcbiAgICAgICAgICAgICAgLi4uc3RvcmVkQml0Z29WcmZPcGVuaW5ncy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzaGFyZSA9IGRlY29kZShiaXRnb1ZyZlNlc3Npb24uZ2V0S2V5U2hhcmUoKSk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKHNoYXJlLnBhcnR5X2lkLCAyKTtcbiAgICAgICAgICBiaXRnb1ZyZlNoYXJlID0gc2hhcmU7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgYml0Z29Db21taXRtZW50Mjogc3RvcmVkQml0Z29Db21taXRtZW50MiBhcyBOb25FbXB0eVN0cmluZyxcbiAgICAgICAgICAgIGJpdGdvVG9Vc2VyTXNnMzoge1xuICAgICAgICAgICAgICBmcm9tOiAyLFxuICAgICAgICAgICAgICB0bzogMCxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogYml0Z29Ub1VzZXJNc2czLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlOiBiaXRnb1RvVXNlck1zZzMucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYml0Z29Ub0JhY2t1cE1zZzM6IHtcbiAgICAgICAgICAgICAgZnJvbTogMixcbiAgICAgICAgICAgICAgdG86IDEsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGJpdGdvVG9CYWNrdXBNc2czLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlOiBiaXRnb1RvQmFja3VwTXNnMy5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBCaXRHbydzIGZ1bGwgb3BlbmluZyBiYXRjaCwgc28gdXNlciAoMCkgYW5kIGJhY2t1cCAoMSkgY2FuIGVhY2ggcGljayB0aGVpcnMuXG4gICAgICAgICAgICBiaXRnb1ZyZk1zZzI6IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHN0b3JlZEJpdGdvVnJmT3BlbmluZ3MpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrS2V5R2VuUm91bmQzKGJpdGdvU2Vzc2lvbjogRGtsc0RrZy5Ea2csIGJpdGdvVnJmU2Vzc2lvbjogRGtsc1ZyZi5WcmZEa2csIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvbXBjL2dlbmVyYXRla2V5YCwgKGJvZHkpID0+IGJvZHkucm91bmQgPT09ICdNUEN2Mi1SMycpXG4gICAgICAudGltZXModGltZXMpXG4gICAgICAucmVwbHkoXG4gICAgICAgIDIwMCxcbiAgICAgICAgYXN5bmMgKHVyaSwgeyBwYXlsb2FkIH06IHsgcGF5bG9hZDogTVBDdjJLZXlHZW5Sb3VuZDNSZXF1ZXN0IH0pOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+ID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlc3Npb25JZCwgdXNlck1zZzMsIHVzZXJNc2c0LCBiYWNrdXBNc2czLCBiYWNrdXBNc2c0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgIC8vIFRoZSBWUkYgREtHIGhhcyBubyBtZXNzYWdlcyBvbiByb3VuZCAzOyBpdCBhbHJlYWR5IGZpbmFsaXplZCBhZnRlciByb3VuZCAyLlxuICAgICAgICAgIGFzc2VydC5vayhiaXRnb1ZyZlNoYXJlLCAnQml0R28gVlJGIGtleXNoYXJlIHNob3VsZCBiZSBjb21wbGV0ZSBiZWZvcmUgcm91bmQgMycpO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQzSW5jb21pbmdNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZyb206IHVzZXJNc2czLmZyb20sXG4gICAgICAgICAgICAgICAgICB0bzogdXNlck1zZzMudG8sXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHNpZ25hdHVyZTogdXNlck1zZzMuc2lnbmF0dXJlLCBlbmNyeXB0ZWRNZXNzYWdlOiB1c2VyTXNnMy5lbmNyeXB0ZWRNZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgICBjb21taXRtZW50OiBzdG9yZWRVc2VyQ29tbWl0bWVudDIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBmcm9tOiBiYWNrdXBNc2czLmZyb20sXG4gICAgICAgICAgICAgICAgICB0bzogYmFja3VwTXNnMy50byxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2lnbmF0dXJlOiBiYWNrdXBNc2czLnNpZ25hdHVyZSwgZW5jcnlwdGVkTWVzc2FnZTogYmFja3VwTXNnMy5lbmNyeXB0ZWRNZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgICBjb21taXRtZW50OiBzdG9yZWRCYWNrdXBDb21taXRtZW50MixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW3VzZXJHcGdQdWJLZXksIGJhY2t1cEdwZ1B1YktleV0sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kNE1lc3NhZ2VzID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKFxuICAgICAgICAgICAgYml0Z29TZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMocm91bmQzSW5jb21pbmdNc2dzKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJvdW5kNFNpZ25lZE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgICAgICAgIHJvdW5kNE1lc3NhZ2VzLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBiaXRnb01zZzQgPSByb3VuZDRTaWduZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IDIpO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb01zZzQsICdiaXRnb01zZzQgbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZDRJbmNvbWluZ01zZ3MgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBmcm9tOiB1c2VyTXNnNC5mcm9tLFxuICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaWduYXR1cmU6IHVzZXJNc2c0LnNpZ25hdHVyZSwgbWVzc2FnZTogdXNlck1zZzQubWVzc2FnZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZnJvbTogYmFja3VwTXNnNC5mcm9tLFxuXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHNpZ25hdHVyZTogYmFja3VwTXNnNC5zaWduYXR1cmUsIG1lc3NhZ2U6IGJhY2t1cE1zZzQubWVzc2FnZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW3VzZXJHcGdQdWJLZXksIGJhY2t1cEdwZ1B1YktleV0sXG4gICAgICAgICAgICBbXVxuICAgICAgICAgICk7XG4gICAgICAgICAgYml0Z29TZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMocm91bmQ0SW5jb21pbmdNc2dzKSk7XG4gICAgICAgICAgY29uc3Qga2V5U2hhcmUgPSBiaXRnb1Nlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICAgICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihrZXlTaGFyZSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgICAgYml0Z29Nc2c0OiB7IGZyb206IDIsIC4uLmJpdGdvTXNnNC5wYXlsb2FkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tBZGRLZXlDaGFpbihjb2luOiBzdHJpbmcsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvJHtjb2lufS9rZXlgLCAoYm9keSkgPT4gYm9keS5rZXlUeXBlID09PSAndHNzJyAmJiBib2R5LmlzTVBDdjIgJiYgYm9keS5zYWZlSWQgPT09IHNhZmVJZClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsIGFzeW5jICh1cmksIHJlcXVlc3RCb2R5OiBBZGRLZXljaGFpbk9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0ge1xuICAgICAgICAgIGlkOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgICAgc291cmNlOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgICAgdHlwZTogcmVxdWVzdEJvZHkua2V5VHlwZSxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcmVxdWVzdEJvZHkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiByZXF1ZXN0Qm9keS5lbmNyeXB0ZWRQcnYsXG4gICAgICAgIH07XG4gICAgICAgIC8vIG5vY2sgZ2V0c1xuICAgICAgICBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKS5nZXQoYC9hcGkvdjIvJHtjb2lufS9rZXkvJHtyZXF1ZXN0Qm9keS5zb3VyY2V9YCkucmVwbHkoMjAwLCBrZXkpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG4gIH1cbn0pO1xuIl19
|
|
414
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLG1EQUE2RDtBQUM3RCxtREFBMEc7QUFDMUcseURBQWlGO0FBVWpGLCtDQUFpRTtBQWtCakUsd0ZBQXdGO0FBQ3hGLEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsT0FBeUIsRUFDekIsWUFBd0IsRUFDeEIsWUFBb0I7SUFFcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSx1QkFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRSxvQkFBb0IsWUFBWSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JILE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLO0lBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUN6QixNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxrQ0FBa0MsQ0FBQztJQUNsRCxJQUFJLHFCQUE2QixDQUFDO0lBQ2xDLElBQUksdUJBQStCLENBQUM7SUFDcEMsSUFBSSxzQkFBOEIsQ0FBQztJQUNuQyxJQUFJLHNCQUFrRSxDQUFDO0lBRXZFLElBQUksS0FBYSxDQUFDO0lBQ2xCLElBQUksUUFBdUMsQ0FBQztJQUM1QyxJQUFJLE1B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LEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUM7YUFDdkcsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNaLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUErQixFQUFFLEVBQUU7WUFDekQsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsRUFBRSxFQUFFLFdBQVcsQ0FBQyxNQUFNO2dCQUN0QixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07Z0JBQzFCLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDekIsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjO2dCQUMxQyxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7YUFDdkMsQ0FBQztZQUNGLFlBQVk7WUFDWixJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFFBQVEsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvRixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuXG5pbXBvcnQgeyBUZXN0YWJsZUJHLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEJhc2VDb2luLCBjb21tb24sIEVDRFNBVXRpbHMsIEtleWNoYWluLCBXYWxsZXQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNEa2csIERrbHNUeXBlcywgRGtsc1ZyZiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIE1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdCxcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0LFxuICBNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kM1JlcXVlc3QsXG4gIE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2UsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgeyBCaXRHbywgQml0Z29HUEdQdWJsaWNLZXkgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMnO1xuXG50eXBlIFBhcnR5SW5kZXggPSAwIHwgMSB8IDI7XG50eXBlIFNpZ25lZFZyZk1lc3NhZ2UgPSB7IGZyb206IFBhcnR5SW5kZXg7IG1lc3NhZ2U6IHN0cmluZzsgc2lnbmF0dXJlOiBzdHJpbmcgfTtcbnR5cGUgRW5jcnlwdGVkVnJmTWVzc2FnZSA9IHsgZnJvbTogUGFydHlJbmRleDsgdG86IFBhcnR5SW5kZXg7IGVuY3J5cHRlZE1lc3NhZ2U6IHN0cmluZzsgc2lnbmF0dXJlOiBzdHJpbmcgfTtcblxudHlwZSBWcmZLZXlzaGFyZURlY29kZWQgPSB7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xuICB0b3RhbF9wYXJ0aWVzOiBudW1iZXI7XG4gIHBhcnR5X2lkOiBudW1iZXI7XG4gIGRfaTogVWludDhBcnJheTtcbiAgcHVibGljX2tleTogVWludDhBcnJheTtcbiAgcGFydHlfcHVibGljX3NoYXJlczogVWludDhBcnJheVtdO1xuICBrZXlfaWQ6IFVpbnQ4QXJyYXk7XG4gIHJvb3RfY2hhaW5fY29kZTogVWludDhBcnJheTtcbiAgZmluYWxfc2Vzc2lvbl9pZDogVWludDhBcnJheTtcbn07XG5cbi8qKiBWZXJpZmllcyBhIGNsaWVudCBWUkYgbWVzc2FnZSB0aGUgd2F5IEJpdEdvIGRvZXM6IHNpZ25lZCBieSB0aGUgc2VuZGVyJ3MgR1BHIGtleS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNsaWVudFZyZk1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNpZ25lZFZyZk1lc3NhZ2UsXG4gIGV4cGVjdGVkRnJvbTogUGFydHlJbmRleCxcbiAgZ3BnUHVibGljS2V5OiBzdHJpbmdcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBhc3NlcnQuZXF1YWwobWVzc2FnZS5mcm9tLCBleHBlY3RlZEZyb20pO1xuICBhc3NlcnQub2soYXdhaXQgRGtsc0NvbW1zLnZlcmlmeVNpZ25lZERhdGEobWVzc2FnZSwgZ3BnUHVibGljS2V5KSwgYFZSRiBtZXNzYWdlIGZyb20gJHtleHBlY3RlZEZyb219IGlzIG5vdCBzaWduZWRgKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKG1lc3NhZ2UubWVzc2FnZSwgJ2Jhc2U2NCcpKTtcbn1cblxuZGVzY3JpYmUoJ1RTUyBFY2RzYSBWUkYgTVBDdjIgVXRpbHM6JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luTmFtZSA9ICdodGV0aCc7XG4gIGNvbnN0IGVudGVycHJpc2VJZCA9ICc2NDQ5MTUzYTZmNmJjMjAwMDZkNjY3NzFjZGJlMTVkMyc7XG4gIGNvbnN0IHNhZmVJZCA9ICc2ZmE4NTM3ZTNlZjVhODc4ZmQzYWU4OTlmM2FiN2U1YSc7XG4gIGxldCBzdG9yZWRVc2VyQ29tbWl0bWVudDI6IHN0cmluZztcbiAgbGV0IHN0b3JlZEJhY2t1cENvbW1pdG1lbnQyOiBzdHJpbmc7XG4gIGxldCBzdG9yZWRCaXRnb0NvbW1pdG1lbnQyOiBzdHJpbmc7XG4gIGxldCBzdG9yZWRCaXRnb1ZyZk9wZW5pbmdzOiBEa2xzVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMgfCB1bmRlZmluZWQ7XG5cbiAgbGV0IGJnVXJsOiBzdHJpbmc7XG4gIGxldCB0c3NVdGlsczogRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHM7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IGJpdGdvOiBUZXN0YWJsZUJHICYgQml0R287XG4gIGxldCBiYXNlQ29pbjogQmFzZUNvaW47XG4gIGxldCBiaXRnb1ZyZlNoYXJlOiBWcmZLZXlzaGFyZURlY29kZWQgfCB1bmRlZmluZWQ7XG4gIGxldCBiaXRHb0dncEtleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+ICYge1xuICAgIHJldm9jYXRpb25DZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICB9O1xuICBsZXQgY29uc3RhbnRzOiB7IG1wYzogeyBiaXRnb1B1YmxpY0tleTogc3RyaW5nOyBiaXRnb01QQ3YyUHVibGljS2V5OiBzdHJpbmcgfSB9O1xuICBsZXQgYml0Z29HcGdQcnZLZXk6IHsgcGFydHlJZDogbnVtYmVyOyBncGdLZXk6IHN0cmluZyB9O1xuICBsZXQgdXNlckdwZ1B1YktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCBiYWNrdXBHcGdQdWJLZXk6IHsgcGFydHlJZDogbnVtYmVyOyBncGdLZXk6IHN0cmluZyB9O1xuXG4gIC8vIFBlci10ZXN0IHNpbXVsYXRlZCBCaXRHbyBtaXNiZWhhdmlvdXIsIHJlc2V0IGJlZm9yZSBlYWNoIHRlc3QuXG4gIGxldCB0YW1wZXI6IHsgcm91bmQxQ29tbWl0bWVudD86IGJvb2xlYW47IHJvdW5kMk9wZW5pbmdUb1VzZXI/OiBib29sZWFuOyByb3VuZDJPcGVuaW5nVG9CYWNrdXA/OiBib29sZWFuIH0gPSB7fTtcblxuICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0YW1wZXIgPSB7fTtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgYXdhaXQgbm9ja0dldEJpdGdvUHVibGljS2V5QmFzZWRPbkZlYXR1cmVGbGFncyhjb2luTmFtZSwgZW50ZXJwcmlzZUlkLCBiaXRHb0dncEtleSk7XG4gICAgbm9jayhiZ1VybCkuZ2V0KCcvYXBpL3YxL2NsaWVudC9jb25zdGFudHMnKS50aW1lcygxNikucmVwbHkoMjAwLCB7IHR0bDogMzYwMCwgY29uc3RhbnRzIH0pO1xuICB9KTtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIC8vIEFsbG93IHNlY3AyNTZrMSBHUEcga2V5cyB1c2VkIGJ5IHRoZXNlIGZpeHR1cmVzICh0aGUgZnVsbCBzdWl0ZSBlbmFibGVzIHRoaXNcbiAgICAvLyBnbG9iYWxseSB2aWEgc2libGluZyB0ZXN0IGZpbGVzOyBzZXQgaXQgaGVyZSBzbyB0aGlzIGZpbGUgYWxzbyBydW5zIGluIGlzb2xhdGlvbikuXG4gICAgb3BlbnBncC5jb25maWcucmVqZWN0Q3VydmVzID0gbmV3IFNldCgpO1xuICAgIGJpdEdvR2dwS2V5ID0gYXdhaXQgb3BlbnBncC5nZW5lcmF0ZUtleSh7XG4gICAgICB1c2VySURzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYml0Z28nLFxuICAgICAgICAgIGVtYWlsOiAnYml0Z29AdGVzdC5jb20nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGN1cnZlOiAnc2VjcDI1NmsxJyxcbiAgICB9KTtcbiAgICBjb25zdGFudHMgPSB7XG4gICAgICBtcGM6IHtcbiAgICAgICAgYml0Z29QdWJsaWNLZXk6IGJpdEdvR2dwS2V5LnB1YmxpY0tleSxcbiAgICAgICAgYml0Z29NUEN2MlB1YmxpY0tleTogYml0R29HZ3BLZXkucHVibGljS2V5LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYml0Z29HcGdQcnZLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiAyLFxuICAgICAgZ3BnS2V5OiBiaXRHb0dncEtleS5wcml2YXRlS2V5LFxuICAgIH07XG5cbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgIGJhc2VDb2luID0gYml0Z28uY29pbihjb2luTmFtZSk7XG5cbiAgICBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnVyaTtcblxuICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIGNvaW46IGNvaW5OYW1lLFxuICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgfTtcbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgdHNzVXRpbHMgPSBuZXcgRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICB9KTtcblxuICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIFRTUyBNUEN2MiBrZXlzIHdpdGggVlJGIGtleXNoYXJlcyBmb3Igc2FmZSByb290cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiaXRnb1Nlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2coMywgMiwgMik7XG4gICAgY29uc3QgYml0Z29WcmZTZXNzaW9uID0gbmV3IERrbHNWcmYuVnJmRGtnKDMsIDIsIDIpO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tLZXlHZW5Sb3VuZDEoYml0Z29TZXNzaW9uLCBiaXRnb1ZyZlNlc3Npb24pO1xuICAgIGNvbnN0IHJvdW5kMk5vY2sgPSBhd2FpdCBub2NrS2V5R2VuUm91bmQyKGJpdGdvU2Vzc2lvbiwgYml0Z29WcmZTZXNzaW9uKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0tleUdlblJvdW5kMyhiaXRnb1Nlc3Npb24sIGJpdGdvVnJmU2Vzc2lvbik7XG4gICAgY29uc3QgYWRkS2V5Tm9jayA9IGF3YWl0IG5vY2tBZGRLZXlDaGFpbihjb2luTmFtZSwgMyk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiAnMTIzNDU2JyxcbiAgICAgIHNhZmVJZCxcbiAgICB9O1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0gYXdhaXQgdHNzVXRpbHMuY3JlYXRlS2V5Y2hhaW5zKHBhcmFtcyk7XG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuXG4gICAgYXNzZXJ0Lm9rKHVzZXJLZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJLZXljaGFpbi5zb3VyY2UsICd1c2VyJyk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0Lm9rKEVDRFNBVXRpbHMuRWNkc2FNUEN2MlV0aWxzLnZhbGlkYXRlQ29tbW9uS2V5Y2hhaW5QdWJsaWNLZXkodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluKSk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpO1xuICAgIGFzc2VydC5vayhiYWNrdXBLZXljaGFpbik7XG4gICAgYXNzZXJ0Lm9rKGJhY2t1cEtleWNoYWluLmVuY3J5cHRlZFBydik7XG4gICAgYXNzZXJ0Lm9rKGJpdGdvS2V5Y2hhaW4pO1xuXG4gICAgLy8gVGhlIFZSRiBES0cgbXVzdCBoYXZlIGNvbXBsZXRlZCBvbiBCaXRHbydzIChzaW11bGF0ZWQpIHNpZGUgYXMgd2VsbC5cbiAgICBhc3NlcnQub2soYml0Z29WcmZTaGFyZSwgJ0JpdEdvIFZSRiBrZXlzaGFyZSB3YXMgbm90IHByb2R1Y2VkJyk7XG5cbiAgICBhc3NlcnQub2sodXNlcktleWNoYWluLmVuY3J5cHRlZFBydik7XG4gICAgY29uc3QgZGVjcnlwdGVkVXNlclBydiA9IGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlIH0pO1xuICAgIGNvbnN0IHVzZXJFbnZlbG9wZSA9IGRlY29kZShCdWZmZXIuZnJvbShkZWNyeXB0ZWRVc2VyUHJ2LCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyRW52ZWxvcGUudmVyc2lvbiwgMSk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJFbnZlbG9wZS5wcnZLZXlTaGFyZSk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJFbnZlbG9wZS52cmYpO1xuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHVzZXJFbnZlbG9wZS5wcnZLZXlTaGFyZSk7XG4gICAgYXNzZXJ0LmVxdWFsKERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyS2V5U2hhcmUpLCB1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGNvbnN0IHVzZXJWcmZTaGFyZSA9IGRlY29kZSh1c2VyRW52ZWxvcGUudnJmKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlclZyZlNoYXJlLnBhcnR5X2lkLCAwKTtcbiAgICAvLyBBbGwgdGhyZWUgcGFydGllcycgVlJGIERLR3MgYWdyZWUgb24gdGhlIFZSRiBwdWJsaWMga2V5LlxuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJWcmZTaGFyZS5wdWJsaWNfa2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbShiaXRnb1ZyZlNoYXJlLnB1YmxpY19rZXkpLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG5cbiAgICBhc3NlcnQub2soYmFja3VwS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KTtcbiAgICBjb25zdCBkZWNyeXB0ZWRCYWNrdXBQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBiYWNrdXBLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwRW52ZWxvcGUgPSBkZWNvZGUoQnVmZmVyLmZyb20oZGVjcnlwdGVkQmFja3VwUHJ2LCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5lcXVhbChiYWNrdXBFbnZlbG9wZS52ZXJzaW9uLCAxKTtcbiAgICBjb25zdCBiYWNrdXBWcmZTaGFyZSA9IGRlY29kZShiYWNrdXBFbnZlbG9wZS52cmYpO1xuICAgIGFzc2VydC5lcXVhbChiYWNrdXBWcmZTaGFyZS5wYXJ0eV9pZCwgMSk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgQnVmZmVyLmZyb20oYmFja3VwVnJmU2hhcmUucHVibGljX2tleSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20oYml0Z29WcmZTaGFyZS5wdWJsaWNfa2V5KS50b1N0cmluZygnaGV4JylcbiAgICApO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwodXNlclZyZlNoYXJlLmRfaSwgYmFja3VwVnJmU2hhcmUuZF9pKTtcblxuICAgIC8vIHJlZHVjZWRFbmNyeXB0ZWRQcnYgdGFrZXMgdGhlIHNhbWUgZW52ZWxvcGUgYW5kIGNhcnJpZXMgVlJGIG1hdGVyaWFsLlxuICAgIGNvbnN0IHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSAodXNlcktleWNoYWluIGFzIEtleWNoYWluICYgeyByZWR1Y2VkRW5jcnlwdGVkUHJ2Pzogc3RyaW5nIH0pLnJlZHVjZWRFbmNyeXB0ZWRQcnY7XG4gICAgYXNzZXJ0Lm9rKHJlZHVjZWRFbmNyeXB0ZWRQcnYpO1xuICAgIGNvbnN0IHJlZHVjZWREZWNyeXB0ZWQgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHJlZHVjZWRFbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCByZWR1Y2VkRW52ZWxvcGUgPSBkZWNvZGUoQnVmZmVyLmZyb20ocmVkdWNlZERlY3J5cHRlZCwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwocmVkdWNlZEVudmVsb3BlLnZlcnNpb24sIDEpO1xuICAgIGNvbnN0IHJlZHVjZWRLZXlTaGFyZSA9IERrbHNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKHJlZHVjZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSkpO1xuICAgIGFzc2VydC5vayhyZWR1Y2VkS2V5U2hhcmUucHJ2Lmxlbmd0aCA+IDApO1xuICAgIGFzc2VydC5vayhCdWZmZXIuZnJvbShyZWR1Y2VkRW52ZWxvcGUudnJmKS5sZW5ndGggPiAwKTtcblxuICAgIC8vIGNvbW1vbiBrZXljaGFpbnMgYWdyZWUgYWNyb3NzIHBhcnRpZXNcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBiYWNrdXBLZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LmVxdWFsKHVzZXJLZXljaGFpbi5jb21tb25LZXljaGFpbiwgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbik7XG4gIH0pO1xuXG4gIGNvbnN0IGtleWNoYWluUGFyYW1zID0gKCkgPT4gKHtcbiAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogJzEyMzQ1NicsXG4gICAgc2FmZUlkLFxuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBydW5XaXRoVGFtcGVyZWRCaXRnbygpIHtcbiAgICBjb25zdCBiaXRnb1Nlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2coMywgMiwgMik7XG4gICAgY29uc3QgYml0Z29WcmZTZXNzaW9uID0gbmV3IERrbHNWcmYuVnJmRGtnKDMsIDIsIDIpO1xuICAgIGF3YWl0IG5vY2tLZXlHZW5Sb3VuZDEoYml0Z29TZXNzaW9uLCBiaXRnb1ZyZlNlc3Npb24pO1xuICAgIGF3YWl0IG5vY2tLZXlHZW5Sb3VuZDIoYml0Z29TZXNzaW9uLCBiaXRnb1ZyZlNlc3Npb24pO1xuICAgIGF3YWl0IG5vY2tLZXlHZW5Sb3VuZDMoYml0Z29TZXNzaW9uLCBiaXRnb1ZyZlNlc3Npb24pO1xuICAgIGF3YWl0IG5vY2tBZGRLZXlDaGFpbihjb2luTmFtZSwgMyk7XG4gICAgcmV0dXJuIHRzc1V0aWxzLmNyZWF0ZUtleWNoYWlucyhrZXljaGFpblBhcmFtcygpKTtcbiAgfVxuXG4gIGl0KCdzaG91bGQgcmVqZWN0IGEgQml0R28gVlJGIHJvdW5kIDEgY29tbWl0bWVudCB3aG9zZSBzaWduYXR1cmUgZG9lcyBub3QgdmVyaWZ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRhbXBlci5yb3VuZDFDb21taXRtZW50ID0gdHJ1ZTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhydW5XaXRoVGFtcGVyZWRCaXRnbygpLCAvRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBCaXRHbyBWUkYgbWVzc2FnZSAxLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IGEgQml0R28gVlJGIG9wZW5pbmcgdG8gdGhlIHVzZXIgd2hvc2Ugc2lnbmF0dXJlIGRvZXMgbm90IHZlcmlmeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0YW1wZXIucm91bmQyT3BlbmluZ1RvVXNlciA9IHRydWU7XG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMocnVuV2l0aFRhbXBlcmVkQml0Z28oKSwgL1NpZ25lZCBkaWdlc3QgZGlkIG5vdCBtYXRjaC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCBhIEJpdEdvIFZSRiBvcGVuaW5nIHRvIHRoZSBiYWNrdXAgd2hvc2Ugc2lnbmF0dXJlIGRvZXMgbm90IHZlcmlmeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0YW1wZXIucm91bmQyT3BlbmluZ1RvQmFja3VwID0gdHJ1ZTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhydW5XaXRoVGFtcGVyZWRCaXRnbygpLCAvU2lnbmVkIGRpZ2VzdCBkaWQgbm90IG1hdGNoLyk7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tHZXRCaXRnb1B1YmxpY0tleUJhc2VkT25GZWF0dXJlRmxhZ3MoXG4gICAgY29pbjogc3RyaW5nLFxuICAgIGVudGVycHJpc2VJZDogc3RyaW5nLFxuICAgIGJpdGdvR3BnS2V5UGFpcjogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+XG4gICk6IFByb21pc2U8Qml0Z29HUEdQdWJsaWNLZXk+IHtcbiAgICBjb25zdCBiaXRnb0dQR1B1YmxpY0tleVJlc3BvbnNlOiBCaXRnb0dQR1B1YmxpY0tleSA9IHtcbiAgICAgIG5hbWU6ICdpcnJlbGV2YW50JyxcbiAgICAgIHB1YmxpY0tleTogYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgIG1wY3YyUHVibGljS2V5OiBiaXRnb0dwZ0tleVBhaXIucHVibGljS2V5LFxuICAgICAgZW50ZXJwcmlzZUlkLFxuICAgIH07XG4gICAgbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7Y29pbn0vdHNzL3B1YmtleWApLnF1ZXJ5KHsgZW50ZXJwcmlzZUlkIH0pLnJlcGx5KDIwMCwgYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZSk7XG5cbiAgICByZXR1cm4gYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tLZXlHZW5Sb3VuZDEoYml0Z29TZXNzaW9uOiBEa2xzRGtnLkRrZywgYml0Z29WcmZTZXNzaW9uOiBEa2xzVnJmLlZyZkRrZywgdGltZXMgPSAxKSB7XG4gICAgcmV0dXJuIG5vY2soYmdVcmwpXG4gICAgICAucG9zdChgL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXlgLCAoYm9keSkgPT4gYm9keS5yb3VuZCA9PT0gJ01QQ3YyLVIxJylcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseShcbiAgICAgICAgMjAwLFxuICAgICAgICBhc3luYyAodXJpLCB7IHBheWxvYWQgfTogeyBwYXlsb2FkOiBNUEN2MktleUdlblJvdW5kMVJlcXVlc3QgfSk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdXNlckdwZ1B1YmxpY0tleSwgYmFja3VwR3BnUHVibGljS2V5LCB1c2VyTXNnMSwgYmFja3VwTXNnMSwgdXNlclZyZk1zZzEsIGJhY2t1cFZyZk1zZzEgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHVzZXJWcmZNc2cxLCAndXNlclZyZk1zZzEgbXVzdCBiZSBwcmVzZW50IG9uIGEgc2FmZSBrZXlnZW4gcm91bmQgMSBwYXlsb2FkJyk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJhY2t1cFZyZk1zZzEsICdiYWNrdXBWcmZNc2cxIG11c3QgYmUgcHJlc2VudCBvbiBhIHNhZmUga2V5Z2VuIHJvdW5kIDEgcGF5bG9hZCcpO1xuICAgICAgICAgIHVzZXJHcGdQdWJLZXkgPSB7XG4gICAgICAgICAgICBwYXJ0eUlkOiAwLFxuICAgICAgICAgICAgZ3BnS2V5OiB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYmFja3VwR3BnUHViS2V5ID0ge1xuICAgICAgICAgICAgcGFydHlJZDogMSxcbiAgICAgICAgICAgIGdwZ0tleTogYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBiaXRnb0Jyb2FkY2FzdE1zZzFVbnNpZ25lZCA9IGF3YWl0IGJpdGdvU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgICAgICAgY29uc3QgYml0Z29Nc2dzMVNpZ25lZCA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Ccm9hZGNhc3RNc2cxVW5zaWduZWQpXSwgcDJwTWVzc2FnZXM6IFtdIH0sXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGJpdGdvTXNnMSA9IGJpdGdvTXNnczFTaWduZWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSAyKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Nc2cxLCAnYml0Z29Nc2cxIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQxSW5jb21pbmdNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgeyBmcm9tOiAwLCBwYXlsb2FkOiB1c2VyTXNnMSB9LFxuICAgICAgICAgICAgICAgIHsgZnJvbTogMSwgcGF5bG9hZDogYmFja3VwTXNnMSB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFt1c2VyR3BnUHViS2V5LCBiYWNrdXBHcGdQdWJLZXldLFxuICAgICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgICAgICAgIGJpdGdvU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHJvdW5kMUluY29taW5nTXNncykpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kMlNpZ25lZE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgICAgICAgIHJvdW5kMk1lc3NhZ2VzLFxuICAgICAgICAgICAgW3VzZXJHcGdQdWJLZXksIGJhY2t1cEdwZ1B1YktleV0sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJpdGdvVG9Vc2VyTXNnMiA9IHJvdW5kMlNpZ25lZE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0udG8gPT09IDApO1xuICAgICAgICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBNc2cyID0gcm91bmQyU2lnbmVkTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZCgobSkgPT4gbS50byA9PT0gMSk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvVG9Vc2VyTXNnMiwgJ2JpdGdvVG9Vc2VyTXNnMiBub3QgZm91bmQnKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Ub0JhY2t1cE1zZzIsICdiaXRnb1RvQmFja3VwTXNnMiBub3QgZm91bmQnKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Ub1VzZXJNc2cyLmNvbW1pdG1lbnQsICdiaXRnb1RvVXNlck1zZzIuY29tbWl0bWVudCBub3QgZm91bmQnKTtcblxuICAgICAgICAgIHN0b3JlZEJpdGdvQ29tbWl0bWVudDIgPSBiaXRnb1RvVXNlck1zZzI/LmNvbW1pdG1lbnQ7XG5cbiAgICAgICAgICAvLyBWUkYgREtHOiB2ZXJpZnkgdGhlIHNpZ25lZCBjbGllbnQgY29tbWl0bWVudHMsIHRoZW4gQml0R28gY29tbWl0cyBhbmQgY29uc3VtZXMgdGhlbS5cbiAgICAgICAgICBjb25zdCBiaXRnb1ZyZk1zZzFVbnNpZ25lZCA9IGF3YWl0IGJpdGdvVnJmU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgICAgICAgY29uc3QgdXNlclZyZkNvbW1pdG1lbnQgPSBhd2FpdCB2ZXJpZnlDbGllbnRWcmZNZXNzYWdlKHVzZXJWcmZNc2cxLCAwLCB1c2VyR3BnUHVibGljS2V5KTtcbiAgICAgICAgICBjb25zdCBiYWNrdXBWcmZDb21taXRtZW50ID0gYXdhaXQgdmVyaWZ5Q2xpZW50VnJmTWVzc2FnZShiYWNrdXBWcmZNc2cxLCAxLCBiYWNrdXBHcGdQdWJsaWNLZXkpO1xuICAgICAgICAgIHN0b3JlZEJpdGdvVnJmT3BlbmluZ3MgPSBhd2FpdCBiaXRnb1ZyZlNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICAgICAgICB7IGZyb206IDAsIHBheWxvYWQ6IHVzZXJWcmZDb21taXRtZW50IH0sXG4gICAgICAgICAgICAgIHsgZnJvbTogMSwgcGF5bG9hZDogYmFja3VwVnJmQ29tbWl0bWVudCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBCaXRHbydzIG9wZW5pbmdzIGFyZSBhZGRyZXNzZWQgdG8gZWFjaCBwYXJ0eSwgaXRzZWxmIGluY2x1ZGVkLlxuICAgICAgICAgIGFzc2VydC5lcXVhbChzdG9yZWRCaXRnb1ZyZk9wZW5pbmdzLnAycE1lc3NhZ2VzLmxlbmd0aCwgMyk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKGJpdGdvVnJmTXNnMVVuc2lnbmVkLmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCwgMSk7XG4gICAgICAgICAgY29uc3QgYml0Z29WcmZNc2cxU2lnbmVkOiBTaWduZWRWcmZNZXNzYWdlID0ge1xuICAgICAgICAgICAgZnJvbTogMixcbiAgICAgICAgICAgIC4uLihhd2FpdCBEa2xzQ29tbXMuZGV0YWNoU2lnbkRhdGEoXG4gICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKGJpdGdvVnJmTXNnMVVuc2lnbmVkLmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnBheWxvYWQpLFxuICAgICAgICAgICAgICBiaXRnb0dwZ1BydktleS5ncGdLZXlcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHRhbXBlci5yb3VuZDFDb21taXRtZW50KSB7XG4gICAgICAgICAgICAvLyBWYWxpZCBzaWduYXR1cmUsIGRpZmZlcmVudCBwYXlsb2FkOiB0aGUgc2lnbmF0dXJlIG5vIGxvbmdlciBjb3ZlcnMgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICBiaXRnb1ZyZk1zZzFTaWduZWQubWVzc2FnZSA9IEJ1ZmZlci5mcm9tKCdmb3JnZWQtY29tbWl0bWVudCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiAndGVzdGlkJyBhcyBOb25FbXB0eVN0cmluZyxcbiAgICAgICAgICAgIGJpdGdvTXNnMTogeyBmcm9tOiAyLCAuLi5iaXRnb01zZzEucGF5bG9hZCB9LFxuICAgICAgICAgICAgYml0Z29Ub0JhY2t1cE1zZzI6IHtcbiAgICAgICAgICAgICAgZnJvbTogMixcbiAgICAgICAgICAgICAgdG86IDEsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGJpdGdvVG9CYWNrdXBNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlOiBiaXRnb1RvQmFja3VwTXNnMi5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiaXRnb1RvVXNlck1zZzI6IHtcbiAgICAgICAgICAgICAgZnJvbTogMixcbiAgICAgICAgICAgICAgdG86IDAsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGJpdGdvVG9Vc2VyTXNnMi5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHNpZ25hdHVyZTogYml0Z29Ub1VzZXJNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhbGxldEdwZ1B1YktleVNpZ3M6ICdzb21ldGhpbmcnIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgICAgYml0Z29WcmZNc2cxOiBiaXRnb1ZyZk1zZzFTaWduZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tLZXlHZW5Sb3VuZDIoYml0Z29TZXNzaW9uOiBEa2xzRGtnLkRrZywgYml0Z29WcmZTZXNzaW9uOiBEa2xzVnJmLlZyZkRrZywgdGltZXMgPSAxKSB7XG4gICAgcmV0dXJuIG5vY2soYmdVcmwpXG4gICAgICAucG9zdChgL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXlgLCAoYm9keSkgPT4gYm9keS5yb3VuZCA9PT0gJ01QQ3YyLVIyJylcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseShcbiAgICAgICAgMjAwLFxuICAgICAgICBhc3luYyAodXJpLCB7IHBheWxvYWQgfTogeyBwYXlsb2FkOiBNUEN2MktleUdlblJvdW5kMlJlcXVlc3QgfSk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCB1c2VyTXNnMiwgYmFja3VwTXNnMiwgdXNlckNvbW1pdG1lbnQyLCBiYWNrdXBDb21taXRtZW50MiwgdXNlclZyZk1zZzIsIGJhY2t1cFZyZk1zZzIgfSA9XG4gICAgICAgICAgICBwYXlsb2FkO1xuICAgICAgICAgIGFzc2VydC5vayh1c2VyVnJmTXNnMiwgJ3VzZXJWcmZNc2cyIG11c3QgYmUgcHJlc2VudCBvbiBhIHNhZmUga2V5Z2VuIHJvdW5kIDIgcGF5bG9hZCcpO1xuICAgICAgICAgIGFzc2VydC5vayhiYWNrdXBWcmZNc2cyLCAnYmFja3VwVnJmTXNnMiBtdXN0IGJlIHByZXNlbnQgb24gYSBzYWZlIGtleWdlbiByb3VuZCAyIHBheWxvYWQnKTtcbiAgICAgICAgICBzdG9yZWRVc2VyQ29tbWl0bWVudDIgPSB1c2VyQ29tbWl0bWVudDI7XG4gICAgICAgICAgc3RvcmVkQmFja3VwQ29tbWl0bWVudDIgPSBiYWNrdXBDb21taXRtZW50MjtcbiAgICAgICAgICBjb25zdCByb3VuZDJJbmNvbWluZ01zZ3MgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZnJvbTogdXNlck1zZzIuZnJvbSxcbiAgICAgICAgICAgICAgICAgIHRvOiB1c2VyTXNnMi50byxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2lnbmF0dXJlOiB1c2VyTXNnMi5zaWduYXR1cmUsIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2cyLmVuY3J5cHRlZE1lc3NhZ2UgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZyb206IGJhY2t1cE1zZzIuZnJvbSxcbiAgICAgICAgICAgICAgICAgIHRvOiBiYWNrdXBNc2cyLnRvLFxuICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaWduYXR1cmU6IGJhY2t1cE1zZzIuc2lnbmF0dXJlLCBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2cyLmVuY3J5cHRlZE1lc3NhZ2UgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW3VzZXJHcGdQdWJLZXksIGJhY2t1cEdwZ1B1YktleV0sXG4gICAgICAgICAgICBbYml0Z29HcGdQcnZLZXldXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kM01lc3NhZ2VzID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKFxuICAgICAgICAgICAgYml0Z29TZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMocm91bmQySW5jb21pbmdNc2dzKSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQzU2lnbmVkTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgICAgICAgcm91bmQzTWVzc2FnZXMsXG4gICAgICAgICAgICBbdXNlckdwZ1B1YktleSwgYmFja3VwR3BnUHViS2V5XSxcbiAgICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYml0Z29Ub1VzZXJNc2czID0gcm91bmQzU2lnbmVkTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZCgobSkgPT4gbS50byA9PT0gMCk7XG4gICAgICAgICAgY29uc3QgYml0Z29Ub0JhY2t1cE1zZzMgPSByb3VuZDNTaWduZWRNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKChtKSA9PiBtLnRvID09PSAxKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Ub1VzZXJNc2czLCAnYml0Z29Ub1VzZXJNc2czIG5vdCBmb3VuZCcpO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb1RvQmFja3VwTXNnMywgJ2JpdGdvVG9CYWNrdXBNc2czIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgICAgLy8gVlJGIERLRzogdGhlIFNESyBzZW5kcyBvbmx5IHRoZSBvcGVuaW5nIGFkZHJlc3NlZCB0byBCaXRHbywgc2lnbmVkIGJ5IHRoZSBzZW5kaW5nIHBhcnR5LlxuICAgICAgICAgIGNvbnN0IHVzZXJPcGVuaW5nID0gYXdhaXQgdmVyaWZ5Q2xpZW50VnJmTWVzc2FnZSh1c2VyVnJmTXNnMiwgMCwgdXNlckdwZ1B1YktleS5ncGdLZXkpO1xuICAgICAgICAgIGNvbnN0IGJhY2t1cE9wZW5pbmcgPSBhd2FpdCB2ZXJpZnlDbGllbnRWcmZNZXNzYWdlKGJhY2t1cFZyZk1zZzIsIDEsIGJhY2t1cEdwZ1B1YktleS5ncGdLZXkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJPcGVuaW5ncyA9IFt7IGZyb206IDAsIHRvOiAyLCBwYXlsb2FkOiB1c2VyT3BlbmluZyB9XTtcbiAgICAgICAgICBjb25zdCBiYWNrdXBPcGVuaW5ncyA9IFt7IGZyb206IDEsIHRvOiAyLCBwYXlsb2FkOiBiYWNrdXBPcGVuaW5nIH1dO1xuICAgICAgICAgIGFzc2VydC5vayhzdG9yZWRCaXRnb1ZyZk9wZW5pbmdzLCAnQml0R28gVlJGIG9wZW5pbmdzIGZyb20gcm91bmQgMSBub3QgZm91bmQnKTtcbiAgICAgICAgICBhd2FpdCBiaXRnb1ZyZlNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICAgICAgICAuLi51c2VyT3BlbmluZ3MsXG4gICAgICAgICAgICAgIC4uLmJhY2t1cE9wZW5pbmdzLFxuICAgICAgICAgICAgICAuLi5zdG9yZWRCaXRnb1ZyZk9wZW5pbmdzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMiksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHNoYXJlID0gZGVjb2RlKGJpdGdvVnJmU2Vzc2lvbi5nZXRLZXlTaGFyZSgpKTtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoc2hhcmUucGFydHlfaWQsIDIpO1xuICAgICAgICAgIGJpdGdvVnJmU2hhcmUgPSBzaGFyZTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBiaXRnb0NvbW1pdG1lbnQyOiBzdG9yZWRCaXRnb0NvbW1pdG1lbnQyIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgICAgYml0Z29Ub1VzZXJNc2czOiB7XG4gICAgICAgICAgICAgIGZyb206IDIsXG4gICAgICAgICAgICAgIHRvOiAwLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiaXRnb1RvVXNlck1zZzMucGF5bG9hZC5lbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICBzaWduYXR1cmU6IGJpdGdvVG9Vc2VyTXNnMy5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiaXRnb1RvQmFja3VwTXNnMzoge1xuICAgICAgICAgICAgICBmcm9tOiAyLFxuICAgICAgICAgICAgICB0bzogMSxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogYml0Z29Ub0JhY2t1cE1zZzMucGF5bG9hZC5lbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICAgICAgICBzaWduYXR1cmU6IGJpdGdvVG9CYWNrdXBNc2czLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEJpdEdvJ3Mgb3BlbmluZ3MsIGVhY2ggUEdQLWVuY3J5cHRlZCB0byBpdHMgcmVjaXBpZW50IGFuZCBzaWduZWQgb3ZlciB0aGUgcGxhaW50ZXh0LlxuICAgICAgICAgICAgYml0Z29WcmZNc2dUb1VzZXI6IGF3YWl0IGVuY3J5cHRWcmZPcGVuaW5nKFxuICAgICAgICAgICAgICBzdG9yZWRCaXRnb1ZyZk9wZW5pbmdzLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB1c2VyR3BnUHViS2V5LmdwZ0tleSxcbiAgICAgICAgICAgICAgdGFtcGVyLnJvdW5kMk9wZW5pbmdUb1VzZXJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBiaXRnb1ZyZk1zZ1RvQmFja3VwOiBhd2FpdCBlbmNyeXB0VnJmT3BlbmluZyhcbiAgICAgICAgICAgICAgc3RvcmVkQml0Z29WcmZPcGVuaW5ncyxcbiAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgYmFja3VwR3BnUHViS2V5LmdwZ0tleSxcbiAgICAgICAgICAgICAgdGFtcGVyLnJvdW5kMk9wZW5pbmdUb0JhY2t1cFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgLyoqIEVuY3J5cHRzIEJpdEdvJ3MgVlJGIG9wZW5pbmcgZm9yIGB0b2Agd2l0aCB0aGF0IHBhcnR5J3MgR1BHIGtleSBhbmQgc2lnbnMgdGhlIHBsYWludGV4dC4gKi9cbiAgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdFZyZk9wZW5pbmcoXG4gICAgb3BlbmluZ3M6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgICB0bzogUGFydHlJbmRleCxcbiAgICBwYXJ0eUdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHRhbXBlclBsYWludGV4dCA9IGZhbHNlXG4gICk6IFByb21pc2U8RW5jcnlwdGVkVnJmTWVzc2FnZT4ge1xuICAgIGNvbnN0IG9wZW5pbmcgPSBvcGVuaW5ncy5wMnBNZXNzYWdlcy5maW5kKChtKSA9PiBtLnRvID09PSB0byk7XG4gICAgYXNzZXJ0Lm9rKG9wZW5pbmcsIGBCaXRHbyBWUkYgb3BlbmluZyBmb3IgcGFydHkgJHt0b30gbm90IGZvdW5kYCk7XG4gICAgY29uc3Qgc2lnbmVkRm9yID0gQnVmZmVyLmZyb20ob3BlbmluZy5wYXlsb2FkKTtcbiAgICBjb25zdCB7IGVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZSB9ID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmREZXRhY2hTaWduRGF0YShcbiAgICAgIHNpZ25lZEZvcixcbiAgICAgIHBhcnR5R3BnUHVibGljS2V5LFxuICAgICAgYml0Z29HcGdQcnZLZXkuZ3BnS2V5XG4gICAgKTtcbiAgICBpZiAoIXRhbXBlclBsYWludGV4dCkge1xuICAgICAgcmV0dXJuIHsgZnJvbTogMiwgdG8sIGVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZSB9O1xuICAgIH1cbiAgICAvLyBFbmNyeXB0IGEgZGlmZmVyZW50IHBsYWludGV4dCBidXQga2VlcCB0aGUgc2lnbmF0dXJlIG92ZXIgdGhlIG9yaWdpbmFsIG9uZS5cbiAgICBjb25zdCBmb3JnZWQgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZERldGFjaFNpZ25EYXRhKFxuICAgICAgQnVmZmVyLmZyb20oJ2ZvcmdlZC1vcGVuaW5nJyksXG4gICAgICBwYXJ0eUdwZ1B1YmxpY0tleSxcbiAgICAgIGJpdGdvR3BnUHJ2S2V5LmdwZ0tleVxuICAgICk7XG4gICAgcmV0dXJuIHsgZnJvbTogMiwgdG8sIGVuY3J5cHRlZE1lc3NhZ2U6IGZvcmdlZC5lbmNyeXB0ZWRNZXNzYWdlLCBzaWduYXR1cmUgfTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG5vY2tLZXlHZW5Sb3VuZDMoYml0Z29TZXNzaW9uOiBEa2xzRGtnLkRrZywgYml0Z29WcmZTZXNzaW9uOiBEa2xzVnJmLlZyZkRrZywgdGltZXMgPSAxKSB7XG4gICAgcmV0dXJuIG5vY2soYmdVcmwpXG4gICAgICAucG9zdChgL2FwaS92Mi9tcGMvZ2VuZXJhdGVrZXlgLCAoYm9keSkgPT4gYm9keS5yb3VuZCA9PT0gJ01QQ3YyLVIzJylcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseShcbiAgICAgICAgMjAwLFxuICAgICAgICBhc3luYyAodXJpLCB7IHBheWxvYWQgfTogeyBwYXlsb2FkOiBNUEN2MktleUdlblJvdW5kM1JlcXVlc3QgfSk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCB1c2VyTXNnMywgdXNlck1zZzQsIGJhY2t1cE1zZzMsIGJhY2t1cE1zZzQgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgLy8gVGhlIFZSRiBES0cgaGFzIG5vIG1lc3NhZ2VzIG9uIHJvdW5kIDM7IGl0IGFscmVhZHkgZmluYWxpemVkIGFmdGVyIHJvdW5kIDIuXG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvVnJmU2hhcmUsICdCaXRHbyBWUkYga2V5c2hhcmUgc2hvdWxkIGJlIGNvbXBsZXRlIGJlZm9yZSByb3VuZCAzJyk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZDNJbmNvbWluZ01zZ3MgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZnJvbTogdXNlck1zZzMuZnJvbSxcbiAgICAgICAgICAgICAgICAgIHRvOiB1c2VyTXNnMy50byxcbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2lnbmF0dXJlOiB1c2VyTXNnMy5zaWduYXR1cmUsIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2czLmVuY3J5cHRlZE1lc3NhZ2UgfSxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6IHN0b3JlZFVzZXJDb21taXRtZW50MixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZyb206IGJhY2t1cE1zZzMuZnJvbSxcbiAgICAgICAgICAgICAgICAgIHRvOiBiYWNrdXBNc2czLnRvLFxuICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaWduYXR1cmU6IGJhY2t1cE1zZzMuc2lnbmF0dXJlLCBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2czLmVuY3J5cHRlZE1lc3NhZ2UgfSxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6IHN0b3JlZEJhY2t1cENvbW1pdG1lbnQyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbdXNlckdwZ1B1YktleSwgYmFja3VwR3BnUHViS2V5XSxcbiAgICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQ0TWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICAgICAgICBiaXRnb1Nlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhyb3VuZDNJbmNvbWluZ01zZ3MpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgcm91bmQ0U2lnbmVkTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgICAgICAgcm91bmQ0TWVzc2FnZXMsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGJpdGdvTXNnNCA9IHJvdW5kNFNpZ25lZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gMik7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvTXNnNCwgJ2JpdGdvTXNnNCBub3QgZm91bmQnKTtcblxuICAgICAgICAgIGNvbnN0IHJvdW5kNEluY29taW5nTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZyb206IHVzZXJNc2c0LmZyb20sXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHNpZ25hdHVyZTogdXNlck1zZzQuc2lnbmF0dXJlLCBtZXNzYWdlOiB1c2VyTXNnNC5tZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBmcm9tOiBiYWNrdXBNc2c0LmZyb20sXG5cbiAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2lnbmF0dXJlOiBiYWNrdXBNc2c0LnNpZ25hdHVyZSwgbWVzc2FnZTogYmFja3VwTXNnNC5tZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbdXNlckdwZ1B1YktleSwgYmFja3VwR3BnUHViS2V5XSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgKTtcbiAgICAgICAgICBiaXRnb1Nlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhyb3VuZDRJbmNvbWluZ01zZ3MpKTtcbiAgICAgICAgICBjb25zdCBrZXlTaGFyZSA9IGJpdGdvU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgICAgICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKGtleVNoYXJlKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjb21tb25LZXljaGFpbjogY29tbW9uS2V5Y2hhaW4gYXMgTm9uRW1wdHlTdHJpbmcsXG4gICAgICAgICAgICBiaXRnb01zZzQ6IHsgZnJvbTogMiwgLi4uYml0Z29Nc2c0LnBheWxvYWQgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0FkZEtleUNoYWluKGNvaW46IHN0cmluZywgdGltZXMgPSAxKSB7XG4gICAgcmV0dXJuIG5vY2soJ2h0dHBzOi8vYml0Z28uZmFrZXVybCcpXG4gICAgICAucG9zdChgL2FwaS92Mi8ke2NvaW59L2tleWAsIChib2R5KSA9PiBib2R5LmtleVR5cGUgPT09ICd0c3MnICYmIGJvZHkuaXNNUEN2MiAmJiBib2R5LnNhZmVJZCA9PT0gc2FmZUlkKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IEFkZEtleWNoYWluT3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB7XG4gICAgICAgICAgaWQ6IHJlcXVlc3RCb2R5LnNvdXJjZSxcbiAgICAgICAgICBzb3VyY2U6IHJlcXVlc3RCb2R5LnNvdXJjZSxcbiAgICAgICAgICB0eXBlOiByZXF1ZXN0Qm9keS5rZXlUeXBlLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOiByZXF1ZXN0Qm9keS5jb21tb25LZXljaGFpbixcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHJlcXVlc3RCb2R5LmVuY3J5cHRlZFBydixcbiAgICAgICAgfTtcbiAgICAgICAgLy8gbm9jayBnZXRzXG4gICAgICAgIG5vY2soJ2h0dHBzOi8vYml0Z28uZmFrZXVybCcpLmdldChgL2FwaS92Mi8ke2NvaW59L2tleS8ke3JlcXVlc3RCb2R5LnNvdXJjZX1gKS5yZXBseSgyMDAsIGtleSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9KTtcbiAgfVxufSk7XG4iXX0=
|