bitgo 52.12.1 → 53.0.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,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const assert = require("assert");
4
+ const nock = require("nock");
5
+ const openpgp = require("openpgp");
6
+ const cbor_x_1 = require("cbor-x");
7
+ const sdk_test_1 = require("@bitgo/sdk-test");
8
+ const sdk_core_1 = require("@bitgo/sdk-core");
9
+ const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
10
+ const src_1 = require("../../../../../../src");
11
+ const SAFE_ID = '6fa8537e3ef5a878fd3ae899f3ab7e5a';
12
+ const USER_ROOT_KEY_ID = 'root-user-key-id';
13
+ const DERIVATION_INDEX = 0;
14
+ const BITGO_ROOT_KEY_ID = 'root-bitgo-key-id';
15
+ const BACKUP_ROOT_KEY_ID = 'root-backup-key-id';
16
+ const PATH_M0 = new Uint8Array([0x80, 0x00, 0x00, 0x00]);
17
+ describe('TSS ECDSA safe child keychains (user/BitGo hard derive):', async function () {
18
+ const coinName = 'hteth';
19
+ const enterpriseId = '6449153a6f6bc20006d66771cdbe15d3';
20
+ let bgUrl;
21
+ let bitgo;
22
+ let tssUtils;
23
+ let wallet;
24
+ let bitGoGpgKey;
25
+ let constants;
26
+ let bitgoGpgPrvKey;
27
+ let userGpgPubKey;
28
+ let stagedBitgoMsg2;
29
+ before(async function () {
30
+ openpgp.config.rejectCurves = new Set();
31
+ bitGoGpgKey = await openpgp.generateKey({
32
+ userIDs: [{ name: 'bitgo', email: 'bitgo@test.com' }],
33
+ curve: 'secp256k1',
34
+ });
35
+ constants = {
36
+ mpc: {
37
+ bitgoPublicKey: bitGoGpgKey.publicKey,
38
+ bitgoMPCv2PublicKey: bitGoGpgKey.publicKey,
39
+ },
40
+ };
41
+ bitgoGpgPrvKey = { partyId: 2, gpgKey: bitGoGpgKey.privateKey };
42
+ bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
43
+ bitgo.initializeTestVars();
44
+ bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
45
+ const baseCoin = bitgo.coin(coinName);
46
+ wallet = new sdk_core_1.Wallet(bitgo, baseCoin, {
47
+ id: '5b34252f1bf349930e34020a00000000',
48
+ enterprise: enterpriseId,
49
+ coin: coinName,
50
+ coinSpecific: {},
51
+ multisigType: 'tss',
52
+ });
53
+ tssUtils = new sdk_core_1.ECDSAUtils.EcdsaVrfMPCv2Utils(bitgo, baseCoin, wallet);
54
+ });
55
+ beforeEach(async function () {
56
+ nock.cleanAll();
57
+ stagedBitgoMsg2 = undefined;
58
+ await nockGetBitgoPublicKeyBasedOnFeatureFlags(coinName, enterpriseId, bitGoGpgKey);
59
+ nock(bgUrl).get('/api/v1/client/constants').times(32).reply(200, { ttl: 3600, constants });
60
+ });
61
+ after(function () {
62
+ nock.cleanAll();
63
+ });
64
+ it('should derive the user child and register the backup without encryptedPrv', async function () {
65
+ const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
66
+ const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
67
+ const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
68
+ const round1Nock = await nockDeriveRound1(bitgoPair);
69
+ const round2Nock = await nockDeriveRound2(bitgoPair);
70
+ const round3Nock = await nockDeriveRound3(bitgoPair);
71
+ const addKeyNock = await nockAddChildKey(coinName, 2);
72
+ const { userKeychain, backupKeychain } = await tssUtils.createSafeChildKeychains({
73
+ passphrase: 'test',
74
+ enterprise: enterpriseId,
75
+ safeId: SAFE_ID,
76
+ parentKeyId: BITGO_ROOT_KEY_ID,
77
+ derivationIndex: DERIVATION_INDEX,
78
+ userRootKeyId: USER_ROOT_KEY_ID,
79
+ backupRootKeyId: BACKUP_ROOT_KEY_ID,
80
+ userRootKeyShare: userRoot.getKeyShare(),
81
+ userRootVrfKeyShare: vrfUser.getKeyShare(),
82
+ });
83
+ assert.ok(round1Nock.isDone());
84
+ assert.ok(round2Nock.isDone());
85
+ assert.ok(round3Nock.isDone());
86
+ assert.ok(addKeyNock.isDone());
87
+ assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
88
+ assert.equal(userKeychain.commonKeychain, sdk_lib_mpc_1.DklsTypes.getCommonKeychain(bitgoPair.getKeyShare()));
89
+ const encryptedUserPrv = userKeychain.encryptedPrv;
90
+ assert.ok(encryptedUserPrv);
91
+ assert.equal(backupKeychain.encryptedPrv, undefined);
92
+ const decryptedUserPrv = await bitgo.decrypt({ input: encryptedUserPrv, password: 'test' });
93
+ const userChildShare = (0, cbor_x_1.decode)(Buffer.from(decryptedUserPrv, 'base64'));
94
+ assert.equal(userChildShare.version, undefined);
95
+ assert.equal(userChildShare.vrf, undefined);
96
+ assert.equal(userChildShare.party_id, 0);
97
+ assert.ok(userChildShare.s_i);
98
+ });
99
+ it('should derive at a non-zero hardened index and agree with the server', async function () {
100
+ const idx = 7;
101
+ const path = new Uint8Array([0x80 | (idx >>> 24), 0, 0, idx]);
102
+ const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
103
+ const [vrfUser, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
104
+ const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), path);
105
+ const round1Nock = await nockDeriveRound1(bitgoPair, 1, idx);
106
+ const round2Nock = await nockDeriveRound2(bitgoPair);
107
+ const round3Nock = await nockDeriveRound3(bitgoPair);
108
+ const addKeyNock = await nockAddChildKey(coinName, 2, idx);
109
+ const { userKeychain, backupKeychain } = await tssUtils.createSafeChildKeychains({
110
+ passphrase: 'test',
111
+ enterprise: enterpriseId,
112
+ safeId: SAFE_ID,
113
+ parentKeyId: BITGO_ROOT_KEY_ID,
114
+ derivationIndex: idx,
115
+ userRootKeyId: USER_ROOT_KEY_ID,
116
+ backupRootKeyId: BACKUP_ROOT_KEY_ID,
117
+ userRootKeyShare: userRoot.getKeyShare(),
118
+ userRootVrfKeyShare: vrfUser.getKeyShare(),
119
+ });
120
+ assert.ok(round1Nock.isDone());
121
+ assert.ok(round2Nock.isDone());
122
+ assert.ok(round3Nock.isDone());
123
+ assert.ok(addKeyNock.isDone());
124
+ assert.equal(userKeychain.commonKeychain, backupKeychain.commonKeychain);
125
+ });
126
+ it('should reject root key material that is not a valid VRF envelope', async function () {
127
+ const [, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
128
+ const [, , vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
129
+ const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
130
+ const round1Nock = await nockDeriveRound1(bitgoPair);
131
+ const round2Nock = await nockDeriveRound2(bitgoPair);
132
+ const round3Nock = await nockDeriveRound3(bitgoPair);
133
+ await assert.rejects(() => tssUtils.createSafeChildKeychains({
134
+ passphrase: 'test',
135
+ enterprise: enterpriseId,
136
+ safeId: SAFE_ID,
137
+ parentKeyId: BITGO_ROOT_KEY_ID,
138
+ derivationIndex: DERIVATION_INDEX,
139
+ userRootKeyId: USER_ROOT_KEY_ID,
140
+ backupRootKeyId: BACKUP_ROOT_KEY_ID,
141
+ userRootKeyShare: Buffer.from('garbage'),
142
+ userRootVrfKeyShare: vrfBitgo.getKeyShare(),
143
+ }), /CBOR decode|does not match root key share partyId|VRF keyshare/i);
144
+ assert.ok(!round1Nock.isDone(), 'round 1 must not be sent for invalid root material');
145
+ assert.ok(!round2Nock.isDone(), 'round 2 must not be sent for invalid root material');
146
+ assert.ok(!round3Nock.isDone(), 'round 3 must not be sent for invalid root material');
147
+ });
148
+ it('should reject a root blob with a VRF partyId mismatch', async function () {
149
+ const [userRoot, , bitgoRoot] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
150
+ const [, vrfBackup, vrfBitgo] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
151
+ const bitgoPair = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, 2, bitgoRoot.getKeyShare(), vrfBitgo.getKeyShare(), PATH_M0);
152
+ const round1Nock = await nockDeriveRound1(bitgoPair);
153
+ const round2Nock = await nockDeriveRound2(bitgoPair);
154
+ const round3Nock = await nockDeriveRound3(bitgoPair);
155
+ await assert.rejects(() => tssUtils.createSafeChildKeychains({
156
+ passphrase: 'test',
157
+ enterprise: enterpriseId,
158
+ safeId: SAFE_ID,
159
+ parentKeyId: BITGO_ROOT_KEY_ID,
160
+ derivationIndex: DERIVATION_INDEX,
161
+ userRootKeyId: USER_ROOT_KEY_ID,
162
+ backupRootKeyId: BACKUP_ROOT_KEY_ID,
163
+ userRootKeyShare: userRoot.getKeyShare(),
164
+ userRootVrfKeyShare: vrfBackup.getKeyShare(),
165
+ }), /does not match VRF key share partyId/);
166
+ assert.ok(!round1Nock.isDone(), 'round 1 must not be sent for mismatched VRF material');
167
+ assert.ok(!round2Nock.isDone(), 'round 2 must not be sent for mismatched VRF material');
168
+ assert.ok(!round3Nock.isDone(), 'round 3 must not be sent for mismatched VRF material');
169
+ });
170
+ async function nockGetBitgoPublicKeyBasedOnFeatureFlags(coin, enterpriseId, bitgoGpgKeyPair) {
171
+ const bitgoGPGPublicKeyResponse = {
172
+ name: 'irrelevant',
173
+ publicKey: bitgoGpgKeyPair.publicKey,
174
+ mpcv2PublicKey: bitgoGpgKeyPair.publicKey,
175
+ enterpriseId,
176
+ };
177
+ nock(bgUrl).get(`/api/v2/${coin}/tss/pubkey`).query({ enterpriseId }).reply(200, bitgoGPGPublicKeyResponse);
178
+ return bitgoGPGPublicKeyResponse;
179
+ }
180
+ async function nockDeriveRound1(bitgoPair, times = 1, index = DERIVATION_INDEX) {
181
+ return nock(bgUrl)
182
+ .post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R1' &&
183
+ body.safeId === SAFE_ID &&
184
+ body.payload?.parentKeyId === BITGO_ROOT_KEY_ID &&
185
+ body.payload?.derivationIndex === index &&
186
+ body.payload?.userGpgPublicKey &&
187
+ body.payload?.userMsg1 &&
188
+ body.payload?.backupGpgPublicKey === undefined &&
189
+ body.payload?.backupMsg1 === undefined)
190
+ .times(times)
191
+ .reply(200, async (uri, requestBody) => {
192
+ const { userGpgPublicKey, userMsg1 } = requestBody.payload;
193
+ userGpgPubKey = { partyId: 0, gpgKey: userGpgPublicKey };
194
+ await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
195
+ p2pMessages: [],
196
+ broadcastMessages: [{ from: 0, payload: { message: userMsg1.message, signature: userMsg1.signature } }],
197
+ }, [userGpgPubKey], []);
198
+ const bitgoMsg1Unsigned = await bitgoPair.initDerive();
199
+ const bitgoMsg2 = bitgoPair.handleIncomingMessages({
200
+ p2pMessages: [],
201
+ broadcastMessages: [{ payload: Buffer.from(userMsg1.message, 'base64'), from: 0 }],
202
+ });
203
+ const signedStagedMessages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
204
+ broadcastMessages: [sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(bitgoMsg2.broadcastMessages[0])],
205
+ p2pMessages: [],
206
+ }, [], [bitgoGpgPrvKey]);
207
+ stagedBitgoMsg2 = signedStagedMessages.broadcastMessages[0].payload;
208
+ const signedMessages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
209
+ broadcastMessages: [sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(bitgoMsg1Unsigned)],
210
+ p2pMessages: [],
211
+ }, [], [bitgoGpgPrvKey]);
212
+ const bitgoMsg1 = signedMessages.broadcastMessages[0];
213
+ assert.ok(bitgoMsg1, 'bitgoMsg1 not found');
214
+ return {
215
+ sessionId: 'testid',
216
+ bitgoMsg1: { from: 2, ...bitgoMsg1.payload },
217
+ };
218
+ });
219
+ }
220
+ async function nockDeriveRound2(bitgoPair, times = 1) {
221
+ return nock(bgUrl)
222
+ .post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R2' &&
223
+ body.safeId === SAFE_ID &&
224
+ body.payload?.sessionId === 'testid' &&
225
+ body.payload?.userMsg2 &&
226
+ body.payload?.backupMsg2 === undefined)
227
+ .times(times)
228
+ .reply(200, async (uri, requestBody) => {
229
+ const { sessionId, userMsg2 } = requestBody.payload;
230
+ await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
231
+ p2pMessages: [],
232
+ broadcastMessages: [{ from: 0, payload: { message: userMsg2.message, signature: userMsg2.signature } }],
233
+ }, [userGpgPubKey], []);
234
+ bitgoPair.handleIncomingMessages({
235
+ p2pMessages: [],
236
+ broadcastMessages: [{ payload: Buffer.from(userMsg2.message, 'base64'), from: 0 }],
237
+ });
238
+ assert.ok(stagedBitgoMsg2, 'staged BitGo msg2 missing');
239
+ return { sessionId, bitgoMsg2: { from: 2, ...stagedBitgoMsg2 } };
240
+ });
241
+ }
242
+ async function nockDeriveRound3(bitgoPair, times = 1) {
243
+ return nock(bgUrl)
244
+ .post('/api/v2/mpc/generatekey', (body) => body.round === 'MPCv2Derive-R3' && body.safeId === SAFE_ID && body.payload?.sessionId === 'testid')
245
+ .times(times)
246
+ .reply(200, async (uri, requestBody) => {
247
+ const { sessionId } = requestBody.payload;
248
+ return {
249
+ sessionId,
250
+ commonKeychain: sdk_lib_mpc_1.DklsTypes.getCommonKeychain(bitgoPair.getKeyShare()),
251
+ };
252
+ });
253
+ }
254
+ async function nockAddChildKey(coin, times = 2, index = DERIVATION_INDEX) {
255
+ return nock('https://bitgo.fakeurl')
256
+ .post(`/api/v2/${coin}/key`, (body) => body.keyType === 'tss' &&
257
+ body.isMPCv2 === true &&
258
+ body.safeId === SAFE_ID &&
259
+ !!body.parent &&
260
+ body.derivedFromParentWithPath === `m/${index}'`)
261
+ .times(times)
262
+ .reply(200, (uri, requestBody) => ({
263
+ id: requestBody.source,
264
+ source: requestBody.source,
265
+ type: requestBody.keyType,
266
+ commonKeychain: requestBody.commonKeychain,
267
+ encryptedPrv: requestBody.encryptedPrv,
268
+ }));
269
+ }
270
+ });
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2VjZHNhVnJmTVBDdjIvY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLDZCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLDhDQUF3RDtBQUN4RCw4Q0FBaUY7QUFDakYsb0RBQTRGO0FBRzVGLCtDQUFpRTtBQUVqRSxNQUFNLE9BQU8sR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFekQsUUFBUSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7SUFDeEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDO0lBQ3hELElBQUksS0FBYSxDQUFDO0lBQ2xCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLFFBQXVDLENBQUM7SUFDNUMsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxXQUVILENBQUM7SUFDRixJQUFJLFNBQTJFLENBQUM7SUFDaEYsSUFBSSxjQUFtRCxDQUFDO0lBQ3hELElBQUksYUFBa0QsQ0FBQztJQUN2RCxJQUFJLGVBQW1FLENBQUM7SUFFeEUsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDdEMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELEtBQUssRUFBRSxXQUFXO1NBQ25CLENBQUMsQ0FBQztRQUNILFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRTtnQkFDSCxjQUFjLEVBQUUsV0FBVyxDQUFDLFNBQVM7Z0JBQ3JDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxTQUFTO2FBQzNDO1NBQ0YsQ0FBQztRQUNGLGNBQWMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVoRSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVoRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNuQyxFQUFFLEVBQUUsa0NBQWtDO1lBQ3RDLFVBQVUsRUFBRSxZQUFZO1lBQ3hCLElBQUksRUFBRSxRQUFRO1lBQ2QsWUFBWSxFQUFFLEVBQUU7WUFDaEIsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxHQUFHLElBQUkscUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLEtBQUs7UUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUM1QixNQUFNLHdDQUF3QyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDO1FBQ0osSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFLEtBQUs7UUFDbkYsTUFBTSxDQUFDLFFBQVEsRUFBRSxBQUFELEVBQUcsU0FBUyxDQUFDLEdBQUcsTUFBTSx1QkFBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkUsTUFBTSxDQUFDLE9BQU8sRUFBRSxBQUFELEVBQUcsUUFBUSxDQUFDLEdBQUcsTUFBTSwwQkFBWSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDM0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhHLE1BQU0sVUFBVSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLHdCQUF3QixDQUFDO1lBQy9FLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFVBQVUsRUFBRSxZQUFZO1lBQ3hCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixlQUFlLEVBQUUsZ0JBQWdCO1lBQ2pDLGFBQWEsRUFBRSxnQkFBZ0I7WUFDL0IsZUFBZSxFQUFFLGtCQUFrQjtZQUNuQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFO1lBQ3hDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUU7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSx1QkFBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEcsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUYsTUFBTSxjQUFjLEdBQUcsSUFBQSxlQUFNLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFLEtBQUs7UUFDOUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxRQUFRLEVBQUUsQUFBRCxFQUFHLFNBQVMsQ0FBQyxHQUFHLE1BQU0sdUJBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQUFBRCxFQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sMEJBQVksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRyxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFM0QsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztZQUMvRSxVQUFVLEVBQUUsTUFBTTtZQUNsQixVQUFVLEVBQUUsWUFBWTtZQUN4QixNQUFNLEVBQUUsT0FBTztZQUNmLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsZUFBZSxFQUFFLEdBQUc7WUFDcEIsYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixlQUFlLEVBQUUsa0JBQWtCO1lBQ25DLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUU7WUFDeEMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRTtTQUMzQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSztRQUMxRSxNQUFNLENBQUMsRUFBRSxBQUFELEVBQUcsU0FBUyxDQUFDLEdBQUcsTUFBTSx1QkFBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDL0QsTUFBTSxDQUFDLEVBQUUsQUFBRCxFQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sMEJBQVksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RyxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyRCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsRUFBRSxDQUNILFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztZQUNoQyxVQUFVLEVBQUUsTUFBTTtZQUNsQixVQUFVLEVBQUUsWUFBWTtZQUN4QixNQUFNLEVBQUUsT0FBTztZQUNmLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsZUFBZSxFQUFFLGdCQUFnQjtZQUNqQyxhQUFhLEVBQUUsZ0JBQWdCO1lBQy9CLGVBQWUsRUFBRSxrQkFBa0I7WUFDbkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRTtTQUM1QyxDQUFDLEVBQ0osaUVBQWlFLENBQ2xFLENBQUM7UUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLG9EQUFvRCxDQUFDLENBQUM7UUFDdEYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxvREFBb0QsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLO1FBQy9ELE1BQU0sQ0FBQyxRQUFRLEVBQUUsQUFBRCxFQUFHLFNBQVMsQ0FBQyxHQUFHLE1BQU0sdUJBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxNQUFNLDBCQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUM3RSxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEcsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckQsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUMsd0JBQXdCLENBQUM7WUFDaEMsVUFBVSxFQUFFLE1BQU07WUFDbEIsVUFBVSxFQUFFLFlBQVk7WUFDeEIsTUFBTSxFQUFFLE9BQU87WUFDZixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLGVBQWUsRUFBRSxnQkFBZ0I7WUFDakMsYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixlQUFlLEVBQUUsa0JBQWtCO1lBQ25DLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUU7WUFDeEMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRTtTQUM3QyxDQUFDLEVBQ0osc0NBQXNDLENBQ3ZDLENBQUM7UUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLHNEQUFzRCxDQUFDLENBQUM7UUFDeEYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsc0RBQXNELENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssVUFBVSx3Q0FBd0MsQ0FDckQsSUFBWSxFQUNaLFlBQW9CLEVBQ3BCLGVBQWtEO1FBRWxELE1BQU0seUJBQXlCLEdBQXNCO1lBQ25ELElBQUksRUFBRSxZQUFZO1lBQ2xCLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUztZQUNwQyxjQUFjLEVBQUUsZUFBZSxDQUFDLFNBQVM7WUFDekMsWUFBWTtTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUM1RyxPQUFPLHlCQUF5QixDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsU0FBeUIsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxnQkFBZ0I7UUFDNUYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2YsSUFBSSxDQUNILHlCQUF5QixFQUN6QixDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0I7WUFDL0IsSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLGlCQUFpQjtZQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsS0FBSyxLQUFLO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCO1lBQzlCLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUTtZQUN0QixJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixLQUFLLFNBQVM7WUFDOUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssU0FBUyxDQUN6QzthQUNBLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDWixLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBa0QsRUFBRSxFQUFFO1lBQzVFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQzNELGFBQWEsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDekQsTUFBTSx1QkFBUyxDQUFDLGdDQUFnQyxDQUM5QztnQkFDRSxXQUFXLEVBQUUsRUFBRTtnQkFDZixpQkFBaUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7YUFDeEcsRUFDRCxDQUFDLGFBQWEsQ0FBQyxFQUNmLEVBQUUsQ0FDSCxDQUFDO1lBRUYsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUM7Z0JBQ2pELFdBQVcsRUFBRSxFQUFFO2dCQUNmLGlCQUFpQixFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNuRixDQUFDLENBQUM7WUFDSCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sdUJBQVMsQ0FBQyw4QkFBOEIsQ0FDekU7Z0JBQ0UsaUJBQWlCLEVBQUUsQ0FBQyx1QkFBUyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixXQUFXLEVBQUUsRUFBRTthQUNoQixFQUNELEVBQUUsRUFDRixDQUFDLGNBQWMsQ0FBQyxDQUNqQixDQUFDO1lBQ0YsZUFBZSxHQUFHLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUVwRSxNQUFNLGNBQWMsR0FBRyxNQUFNLHVCQUFTLENBQUMsOEJBQThCLENBQ25FO2dCQUNFLGlCQUFpQixFQUFFLENBQUMsdUJBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUMzRSxXQUFXLEVBQUUsRUFBRTthQUNoQixFQUNELEVBQUUsRUFDRixDQUFDLGNBQWMsQ0FBQyxDQUNqQixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDNUMsT0FBTztnQkFDTCxTQUFTLEVBQUUsUUFBMEI7Z0JBQ3JDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFO2FBQzdDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsU0FBeUIsRUFBRSxLQUFLLEdBQUcsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDZixJQUFJLENBQ0gseUJBQXlCLEVBQ3pCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsS0FBSyxLQUFLLGdCQUFnQjtZQUMvQixJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87WUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEtBQUssUUFBUTtZQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVE7WUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssU0FBUyxDQUN6QzthQUNBLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDWixLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBa0QsRUFBRSxFQUFFO1lBQzVFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUNwRCxNQUFNLHVCQUFTLENBQUMsZ0NBQWdDLENBQzlDO2dCQUNFLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGlCQUFpQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQzthQUN4RyxFQUNELENBQUMsYUFBYSxDQUFDLEVBQ2YsRUFBRSxDQUNILENBQUM7WUFDRixTQUFTLENBQUMsc0JBQXNCLENBQUM7Z0JBQy9CLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGlCQUFpQixFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNuRixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFNBQXlCLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2YsSUFBSSxDQUNILHlCQUF5QixFQUN6QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsS0FBSyxRQUFRLENBQzdHO2FBQ0EsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNaLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFrRCxFQUFFLEVBQUU7WUFDNUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDMUMsT0FBTztnQkFDTCxTQUFTO2dCQUNULGNBQWMsRUFBRSx1QkFBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBbUI7YUFDdkYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELEtBQUssVUFBVSxlQUFlLENBQUMsSUFBWSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGdCQUFnQjtRQUM5RSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzthQUNqQyxJQUFJLENBQ0gsV0FBVyxJQUFJLE1BQU0sRUFDckIsQ0FBQyxJQUFpRSxFQUFFLEVBQUUsQ0FDcEUsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSTtZQUNyQixJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87WUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ2IsSUFBSSxDQUFDLHlCQUF5QixLQUFLLEtBQUssS0FBSyxHQUFHLENBQ25EO2FBQ0EsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNaLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsV0FBK0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRCxFQUFFLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1lBQzFCLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTztZQUN6QixjQUFjLEVBQUUsV0FBVyxDQUFDLGNBQWM7WUFDMUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO1NBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuXG5pbXBvcnQgeyBUZXN0YWJsZUJHLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBjb21tb24sIEVDRFNBVXRpbHMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNEcnYsIERrbHNUeXBlcywgRGtsc1V0aWxzLCBEa2xzVnJmVXRpbHMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LCBNUEN2MkRlcml2ZVJvdW5kMlJlcXVlc3QsIE1QQ3YyRGVyaXZlUm91bmQzUmVxdWVzdCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgeyBCaXRHbywgQml0Z29HUEdQdWJsaWNLZXkgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMnO1xuXG5jb25zdCBTQUZFX0lEID0gJzZmYTg1MzdlM2VmNWE4NzhmZDNhZTg5OWYzYWI3ZTVhJztcbmNvbnN0IFVTRVJfUk9PVF9LRVlfSUQgPSAncm9vdC11c2VyLWtleS1pZCc7XG5jb25zdCBERVJJVkFUSU9OX0lOREVYID0gMDtcbmNvbnN0IEJJVEdPX1JPT1RfS0VZX0lEID0gJ3Jvb3QtYml0Z28ta2V5LWlkJztcbmNvbnN0IEJBQ0tVUF9ST09UX0tFWV9JRCA9ICdyb290LWJhY2t1cC1rZXktaWQnO1xuY29uc3QgUEFUSF9NMCA9IG5ldyBVaW50OEFycmF5KFsweDgwLCAweDAwLCAweDAwLCAweDAwXSk7XG5cbmRlc2NyaWJlKCdUU1MgRUNEU0Egc2FmZSBjaGlsZCBrZXljaGFpbnMgKHVzZXIvQml0R28gaGFyZCBkZXJpdmUpOicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnaHRldGgnO1xuICBjb25zdCBlbnRlcnByaXNlSWQgPSAnNjQ0OTE1M2E2ZjZiYzIwMDA2ZDY2NzcxY2RiZTE1ZDMnO1xuICBsZXQgYmdVcmw6IHN0cmluZztcbiAgbGV0IGJpdGdvOiBUZXN0YWJsZUJHICYgQml0R287XG4gIGxldCB0c3NVdGlsczogRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHM7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IGJpdEdvR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gJiB7XG4gICAgcmV2b2NhdGlvbkNlcnRpZmljYXRlOiBzdHJpbmc7XG4gIH07XG4gIGxldCBjb25zdGFudHM6IHsgbXBjOiB7IGJpdGdvUHVibGljS2V5OiBzdHJpbmc7IGJpdGdvTVBDdjJQdWJsaWNLZXk6IHN0cmluZyB9IH07XG4gIGxldCBiaXRnb0dwZ1BydktleTogeyBwYXJ0eUlkOiBudW1iZXI7IGdwZ0tleTogc3RyaW5nIH07XG4gIGxldCB1c2VyR3BnUHViS2V5OiB7IHBhcnR5SWQ6IG51bWJlcjsgZ3BnS2V5OiBzdHJpbmcgfTtcbiAgbGV0IHN0YWdlZEJpdGdvTXNnMjogeyBtZXNzYWdlOiBzdHJpbmc7IHNpZ25hdHVyZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBvcGVucGdwLmNvbmZpZy5yZWplY3RDdXJ2ZXMgPSBuZXcgU2V0KCk7XG4gICAgYml0R29HcGdLZXkgPSBhd2FpdCBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgIHVzZXJJRHM6IFt7IG5hbWU6ICdiaXRnbycsIGVtYWlsOiAnYml0Z29AdGVzdC5jb20nIH1dLFxuICAgICAgY3VydmU6ICdzZWNwMjU2azEnLFxuICAgIH0pO1xuICAgIGNvbnN0YW50cyA9IHtcbiAgICAgIG1wYzoge1xuICAgICAgICBiaXRnb1B1YmxpY0tleTogYml0R29HcGdLZXkucHVibGljS2V5LFxuICAgICAgICBiaXRnb01QQ3YyUHVibGljS2V5OiBiaXRHb0dwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgIH07XG4gICAgYml0Z29HcGdQcnZLZXkgPSB7IHBhcnR5SWQ6IDIsIGdwZ0tleTogYml0R29HcGdLZXkucHJpdmF0ZUtleSB9O1xuXG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWUpO1xuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2VDb2luLCB7XG4gICAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgIGNvaW46IGNvaW5OYW1lLFxuICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgfSk7XG4gICAgdHNzVXRpbHMgPSBuZXcgRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgc3RhZ2VkQml0Z29Nc2cyID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IG5vY2tHZXRCaXRnb1B1YmxpY0tleUJhc2VkT25GZWF0dXJlRmxhZ3MoY29pbk5hbWUsIGVudGVycHJpc2VJZCwgYml0R29HcGdLZXkpO1xuICAgIG5vY2soYmdVcmwpLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJykudGltZXMoMzIpLnJlcGx5KDIwMCwgeyB0dGw6IDM2MDAsIGNvbnN0YW50cyB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdGhlIHVzZXIgY2hpbGQgYW5kIHJlZ2lzdGVyIHRoZSBiYWNrdXAgd2l0aG91dCBlbmNyeXB0ZWRQcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG4gICAgY29uc3QgYWRkS2V5Tm9jayA9IGF3YWl0IG5vY2tBZGRDaGlsZEtleShjb2luTmFtZSwgMik7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiAndGVzdCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICBwYXJlbnRLZXlJZDogQklUR09fUk9PVF9LRVlfSUQsXG4gICAgICBkZXJpdmF0aW9uSW5kZXg6IERFUklWQVRJT05fSU5ERVgsXG4gICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlcktleWNoYWluLmNvbW1vbktleWNoYWluLCBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJQcnYgPSB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhlbmNyeXB0ZWRVc2VyUHJ2KTtcbiAgICBhc3NlcnQuZXF1YWwoYmFja3VwS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlY3J5cHRlZFVzZXJQcnYgPSBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFVzZXJQcnYsIHBhc3N3b3JkOiAndGVzdCcgfSk7XG4gICAgY29uc3QgdXNlckNoaWxkU2hhcmUgPSBkZWNvZGUoQnVmZmVyLmZyb20oZGVjcnlwdGVkVXNlclBydiwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwodXNlckNoaWxkU2hhcmUudnJmLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyQ2hpbGRTaGFyZS5wYXJ0eV9pZCwgMCk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJDaGlsZFNoYXJlLnNfaSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIGF0IGEgbm9uLXplcm8gaGFyZGVuZWQgaW5kZXggYW5kIGFncmVlIHdpdGggdGhlIHNlcnZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpZHggPSA3O1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVWludDhBcnJheShbMHg4MCB8IChpZHggPj4+IDI0KSwgMCwgMCwgaWR4XSk7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIHBhdGgpO1xuXG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyLCAxLCBpZHgpO1xuICAgIGNvbnN0IHJvdW5kMk5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQzTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDMoYml0Z29QYWlyKTtcbiAgICBjb25zdCBhZGRLZXlOb2NrID0gYXdhaXQgbm9ja0FkZENoaWxkS2V5KGNvaW5OYW1lLCAyLCBpZHgpO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluIH0gPSBhd2FpdCB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZUlkLFxuICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgZGVyaXZhdGlvbkluZGV4OiBpZHgsXG4gICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBCQUNLVVBfUk9PVF9LRVlfSUQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdC5nZXRLZXlTaGFyZSgpLFxuICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmVXNlci5nZXRLZXlTaGFyZSgpLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKHJvdW5kMU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5vayhyb3VuZDJOb2NrLmlzRG9uZSgpKTtcbiAgICBhc3NlcnQub2socm91bmQzTm9jay5pc0RvbmUoKSk7XG4gICAgYXNzZXJ0Lm9rKGFkZEtleU5vY2suaXNEb25lKCkpO1xuICAgIGFzc2VydC5lcXVhbCh1c2VyS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3Qgcm9vdCBrZXkgbWF0ZXJpYWwgdGhhdCBpcyBub3QgYSB2YWxpZCBWUkYgZW52ZWxvcGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgWywgLCBiaXRnb1Jvb3RdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgWywgLCB2cmZCaXRnb10gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBiaXRnb1BhaXIgPSBuZXcgRGtsc0Rydi5EZXJpdmUoMywgMiwgMiwgYml0Z29Sb290LmdldEtleVNoYXJlKCksIHZyZkJpdGdvLmdldEtleVNoYXJlKCksIFBBVEhfTTApO1xuICAgIGNvbnN0IHJvdW5kMU5vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQxKGJpdGdvUGFpcik7XG4gICAgY29uc3Qgcm91bmQyTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDIoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDNOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMyhiaXRnb1BhaXIpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICB0c3NVdGlscy5jcmVhdGVTYWZlQ2hpbGRLZXljaGFpbnMoe1xuICAgICAgICAgIHBhc3NwaHJhc2U6ICd0ZXN0JyxcbiAgICAgICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICAgIHBhcmVudEtleUlkOiBCSVRHT19ST09UX0tFWV9JRCxcbiAgICAgICAgICBkZXJpdmF0aW9uSW5kZXg6IERFUklWQVRJT05fSU5ERVgsXG4gICAgICAgICAgdXNlclJvb3RLZXlJZDogVVNFUl9ST09UX0tFWV9JRCxcbiAgICAgICAgICBiYWNrdXBSb290S2V5SWQ6IEJBQ0tVUF9ST09UX0tFWV9JRCxcbiAgICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiBCdWZmZXIuZnJvbSgnZ2FyYmFnZScpLFxuICAgICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHZyZkJpdGdvLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL0NCT1IgZGVjb2RlfGRvZXMgbm90IG1hdGNoIHJvb3Qga2V5IHNoYXJlIHBhcnR5SWR8VlJGIGtleXNoYXJlL2lcbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgaW52YWxpZCByb290IG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDJOb2NrLmlzRG9uZSgpLCAncm91bmQgMiBtdXN0IG5vdCBiZSBzZW50IGZvciBpbnZhbGlkIHJvb3QgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kM05vY2suaXNEb25lKCksICdyb3VuZCAzIG11c3Qgbm90IGJlIHNlbnQgZm9yIGludmFsaWQgcm9vdCBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCBhIHJvb3QgYmxvYiB3aXRoIGEgVlJGIHBhcnR5SWQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgW3VzZXJSb290LCAsIGJpdGdvUm9vdF0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbLCB2cmZCYWNrdXAsIHZyZkJpdGdvXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IGJpdGdvUGFpciA9IG5ldyBEa2xzRHJ2LkRlcml2ZSgzLCAyLCAyLCBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSwgdnJmQml0Z28uZ2V0S2V5U2hhcmUoKSwgUEFUSF9NMCk7XG4gICAgY29uc3Qgcm91bmQxTm9jayA9IGF3YWl0IG5vY2tEZXJpdmVSb3VuZDEoYml0Z29QYWlyKTtcbiAgICBjb25zdCByb3VuZDJOb2NrID0gYXdhaXQgbm9ja0Rlcml2ZVJvdW5kMihiaXRnb1BhaXIpO1xuICAgIGNvbnN0IHJvdW5kM05vY2sgPSBhd2FpdCBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+XG4gICAgICAgIHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgICAgcGFzc3BocmFzZTogJ3Rlc3QnLFxuICAgICAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICAgICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICAgICAgcGFyZW50S2V5SWQ6IEJJVEdPX1JPT1RfS0VZX0lELFxuICAgICAgICAgIGRlcml2YXRpb25JbmRleDogREVSSVZBVElPTl9JTkRFWCxcbiAgICAgICAgICB1c2VyUm9vdEtleUlkOiBVU0VSX1JPT1RfS0VZX0lELFxuICAgICAgICAgIGJhY2t1cFJvb3RLZXlJZDogQkFDS1VQX1JPT1RfS0VZX0lELFxuICAgICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJSb290LmdldEtleVNoYXJlKCksXG4gICAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdnJmQmFja3VwLmdldEtleVNoYXJlKCksXG4gICAgICAgIH0pLFxuICAgICAgL2RvZXMgbm90IG1hdGNoIFZSRiBrZXkgc2hhcmUgcGFydHlJZC9cbiAgICApO1xuICAgIGFzc2VydC5vayghcm91bmQxTm9jay5pc0RvbmUoKSwgJ3JvdW5kIDEgbXVzdCBub3QgYmUgc2VudCBmb3IgbWlzbWF0Y2hlZCBWUkYgbWF0ZXJpYWwnKTtcbiAgICBhc3NlcnQub2soIXJvdW5kMk5vY2suaXNEb25lKCksICdyb3VuZCAyIG11c3Qgbm90IGJlIHNlbnQgZm9yIG1pc21hdGNoZWQgVlJGIG1hdGVyaWFsJyk7XG4gICAgYXNzZXJ0Lm9rKCFyb3VuZDNOb2NrLmlzRG9uZSgpLCAncm91bmQgMyBtdXN0IG5vdCBiZSBzZW50IGZvciBtaXNtYXRjaGVkIFZSRiBtYXRlcmlhbCcpO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBub2NrR2V0Qml0Z29QdWJsaWNLZXlCYXNlZE9uRmVhdHVyZUZsYWdzKFxuICAgIGNvaW46IHN0cmluZyxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICBiaXRnb0dwZ0tleVBhaXI6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICApOiBQcm9taXNlPEJpdGdvR1BHUHVibGljS2V5PiB7XG4gICAgY29uc3QgYml0Z29HUEdQdWJsaWNLZXlSZXNwb25zZTogQml0Z29HUEdQdWJsaWNLZXkgPSB7XG4gICAgICBuYW1lOiAnaXJyZWxldmFudCcsXG4gICAgICBwdWJsaWNLZXk6IGJpdGdvR3BnS2V5UGFpci5wdWJsaWNLZXksXG4gICAgICBtcGN2MlB1YmxpY0tleTogYml0Z29HcGdLZXlQYWlyLnB1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2VJZCxcbiAgICB9O1xuICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke2NvaW59L3Rzcy9wdWJrZXlgKS5xdWVyeSh7IGVudGVycHJpc2VJZCB9KS5yZXBseSgyMDAsIGJpdGdvR1BHUHVibGljS2V5UmVzcG9uc2UpO1xuICAgIHJldHVybiBiaXRnb0dQR1B1YmxpY0tleVJlc3BvbnNlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbm9ja0Rlcml2ZVJvdW5kMShiaXRnb1BhaXI6IERrbHNEcnYuRGVyaXZlLCB0aW1lcyA9IDEsIGluZGV4ID0gREVSSVZBVElPTl9JTkRFWCkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PlxuICAgICAgICAgIGJvZHkucm91bmQgPT09ICdNUEN2MkRlcml2ZS1SMScgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8ucGFyZW50S2V5SWQgPT09IEJJVEdPX1JPT1RfS0VZX0lEICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy5kZXJpdmF0aW9uSW5kZXggPT09IGluZGV4ICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyR3BnUHVibGljS2V5ICYmXG4gICAgICAgICAgYm9keS5wYXlsb2FkPy51c2VyTXNnMSAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uYmFja3VwR3BnUHVibGljS2V5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzEgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VyR3BnUHVibGljS2V5LCB1c2VyTXNnMSB9ID0gcmVxdWVzdEJvZHkucGF5bG9hZDtcbiAgICAgICAgdXNlckdwZ1B1YktleSA9IHsgcGFydHlJZDogMCwgZ3BnS2V5OiB1c2VyR3BnUHVibGljS2V5IH07XG4gICAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgZnJvbTogMCwgcGF5bG9hZDogeyBtZXNzYWdlOiB1c2VyTXNnMS5tZXNzYWdlLCBzaWduYXR1cmU6IHVzZXJNc2cxLnNpZ25hdHVyZSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW3VzZXJHcGdQdWJLZXldLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYml0Z29Nc2cxVW5zaWduZWQgPSBhd2FpdCBiaXRnb1BhaXIuaW5pdERlcml2ZSgpO1xuICAgICAgICBjb25zdCBiaXRnb01zZzIgPSBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMS5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaWduZWRTdGFnZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0pXSxcbiAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIFtiaXRnb0dwZ1BydktleV1cbiAgICAgICAgKTtcbiAgICAgICAgc3RhZ2VkQml0Z29Nc2cyID0gc2lnbmVkU3RhZ2VkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZDtcblxuICAgICAgICBjb25zdCBzaWduZWRNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzFVbnNpZ25lZCldLFxuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW10sXG4gICAgICAgICAgW2JpdGdvR3BnUHJ2S2V5XVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBiaXRnb01zZzEgPSBzaWduZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXTtcbiAgICAgICAgYXNzZXJ0Lm9rKGJpdGdvTXNnMSwgJ2JpdGdvTXNnMSBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6ICd0ZXN0aWQnIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICAgIGJpdGdvTXNnMTogeyBmcm9tOiAyLCAuLi5iaXRnb01zZzEucGF5bG9hZCB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQyKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PlxuICAgICAgICAgIGJvZHkucm91bmQgPT09ICdNUEN2MkRlcml2ZS1SMicgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJyAmJlxuICAgICAgICAgIGJvZHkucGF5bG9hZD8udXNlck1zZzIgJiZcbiAgICAgICAgICBib2R5LnBheWxvYWQ/LmJhY2t1cE1zZzIgPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHVzZXJNc2cyIH0gPSByZXF1ZXN0Qm9keS5wYXlsb2FkO1xuICAgICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IGZyb206IDAsIHBheWxvYWQ6IHsgbWVzc2FnZTogdXNlck1zZzIubWVzc2FnZSwgc2lnbmF0dXJlOiB1c2VyTXNnMi5zaWduYXR1cmUgfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1c2VyR3BnUHViS2V5XSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICBiaXRnb1BhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMi5tZXNzYWdlLCAnYmFzZTY0JyksIGZyb206IDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQub2soc3RhZ2VkQml0Z29Nc2cyLCAnc3RhZ2VkIEJpdEdvIG1zZzIgbWlzc2luZycpO1xuICAgICAgICByZXR1cm4geyBzZXNzaW9uSWQsIGJpdGdvTXNnMjogeyBmcm9tOiAyLCAuLi5zdGFnZWRCaXRnb01zZzIgfSB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrRGVyaXZlUm91bmQzKGJpdGdvUGFpcjogRGtsc0Rydi5EZXJpdmUsIHRpbWVzID0gMSkge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoXG4gICAgICAgICcvYXBpL3YyL21wYy9nZW5lcmF0ZWtleScsXG4gICAgICAgIChib2R5KSA9PiBib2R5LnJvdW5kID09PSAnTVBDdjJEZXJpdmUtUjMnICYmIGJvZHkuc2FmZUlkID09PSBTQUZFX0lEICYmIGJvZHkucGF5bG9hZD8uc2Vzc2lvbklkID09PSAndGVzdGlkJ1xuICAgICAgKVxuICAgICAgLnRpbWVzKHRpbWVzKVxuICAgICAgLnJlcGx5KDIwMCwgYXN5bmMgKHVyaSwgcmVxdWVzdEJvZHk6IHsgcGF5bG9hZDogTVBDdjJEZXJpdmVSb3VuZDNSZXF1ZXN0IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IHJlcXVlc3RCb2R5LnBheWxvYWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOiBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYml0Z29QYWlyLmdldEtleVNoYXJlKCkpIGFzIE5vbkVtcHR5U3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBub2NrQWRkQ2hpbGRLZXkoY29pbjogc3RyaW5nLCB0aW1lcyA9IDIsIGluZGV4ID0gREVSSVZBVElPTl9JTkRFWCkge1xuICAgIHJldHVybiBub2NrKCdodHRwczovL2JpdGdvLmZha2V1cmwnKVxuICAgICAgLnBvc3QoXG4gICAgICAgIGAvYXBpL3YyLyR7Y29pbn0va2V5YCxcbiAgICAgICAgKGJvZHk6IEFkZEtleWNoYWluT3B0aW9ucyAmIHsgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aD86IHN0cmluZyB9KSA9PlxuICAgICAgICAgIGJvZHkua2V5VHlwZSA9PT0gJ3RzcycgJiZcbiAgICAgICAgICBib2R5LmlzTVBDdjIgPT09IHRydWUgJiZcbiAgICAgICAgICBib2R5LnNhZmVJZCA9PT0gU0FGRV9JRCAmJlxuICAgICAgICAgICEhYm9keS5wYXJlbnQgJiZcbiAgICAgICAgICBib2R5LmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggPT09IGBtLyR7aW5kZXh9J2BcbiAgICAgIClcbiAgICAgIC50aW1lcyh0aW1lcylcbiAgICAgIC5yZXBseSgyMDAsICh1cmksIHJlcXVlc3RCb2R5OiBBZGRLZXljaGFpbk9wdGlvbnMpID0+ICh7XG4gICAgICAgIGlkOiByZXF1ZXN0Qm9keS5zb3VyY2UsXG4gICAgICAgIHNvdXJjZTogcmVxdWVzdEJvZHkuc291cmNlLFxuICAgICAgICB0eXBlOiByZXF1ZXN0Qm9keS5rZXlUeXBlLFxuICAgICAgICBjb21tb25LZXljaGFpbjogcmVxdWVzdEJvZHkuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGVuY3J5cHRlZFBydjogcmVxdWVzdEJvZHkuZW5jcnlwdGVkUHJ2LFxuICAgICAgfSkpO1xuICB9XG59KTtcbiJdfQ==
@@ -98,6 +98,30 @@ describe('Staking Wallet Common', function () {
98
98
  stakingRequest.should.deepEqual(expected);
99
99
  msScope.isDone().should.be.True();
100
100
  });
