@bitgo/sdk-core 37.4.1 → 37.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/enum.d.ts +2 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +3 -1
- package/dist/src/api/types.d.ts +1 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +2 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +19 -3
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/defi/defiVault.d.ts +79 -0
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/defiVault.js +198 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/iDefiVault.js +6 -0
- package/dist/src/bitgo/defi/index.d.ts +3 -0
- package/dist/src/bitgo/defi/index.d.ts.map +1 -0
- package/dist/src/bitgo/defi/index.js +22 -0
- package/dist/src/bitgo/index.d.ts +1 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +2 -1
- package/dist/src/bitgo/internal/keycard.d.ts +2 -1
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +6 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts +2 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +9 -4
- package/dist/src/bitgo/trading/tradingAccount.js +2 -2
- package/dist/src/bitgo/tss/common.d.ts +2 -1
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +14 -4
- package/dist/src/bitgo/utils/messageTypes.d.ts +3 -1
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/messageTypes.js +3 -1
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +16 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +25 -3
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +3 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +8 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +14 -8
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +14 -6
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +23 -28
- package/dist/src/bitgo/wallet/iWallet.d.ts +11 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +3 -0
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +9 -3
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +47 -7
- package/dist/src/bitgo/wallet/wallets.d.ts +2 -1
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +26 -16
- package/dist/src/coins/ofc.d.ts +4 -0
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +17 -2
- package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/test/unit/bitgo/defi/defiVault.js +292 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +6 -6
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +14 -6
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +50 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +77 -21
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletsEncryptionVersion.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/walletsEncryptionVersion.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
require("should");
|
|
39
|
+
const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
|
|
40
|
+
const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
|
|
41
|
+
describe('Wallets - encryptionVersion threading', function () {
|
|
42
|
+
let wallets;
|
|
43
|
+
let mockBitGo;
|
|
44
|
+
let mockBaseCoin;
|
|
45
|
+
let mockKeychains;
|
|
46
|
+
const userPrv = 'xprvSomeUserPrivateKey';
|
|
47
|
+
const userPub = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
|
|
48
|
+
beforeEach(function () {
|
|
49
|
+
mockKeychains = {
|
|
50
|
+
create: sinon.stub().returns({ pub: userPub, prv: userPrv }),
|
|
51
|
+
add: sinon.stub().resolves({ id: 'user-key-id', pub: userPub, encryptedPrv: 'encrypted-prv' }),
|
|
52
|
+
};
|
|
53
|
+
mockBitGo = {
|
|
54
|
+
encryptAsync: sinon
|
|
55
|
+
.stub()
|
|
56
|
+
.callsFake(async ({ password, input }) => `enc:${password}:${input}`),
|
|
57
|
+
decryptAsync: sinon.stub().resolves('decryptedPrv'),
|
|
58
|
+
get: sinon.stub().returns({ result: sinon.stub(), query: sinon.stub().returnsThis() }),
|
|
59
|
+
post: sinon.stub().returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) }),
|
|
60
|
+
put: sinon.stub().returns({
|
|
61
|
+
send: sinon
|
|
62
|
+
.stub()
|
|
63
|
+
.returns({ result: sinon.stub().resolves({ acceptedWalletShares: [], walletShareUpdateErrors: [] }) }),
|
|
64
|
+
}),
|
|
65
|
+
getECDHKeychain: sinon.stub().resolves({ encryptedXprv: 'encXprv' }),
|
|
66
|
+
setRequestTracer: sinon.stub(),
|
|
67
|
+
url: sinon.stub().returns('/test/url'),
|
|
68
|
+
};
|
|
69
|
+
mockBaseCoin = {
|
|
70
|
+
keychains: sinon.stub().returns(mockKeychains),
|
|
71
|
+
url: sinon.stub().callsFake((path) => path),
|
|
72
|
+
getFamily: sinon.stub().returns('btc'),
|
|
73
|
+
getChain: sinon.stub().returns('btc'),
|
|
74
|
+
supportsTss: sinon.stub().returns(false),
|
|
75
|
+
getMPCAlgorithm: sinon.stub().returns('ecdsa'),
|
|
76
|
+
};
|
|
77
|
+
wallets = new wallets_1.Wallets(mockBitGo, mockBaseCoin);
|
|
78
|
+
});
|
|
79
|
+
afterEach(function () {
|
|
80
|
+
sinon.restore();
|
|
81
|
+
});
|
|
82
|
+
describe('acceptShare', function () {
|
|
83
|
+
it('passes encryptionVersion: 2 to encryptAsync on the multiUserKeyRotationRequired path', async function () {
|
|
84
|
+
mockBitGo.get.returns({
|
|
85
|
+
result: sinon.stub().resolves({
|
|
86
|
+
userMultiKeyRotationRequired: true,
|
|
87
|
+
keychain: null,
|
|
88
|
+
permissions: ['spend'],
|
|
89
|
+
wallet: 'wallet-id',
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
await wallets.acceptShare({
|
|
93
|
+
walletShareId: 'share-id',
|
|
94
|
+
userPassword: 'my-password',
|
|
95
|
+
encryptionVersion: 2,
|
|
96
|
+
});
|
|
97
|
+
assert.ok(mockBitGo.encryptAsync.called, 'encryptAsync should have been called');
|
|
98
|
+
const call = mockBitGo.encryptAsync.firstCall;
|
|
99
|
+
assert.strictEqual(call.args[0].encryptionVersion, 2);
|
|
100
|
+
});
|
|
101
|
+
it('passes encryptionVersion: undefined when not set', async function () {
|
|
102
|
+
mockBitGo.get.returns({
|
|
103
|
+
result: sinon.stub().resolves({
|
|
104
|
+
userMultiKeyRotationRequired: true,
|
|
105
|
+
keychain: null,
|
|
106
|
+
permissions: ['spend'],
|
|
107
|
+
wallet: 'wallet-id',
|
|
108
|
+
}),
|
|
109
|
+
});
|
|
110
|
+
await wallets.acceptShare({
|
|
111
|
+
walletShareId: 'share-id',
|
|
112
|
+
userPassword: 'my-password',
|
|
113
|
+
});
|
|
114
|
+
assert.ok(mockBitGo.encryptAsync.called);
|
|
115
|
+
const call = mockBitGo.encryptAsync.firstCall;
|
|
116
|
+
assert.strictEqual(call.args[0].encryptionVersion, undefined);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('bulkAcceptShare', function () {
|
|
120
|
+
const walletSharesList = {
|
|
121
|
+
incoming: [
|
|
122
|
+
{
|
|
123
|
+
id: 'share-id',
|
|
124
|
+
userMultiKeyRotationRequired: true,
|
|
125
|
+
keychain: null,
|
|
126
|
+
permissions: ['spend'],
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
outgoing: [],
|
|
130
|
+
};
|
|
131
|
+
beforeEach(function () {
|
|
132
|
+
mockBitGo.get.returns({ result: sinon.stub().resolves(walletSharesList) });
|
|
133
|
+
});
|
|
134
|
+
it('passes encryptionVersion: 2 to encryptAsync on the multiUserKeyRotationRequired path', async function () {
|
|
135
|
+
await wallets.bulkAcceptShare({
|
|
136
|
+
walletShareIds: ['share-id'],
|
|
137
|
+
userLoginPassword: 'login-password',
|
|
138
|
+
encryptionVersion: 2,
|
|
139
|
+
});
|
|
140
|
+
assert.ok(mockBitGo.encryptAsync.called);
|
|
141
|
+
const call = mockBitGo.encryptAsync.firstCall;
|
|
142
|
+
assert.strictEqual(call.args[0].encryptionVersion, 2);
|
|
143
|
+
});
|
|
144
|
+
it('passes encryptionVersion: undefined when not set', async function () {
|
|
145
|
+
await wallets.bulkAcceptShare({
|
|
146
|
+
walletShareIds: ['share-id'],
|
|
147
|
+
userLoginPassword: 'login-password',
|
|
148
|
+
});
|
|
149
|
+
assert.ok(mockBitGo.encryptAsync.called);
|
|
150
|
+
const call = mockBitGo.encryptAsync.firstCall;
|
|
151
|
+
assert.strictEqual(call.args[0].encryptionVersion, undefined);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('Wallet.shareWallet / createBulkWalletShare', function () {
|
|
155
|
+
let wallet;
|
|
156
|
+
beforeEach(function () {
|
|
157
|
+
const mockWalletData = {
|
|
158
|
+
id: 'wallet-id',
|
|
159
|
+
keys: ['key-1', 'key-2', 'key-3'],
|
|
160
|
+
coin: 'btc',
|
|
161
|
+
label: 'Test Wallet',
|
|
162
|
+
users: [],
|
|
163
|
+
multisigType: 'onchain',
|
|
164
|
+
type: 'hot',
|
|
165
|
+
};
|
|
166
|
+
mockBaseCoin.supportsTss = sinon.stub().returns(false);
|
|
167
|
+
mockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
|
|
168
|
+
wallet = new wallet_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
169
|
+
});
|
|
170
|
+
it('shareWallet passes encryptionVersion to prepareSharedKeychain', async function () {
|
|
171
|
+
const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
|
|
172
|
+
mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
|
|
173
|
+
mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
|
|
174
|
+
await wallet.shareWallet({
|
|
175
|
+
email: 'test@test.com',
|
|
176
|
+
permissions: 'spend',
|
|
177
|
+
walletPassphrase: 'passphrase',
|
|
178
|
+
encryptionVersion: 2,
|
|
179
|
+
});
|
|
180
|
+
assert.ok(prepareStub.calledOnce, 'prepareSharedKeychain should be called');
|
|
181
|
+
assert.strictEqual(prepareStub.firstCall.args[3], 2, 'encryptionVersion should be forwarded');
|
|
182
|
+
});
|
|
183
|
+
it('shareWallet passes encryptionVersion: undefined when not set', async function () {
|
|
184
|
+
const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
|
|
185
|
+
mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
|
|
186
|
+
mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
|
|
187
|
+
await wallet.shareWallet({
|
|
188
|
+
email: 'test@test.com',
|
|
189
|
+
permissions: 'spend',
|
|
190
|
+
walletPassphrase: 'passphrase',
|
|
191
|
+
});
|
|
192
|
+
assert.ok(prepareStub.calledOnce);
|
|
193
|
+
assert.strictEqual(prepareStub.firstCall.args[3], undefined);
|
|
194
|
+
});
|
|
195
|
+
it('createBulkWalletShare passes encryptionVersion to encryptPrvForUserAsync', async function () {
|
|
196
|
+
const encryptPrvStub = sinon
|
|
197
|
+
.stub(wallet, 'encryptPrvForUserAsync')
|
|
198
|
+
.resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
|
|
199
|
+
sinon
|
|
200
|
+
.stub(wallet, 'getDecryptedKeychainForSharing')
|
|
201
|
+
.resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
|
|
202
|
+
sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
|
|
203
|
+
await wallet.createBulkWalletShare({
|
|
204
|
+
walletPassphrase: 'passphrase',
|
|
205
|
+
keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
|
|
206
|
+
encryptionVersion: 2,
|
|
207
|
+
});
|
|
208
|
+
assert.ok(encryptPrvStub.calledOnce);
|
|
209
|
+
assert.strictEqual(encryptPrvStub.firstCall.args[4], 2, 'encryptionVersion should be forwarded');
|
|
210
|
+
});
|
|
211
|
+
it('createBulkWalletShare passes encryptionVersion: undefined when not set', async function () {
|
|
212
|
+
const encryptPrvStub = sinon
|
|
213
|
+
.stub(wallet, 'encryptPrvForUserAsync')
|
|
214
|
+
.resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
|
|
215
|
+
sinon
|
|
216
|
+
.stub(wallet, 'getDecryptedKeychainForSharing')
|
|
217
|
+
.resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
|
|
218
|
+
sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
|
|
219
|
+
await wallet.createBulkWalletShare({
|
|
220
|
+
walletPassphrase: 'passphrase',
|
|
221
|
+
keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
|
|
222
|
+
});
|
|
223
|
+
assert.ok(encryptPrvStub.calledOnce);
|
|
224
|
+
assert.strictEqual(encryptPrvStub.firstCall.args[4], undefined);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBRTdELFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtJQUNoRCxJQUFJLE9BQWdCLENBQUM7SUFDckIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksYUFBa0IsQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FDWCxpSEFBaUgsQ0FBQztJQUVwSCxVQUFVLENBQUM7UUFDVCxhQUFhLEdBQUc7WUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVELEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQztTQUMvRixDQUFDO1FBRUYsU0FBUyxHQUFHO1lBQ1YsWUFBWSxFQUFFLEtBQUs7aUJBQ2hCLElBQUksRUFBRTtpQkFDTixTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUMsRUFBRSxFQUFFLENBQUMsT0FBTyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7WUFDNUcsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FB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QUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBXYWxsZXRzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXRzJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0JztcblxuZGVzY3JpYmUoJ1dhbGxldHMgLSBlbmNyeXB0aW9uVmVyc2lvbiB0aHJlYWRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXRzOiBXYWxsZXRzO1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tLZXljaGFpbnM6IGFueTtcblxuICBjb25zdCB1c2VyUHJ2ID0gJ3hwcnZTb21lVXNlclByaXZhdGVLZXknO1xuICBjb25zdCB1c2VyUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0Z0WGdTNXNZSkFCcXFHOVlMbUM0UTFSZGFwOWdTRThOcXR3eWJHaGVQWTJnWjI5RVNGanFKb0N1MVJ1cGplOFl0R3FzZWZEMjY1VE1nN3VzVURGZHA2VzFFR01jZXQ4JztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgY3JlYXRlOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YjogdXNlclB1YiwgcHJ2OiB1c2VyUHJ2IH0pLFxuICAgICAgYWRkOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9KSxcbiAgICB9O1xuXG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgZW5jcnlwdEFzeW5jOiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0QXN5bmM6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkUHJ2JyksXG4gICAgICBnZXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCksIHF1ZXJ5OiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSB9KSxcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSksXG4gICAgICBwdXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub25cbiAgICAgICAgICAuc3R1YigpXG4gICAgICAgICAgLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGFjY2VwdGVkV2FsbGV0U2hhcmVzOiBbXSwgd2FsbGV0U2hhcmVVcGRhdGVFcnJvcnM6IFtdIH0pIH0pLFxuICAgICAgfSksXG4gICAgICBnZXRFQ0RIS2V5Y2hhaW46IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGVuY3J5cHRlZFhwcnY6ICdlbmNYcHJ2JyB9KSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJy90ZXN0L3VybCcpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IHBhdGgpLFxuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoJ2J0YycpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLnJldHVybnMoJ2VjZHNhJyksXG4gICAgfTtcblxuICAgIHdhbGxldHMgPSBuZXcgV2FsbGV0cyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWNjZXB0U2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogMiB0byBlbmNyeXB0QXN5bmMgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0QXN5bmMuY2FsbGVkLCAnZW5jcnlwdEFzeW5jIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkJyk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0QXN5bmMuY2FsbGVkKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdEFzeW5jLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWxrQWNjZXB0U2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVzTGlzdCA9IHtcbiAgICAgIGluY29taW5nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ3NoYXJlLWlkJyxcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgb3V0Z29pbmc6IFtdLFxuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHdhbGxldFNoYXJlc0xpc3QpIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogMiB0byBlbmNyeXB0QXN5bmMgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IFsnc2hhcmUtaWQnXSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdEFzeW5jLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdEFzeW5jLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gcHJlcGFyZVNoYXJlZEtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJlcGFyZVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZXBhcmVTaGFyZWRLZXljaGFpbicpLnJlc29sdmVzKHt9KTtcbiAgICAgIG1vY2tCaXRHby5nZXRTaGFyaW5nS2V5ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgdXNlcklkOiAndXNlci1pZCcsIHB1YmtleTogJ3JlY3ZQdWInLCBwYXRoOiAnbS8wJyB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LnNoYXJlV2FsbGV0KHtcbiAgICAgICAgZW1haWw6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgcGVybWlzc2lvbnM6ICdzcGVuZCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4gc2hvdWxkIGJlIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCAyLCAnZW5jcnlwdGlvblZlcnNpb24gc2hvdWxkIGJlIGZvcndhcmRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlV2FsbGV0IHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4nKS5yZXNvbHZlcyh7fSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6ICdyZWN2UHViJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZUJ1bGtXYWxsZXRTaGFyZSBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gZW5jcnlwdFBydkZvclVzZXJBc3luYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRQcnZTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0LCAnZW5jcnlwdFBydkZvclVzZXJBc3luYycpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2soZW5jcnlwdFBydlN0dWIuY2FsbGVkT25jZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW5jcnlwdFBydlN0dWIuZmlyc3RDYWxsLmFyZ3NbNF0sIDIsICdlbmNyeXB0aW9uVmVyc2lvbiBzaG91bGQgYmUgZm9yd2FyZGVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlQnVsa1dhbGxldFNoYXJlIHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRQcnZTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0LCAnZW5jcnlwdFBydkZvclVzZXJBc3luYycpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|