101
+ it('should preserve existing staking subtypes in the request payload', async function () {
102
+ const expected = stakingWallet_1.default.stakingRequest([stakingWallet_1.default.transaction('NEW')]);
103
+ const msScope = nock(microservicesUri)
104
+ .post(`/api/staking/v1/${stakingWallet.coin}/wallets/${stakingWallet.walletId}/requests`, {
105
+ amount: '1',
106
+ clientId: 'clientId',
107
+ subType: 'ETH_STAKE_PECTRA',
108
+ type: 'STAKE',
109
+ })
110
+ .reply(201, expected);
111
+ const stakingRequest = await stakingWallet.stake({
112
+ amount: '1',
113
+ clientId: 'clientId',
114
+ subType: 'ETH_STAKE_PECTRA',
115
+ });
116
+ should.exist(stakingRequest);
117
+ stakingRequest.should.deepEqual(expected);
118
+ msScope.isDone().should.be.True();
119
+ });
120
+ it('should reject incomplete pox5-bond options before making a request', async function () {
121
+ await stakingWallet
122
+ .stake({ subType: 'pox5-bond' })
123
+ .should.be.rejectedWith('bondIndex is required for pox5-bond staking');
124
+ });
101
125
  });
102
126
  describe('unstake', function () {
103
127
  it('should call staking-service to unstake', async function () {
@@ -316,4 +340,4 @@ describe('Staking Wallet Common', function () {
316
340
  });
317
341
  });
318
342
  });
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldENvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXRDb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsaUNBQWtDO0FBQ2xDLHdFQUE0RDtBQUU1RCw4Q0FBNEc7QUFDNUcsOENBQTRDO0FBQzVDLHlDQUF3QztBQUN4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE0QixDQUFDO0lBRWpDLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFTLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsTUFBTSxVQUFVLEdBQUc7WUFDakIsRUFBRSxFQUFFLFVBQVU7WUFDZCxJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztTQUNuQyxDQUFDO1FBQ0YsTUFBTSxN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QUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWpGLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHNob3VsZCA9IHJlcXVpcmUoJ3Nob3VsZCcpO1xuaW1wb3J0IGZpeHR1cmVzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3N0YWtpbmcvc3Rha2luZ1dhbGxldCc7XG5cbmltcG9ydCB7IEVudGVycHJpc2UsIEVudmlyb25tZW50cywgU3Rha2luZ1JlcXVlc3QsIFN0YWtpbmdXYWxsZXQsIFRzc1V0aWxzLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcblxuZGVzY3JpYmUoJ1N0YWtpbmcgV2FsbGV0IENvbW1vbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbWljcm9zZXJ2aWNlc1VyaSA9IEVudmlyb25tZW50c1snbW9jayddLnVyaTtcbiAgbGV0IGJpdGdvO1xuICBsZXQgYmFzZUNvaW47XG4gIGxldCBlbnRlcnByaXNlO1xuICBsZXQgc3Rha2luZ1dhbGxldDogU3Rha2luZ1dhbGxldDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpIH0gYXMgYW55KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlQ29pbiA9IGJpdGdvLmNvaW4oJ2V0aCcpO1xuICAgIGJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgYmFzZUNvaW4sIHsgaWQ6ICc1Y2Y5NDA5NDk0NDk0MTJkMDBmNTNiM2Q5MmRiY2FhMycsIG5hbWU6ICdUZXN0IEVudGVycHJpc2UnIH0pO1xuICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3dhbGxldElkJyxcbiAgICAgIGNvaW46ICdldGgnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZS5pZCxcbiAgICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1J10sXG4gICAgfTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgc3Rha2luZ1dhbGxldCA9IHdhbGxldC50b1N0YWtpbmdXYWxsZXQoKTtcbiAgfSk7XG5cbiAgY29uc3Qgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gudmVyaWZ5QW5kUmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBzdGFrZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBzdGFrZSB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnU1RBS0UnLFxuICAgICAgICAgIHZhbGlkYXRvcjogJzEyMycsXG4gICAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgdmFsaWRhdG9yOiAnMTIzJyxcbiAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5zdGFrZShvcHRpb25zKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlIHdpdGggb3B0aW9uYWwgc3Rha2VNYW55IHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnU1RBS0UnLFxuICAgICAgICAgIGRlbGVnYXRpb25SZXF1ZXN0czogW1xuICAgICAgICAgICAgeyBhbW91bnQ6ICcxJywgdmFsaWRhdG9yOiAnMTIzJyB9LFxuICAgICAgICAgICAgeyBhbW91bnQ6ICcyJywgdmFsaWRhdG9yOiAnNDU2JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZHVyYXRpb25TZWNvbmRzOiAnNjAnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICBkZWxlZ2F0aW9uUmVxdWVzdHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEnLCB2YWxpZGF0b3I6ICcxMjMnIH0sXG4gICAgICAgICAgeyBhbW91bnQ6ICcyJywgdmFsaWRhdG9yOiAnNDU2JyB9LFxuICAgICAgICBdLFxuICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKG9wdGlvbnMpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vuc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byB1bnN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1VOU1RBS0UnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC51bnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3dpdGNoIHZhbGlkYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN3aXRjaCB2YWxpZGF0b3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgICAgIHR5cGU6ICdTV0lUQ0hfVkFMSURBVE9SJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3dpdGNoVmFsaWRhdG9yKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICBkZWxlZ2F0aW9uSWQ6ICdkZWxlZ2F0aW9uJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NsYWltIHJld2FyZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjbGFpbSByZXdhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgZGVsZWdhdGlvbklkOiAnZGVsZWdhdGlvbicsXG4gICAgICAgICAgdHlwZTogJ0NMQUlNX1JFV0FSRFMnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5jbGFpbVJld2FyZHMoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FuY2VsU3Rha2luZ1JlcXVlc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjYW5jZWwgc3Rha2luZyByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICAgIC4uLmZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignUkVKRUNURUQnKV0pLFxuICAgICAgICBzdGF0dXM6ICdSRUpFQ1RFRCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmRlbGV0ZShgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmNhbmNlbFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFN0YWtpbmdSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gZ2V0IHN0YWtpbmcgcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG1vY2tHZXRTdGFraW5nUmVxdWVzdChzdGFraW5nUmVxdWVzdElkOiBzdHJpbmcsIGV4cGVjdGVkOiBTdGFraW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGxTaWduaW5nQ29tcGxldGUgZmFsc2Ugd2hlbiBubyB0cmFuc2FjdGlvbnMgZXhpc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdElkID0gJzg2MzgyODRhLWRhYjItNDZiOS1iMDdmLTIxMTA5YTZlNzIyMCc7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtdKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSB0cnVlIGFuZCAwIHRyYW5zYWN0aW9ucyB3aGVuIG9ubHkgYSBDT05GSVJNRUQgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ0NPTkZJUk1FRCcpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24gPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24pO1xuICAgICAgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24uYWxsU2lnbmluZ0NvbXBsZXRlLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMCB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgTkVXIHRyYW5zYWN0aW9uIGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmNvbnRhaW5FcWwoZXhwZWN0ZWRUcmFuc2FjdGlvbik7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbiB3aGVuIE5FVyBhbmQgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uLCBmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRUcmFuc2FjdGlvbnNSZWFkeVRvU2lnbihzdGFraW5nUmVxdWVzdElkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLmFsbFNpZ25pbmdDb21wbGV0ZS5zaG91bGQuYmUuRmFsc2UoKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLnRyYW5zYWN0aW9ucy5zaG91bGQuY29udGFpbkVxbChleHBlY3RlZFRyYW5zYWN0aW9uKTtcblxuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIHNlbGYtbWFuYWdlZCBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcywgZmFsc2UpO1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0cy8ke3RyYW5zYWN0aW9uLnN0YWtpbmdSZXF1ZXN0SWR9L3RyYW5zYWN0aW9ucy8ke3RyYW5zYWN0aW9uLmlkfWBcbiAgICAgICAgKVxuICAgICAgICAucXVlcnkoeyBleHBhbmRCdWlsZFBhcmFtczogdHJ1ZSB9KVxuICAgICAgICAucmVwbHkoMjAwLCB0cmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZVNpZ25hdHVyZVNoYXJlcyA9IHNhbmRib3guc3R1YihUc3NVdGlscy5wcm90b3R5cGUsICdkZWxldGVTaWduYXR1cmVTaGFyZXMnKTtcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3ByZWJ1aWxkVHJhbnNhY3Rpb24nKTtcbiAgICAgIGNvbnN0IGJ1aWxkID0gc2FuZGJveC5zdHViKFN0YWtpbmdXYWxsZXQucHJvdG90eXBlLCAnYnVpbGQnKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHdhbGxldElkOiBzdGFraW5nV2FsbGV0LndhbGxldElkLFxuICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0Lm5vdENhbGxlZChkZWxldGVTaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQud2FsbGV0LnByZWJ1aWxkVHJhbnNhY3Rpb24oZm9ybWF0dGVkUGFyYW1zKTtcbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJlYnVpbGQgc2VsZi1tYW5hZ2VkIHN0YWtpbmcgdHJhbnNhY3Rpb24gLSBubyBidWlsZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgZGVsZXRlU2lnbmF0dXJlU2hhcmVzID0gc2FuZGJveC5zdHViKFRzc1V0aWxzLnByb3RvdHlwZSwgJ2RlbGV0ZVNpZ25hdHVyZVNoYXJlcycpO1xuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgYnVpbGQgPSBzYW5kYm94LnN0dWIoU3Rha2luZ1dhbGxldC5wcm90b3R5cGUsICdidWlsZCcpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgd2FsbGV0SWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0SWQsXG4gICAgICAgIHR4SGV4OiAnaGV4JyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UoZGVsZXRlU2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBzdGFraW5nV2FsbGV0LndhbGxldC5wcmVidWlsZFRyYW5zYWN0aW9uKGZvcm1hdHRlZFBhcmFtcyk7XG5cbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldENvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXRDb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsaUNBQWtDO0FBQ2xDLHdFQUE0RDtBQUU1RCw4Q0FBNEc7QUFDNUcsOENBQTRDO0FBQzVDLHlDQUF3QztBQUN4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE0QixDQUFDO0lBRWpDLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFTLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsVUFBVSxHQUFHLElBQUkscUJBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEgsTUFBTSxVQUFVLEdBQUc7WUFDakIsRUFBRSxFQUFFLFVBQVU7WUFDZCxJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztTQUNuQyxDQUFDO1FBQ0YsTUFBTSxN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QU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUVqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFakYsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgc2hvdWxkID0gcmVxdWlyZSgnc2hvdWxkJyk7XG5pbXBvcnQgZml4dHVyZXMgZnJvbSAnLi4vLi4vZml4dHVyZXMvc3Rha2luZy9zdGFraW5nV2FsbGV0JztcblxuaW1wb3J0IHsgRW50ZXJwcmlzZSwgRW52aXJvbm1lbnRzLCBTdGFraW5nUmVxdWVzdCwgU3Rha2luZ1dhbGxldCwgVHNzVXRpbHMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnU3Rha2luZyBXYWxsZXQgQ29tbW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBtaWNyb3NlcnZpY2VzVXJpID0gRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICBsZXQgYml0Z287XG4gIGxldCBiYXNlQ29pbjtcbiAgbGV0IGVudGVycHJpc2U7XG4gIGxldCBzdGFraW5nV2FsbGV0OiBTdGFraW5nV2FsbGV0O1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmkgfSBhcyBhbnkpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2VDb2luID0gYml0Z28uY29pbignZXRoJyk7XG4gICAgYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgZW50ZXJwcmlzZSA9IG5ldyBFbnRlcnByaXNlKGJpdGdvLCBiYXNlQ29pbiwgeyBpZDogJzVjZjk0MDk0OTQ0OTQxMmQwMGY1M2IzZDkyZGJjYWEzJywgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScgfSk7XG4gICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnd2FsbGV0SWQnLFxuICAgICAgY29pbjogJ2V0aCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLmlkLFxuICAgICAga2V5czogWyc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUnXSxcbiAgICB9O1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2VDb2luLCB3YWxsZXREYXRhKTtcbiAgICBzdGFraW5nV2FsbGV0ID0gd2FsbGV0LnRvU3Rha2luZ1dhbGxldCgpO1xuICB9KTtcblxuICBjb25zdCBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFrZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHN0YWtpbmdSZXF1ZXN0KTtcblxuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN0YWtlIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgICAgdmFsaWRhdG9yOiAnMTIzJyxcbiAgICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICcxMjMnLFxuICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LnN0YWtlKG9wdGlvbnMpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gc3Rha2Ugd2l0aCBvcHRpb25hbCBzdGFrZU1hbnkgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzYCwge1xuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdTVEFLRScsXG4gICAgICAgICAgZGVsZWdhdGlvblJlcXVlc3RzOiBbXG4gICAgICAgICAgICB7IGFtb3VudDogJzEnLCB2YWxpZGF0b3I6ICcxMjMnIH0sXG4gICAgICAgICAgICB7IGFtb3VudDogJzInLCB2YWxpZGF0b3I6ICc0NTYnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkdXJhdGlvblNlY29uZHM6ICc2MCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDEsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25SZXF1ZXN0czogW1xuICAgICAgICAgIHsgYW1vdW50OiAnMScsIHZhbGlkYXRvcjogJzEyMycgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzInLCB2YWxpZGF0b3I6ICc0NTYnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGR1cmF0aW9uU2Vjb25kczogJzYwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uob3B0aW9ucyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBleGlzdGluZyBzdGFraW5nIHN1YnR5cGVzIGluIHRoZSByZXF1ZXN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICBzdWJUeXBlOiAnRVRIX1NUQUtFX1BFQ1RSQScsXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIHN1YlR5cGU6ICdFVEhfU1RBS0VfUEVDVFJBJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuICAgICAgc3Rha2luZ1JlcXVlc3Quc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZCk7XG4gICAgICBtc1Njb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbmNvbXBsZXRlIHBveDUtYm9uZCBvcHRpb25zIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc3Rha2luZ1dhbGxldFxuICAgICAgICAuc3Rha2UoeyBzdWJUeXBlOiAncG94NS1ib25kJyB9IGFzIGFueSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2JvbmRJbmRleCBpcyByZXF1aXJlZCBmb3IgcG94NS1ib25kIHN0YWtpbmcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vuc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byB1bnN0YWtlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgdHlwZTogJ1VOU1RBS0UnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC51bnN0YWtlKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3dpdGNoIHZhbGlkYXRvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3Rha2luZy1zZXJ2aWNlIHRvIHN3aXRjaCB2YWxpZGF0b3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0c2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgICAgIHR5cGU6ICdTV0lUQ0hfVkFMSURBVE9SJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3dpdGNoVmFsaWRhdG9yKHtcbiAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICB2YWxpZGF0b3I6ICd2YWxpZGF0b3InLFxuICAgICAgICBkZWxlZ2F0aW9uSWQ6ICdkZWxlZ2F0aW9uJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NsYWltIHJld2FyZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjbGFpbSByZXdhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHNgLCB7XG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgICAgZGVsZWdhdGlvbklkOiAnZGVsZWdhdGlvbicsXG4gICAgICAgICAgdHlwZTogJ0NMQUlNX1JFV0FSRFMnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5jbGFpbVJld2FyZHMoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIGRlbGVnYXRpb25JZDogJ2RlbGVnYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIHN0YWtpbmdSZXF1ZXN0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2FuY2VsU3Rha2luZ1JlcXVlc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHN0YWtpbmctc2VydmljZSB0byBjYW5jZWwgc3Rha2luZyByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICAgIC4uLmZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtmaXh0dXJlcy50cmFuc2FjdGlvbignUkVKRUNURUQnKV0pLFxuICAgICAgICBzdGF0dXM6ICdSRUpFQ1RFRCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmRlbGV0ZShgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmNhbmNlbFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFN0YWtpbmdSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzdGFraW5nLXNlcnZpY2UgdG8gZ2V0IHN0YWtpbmcgcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gZml4dHVyZXMuc3Rha2luZ1JlcXVlc3QoW2ZpeHR1cmVzLnRyYW5zYWN0aW9uKCdORVcnKV0pO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3QgPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG1vY2tHZXRTdGFraW5nUmVxdWVzdChzdGFraW5nUmVxdWVzdElkOiBzdHJpbmcsIGV4cGVjdGVkOiBTdGFraW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChgL2FwaS9zdGFraW5nL3YxLyR7c3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7c3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHtzdGFraW5nUmVxdWVzdElkfWApXG4gICAgICAgIC5yZXBseSgyMDAsIGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGxTaWduaW5nQ29tcGxldGUgZmFsc2Ugd2hlbiBubyB0cmFuc2FjdGlvbnMgZXhpc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdElkID0gJzg2MzgyODRhLWRhYjItNDZiOS1iMDdmLTIxMTA5YTZlNzIyMCc7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtdKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSB0cnVlIGFuZCAwIHRyYW5zYWN0aW9ucyB3aGVuIG9ubHkgYSBDT05GSVJNRUQgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ0NPTkZJUk1FRCcpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24gPSBhd2FpdCBzdGFraW5nV2FsbGV0LmdldFRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24pO1xuICAgICAgdHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24uYWxsU2lnbmluZ0NvbXBsZXRlLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMCB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgTkVXIHRyYW5zYWN0aW9uIGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0SWQgPSAnODYzODI4NGEtZGFiMi00NmI5LWIwN2YtMjExMDlhNmU3MjIwJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QgPSBmaXh0dXJlcy5zdGFraW5nUmVxdWVzdChbZml4dHVyZXMudHJhbnNhY3Rpb24oJ05FVycpXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbnMgd2hlbiBvbmx5IGEgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uXSk7XG4gICAgICBjb25zdCBtc1Njb3BlID0gbW9ja0dldFN0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQsIGV4cGVjdGVkU3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuZ2V0VHJhbnNhY3Rpb25zUmVhZHlUb1NpZ24oc3Rha2luZ1JlcXVlc3RJZCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbik7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi5hbGxTaWduaW5nQ29tcGxldGUuc2hvdWxkLmJlLkZhbHNlKCk7XG4gICAgICB0cmFuc2FjdGlvbnNSZWFkeVRvU2lnbi50cmFuc2FjdGlvbnMuc2hvdWxkLmNvbnRhaW5FcWwoZXhwZWN0ZWRUcmFuc2FjdGlvbik7XG5cbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbFNpZ25pbmdDb21wbGV0ZSBmYWxzZSBhbmQgMSB0cmFuc2FjdGlvbiB3aGVuIE5FVyBhbmQgUkVBRFkgdHJhbnNhY3Rpb24gZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3Rha2luZ1JlcXVlc3RJZCA9ICc4NjM4Mjg0YS1kYWIyLTQ2YjktYjA3Zi0yMTEwOWE2ZTcyMjAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCA9IGZpeHR1cmVzLnN0YWtpbmdSZXF1ZXN0KFtleHBlY3RlZFRyYW5zYWN0aW9uLCBmaXh0dXJlcy50cmFuc2FjdGlvbignTkVXJyldKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBtb2NrR2V0U3Rha2luZ1JlcXVlc3Qoc3Rha2luZ1JlcXVlc3RJZCwgZXhwZWN0ZWRTdGFraW5nUmVxdWVzdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRUcmFuc2FjdGlvbnNSZWFkeVRvU2lnbihzdGFraW5nUmVxdWVzdElkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLmFsbFNpZ25pbmdDb21wbGV0ZS5zaG91bGQuYmUuRmFsc2UoKTtcbiAgICAgIHRyYW5zYWN0aW9uc1JlYWR5VG9TaWduLnRyYW5zYWN0aW9ucy5zaG91bGQuY29udGFpbkVxbChleHBlY3RlZFRyYW5zYWN0aW9uKTtcblxuICAgICAgbXNTY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIHNlbGYtbWFuYWdlZCBzdGFraW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcywgZmFsc2UpO1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHtzdGFraW5nV2FsbGV0LmNvaW59L3dhbGxldHMvJHtzdGFraW5nV2FsbGV0LndhbGxldElkfS9yZXF1ZXN0cy8ke3RyYW5zYWN0aW9uLnN0YWtpbmdSZXF1ZXN0SWR9L3RyYW5zYWN0aW9ucy8ke3RyYW5zYWN0aW9uLmlkfWBcbiAgICAgICAgKVxuICAgICAgICAucXVlcnkoeyBleHBhbmRCdWlsZFBhcmFtczogdHJ1ZSB9KVxuICAgICAgICAucmVwbHkoMjAwLCB0cmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZVNpZ25hdHVyZVNoYXJlcyA9IHNhbmRib3guc3R1YihUc3NVdGlscy5wcm90b3R5cGUsICdkZWxldGVTaWduYXR1cmVTaGFyZXMnKTtcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3ByZWJ1aWxkVHJhbnNhY3Rpb24nKTtcbiAgICAgIGNvbnN0IGJ1aWxkID0gc2FuZGJveC5zdHViKFN0YWtpbmdXYWxsZXQucHJvdG90eXBlLCAnYnVpbGQnKTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHdhbGxldElkOiBzdGFraW5nV2FsbGV0LndhbGxldElkLFxuICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0Lm5vdENhbGxlZChkZWxldGVTaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQud2FsbGV0LnByZWJ1aWxkVHJhbnNhY3Rpb24oZm9ybWF0dGVkUGFyYW1zKTtcbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJlYnVpbGQgc2VsZi1tYW5hZ2VkIHN0YWtpbmcgdHJhbnNhY3Rpb24gLSBubyBidWlsZCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke3N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke3N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgZGVsZXRlU2lnbmF0dXJlU2hhcmVzID0gc2FuZGJveC5zdHViKFRzc1V0aWxzLnByb3RvdHlwZSwgJ2RlbGV0ZVNpZ25hdHVyZVNoYXJlcycpO1xuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgYnVpbGQgPSBzYW5kYm94LnN0dWIoU3Rha2luZ1dhbGxldC5wcm90b3R5cGUsICdidWlsZCcpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgd2FsbGV0SWQ6IHN0YWtpbmdXYWxsZXQud2FsbGV0SWQsXG4gICAgICAgIHR4SGV4OiAnaGV4JyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0ge1xuICAgICAgICAuLi5maXh0dXJlcy5idWlsZFBhcmFtcyxcbiAgICAgICAgY29pbjogc3Rha2luZ1dhbGxldC5jb2luLFxuICAgICAgICB3YWxsZXRJZDogc3Rha2luZ1dhbGxldC53YWxsZXRJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogc3Rha2luZ1dhbGxldC53YWxsZXQudHlwZSgpLFxuICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IHN0YWtpbmdXYWxsZXQucHJlYnVpbGRTZWxmTWFuYWdlZFN0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRPbmNlKHByZWJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgc2FuZGJveC5hc3NlcnQubm90Q2FsbGVkKGJ1aWxkKTtcbiAgICAgIHNhbmRib3guYXNzZXJ0LmNhbGxlZE9uY2UoZGVsZXRlU2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBzdGFraW5nV2FsbGV0LndhbGxldC5wcmVidWlsZFRyYW5zYWN0aW9uKGZvcm1hdHRlZFBhcmFtcyk7XG5cbiAgICAgIHN0YWtpbmdUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIHNob3VsZC5leGlzdChzdGFraW5nVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19