@bitgo/abstract-eth 19.0.3 → 20.0.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/CHANGELOG.md +17 -0
- package/dist/src/abstractEthLikeCoin.js +3 -3
- package/dist/src/abstractEthLikeNewCoins.d.ts +0 -10
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -1
- package/dist/src/abstractEthLikeNewCoins.js +24 -38
- package/dist/src/ethLikeToken.js +2 -2
- package/dist/src/index.js +6 -2
- package/dist/src/lib/contractCall.js +2 -2
- package/dist/src/lib/index.js +6 -2
- package/dist/src/lib/keyPair.js +6 -6
- package/dist/src/lib/transaction.js +7 -7
- package/dist/src/lib/transactionBuilder.js +29 -25
- package/dist/src/lib/transferBuilder.js +12 -8
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +5 -5
- package/dist/src/lib/transferBuilders/index.js +6 -2
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +5 -5
- package/dist/src/lib/transferBuilders/transferBuilderERC721.js +5 -5
- package/dist/src/lib/types.js +27 -27
- package/dist/src/lib/utils.js +69 -69
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -7
- package/LICENSE +0 -191
package/dist/src/lib/utils.js
CHANGED
|
@@ -70,10 +70,10 @@ exports.sign = sign;
|
|
|
70
70
|
* @returns {string} -- the contract method encoded data
|
|
71
71
|
*/
|
|
72
72
|
function sendMultiSigData(to, value, data, expireTime, sequenceId, signature) {
|
|
73
|
-
const params = [to, value, ethereumjs_util_1.toBuffer(data), expireTime, sequenceId, ethereumjs_util_1.toBuffer(signature)];
|
|
73
|
+
const params = [to, value, (0, ethereumjs_util_1.toBuffer)(data), expireTime, sequenceId, (0, ethereumjs_util_1.toBuffer)(signature)];
|
|
74
74
|
const method = ethereumjs_abi_1.default.methodID('sendMultiSig', walletUtil_1.sendMultiSigTypes);
|
|
75
75
|
const args = ethereumjs_abi_1.default.rawEncode(walletUtil_1.sendMultiSigTypes, params);
|
|
76
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
76
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
77
77
|
}
|
|
78
78
|
exports.sendMultiSigData = sendMultiSigData;
|
|
79
79
|
/**
|
|
@@ -88,10 +88,10 @@ exports.sendMultiSigData = sendMultiSigData;
|
|
|
88
88
|
* @returns {string} -- the contract method encoded data
|
|
89
89
|
*/
|
|
90
90
|
function sendMultiSigTokenData(to, value, tokenContractAddress, expireTime, sequenceId, signature) {
|
|
91
|
-
const params = [to, value, tokenContractAddress, expireTime, sequenceId, ethereumjs_util_1.toBuffer(signature)];
|
|
91
|
+
const params = [to, value, tokenContractAddress, expireTime, sequenceId, (0, ethereumjs_util_1.toBuffer)(signature)];
|
|
92
92
|
const method = ethereumjs_abi_1.default.methodID('sendMultiSigToken', walletUtil_1.sendMultiSigTokenTypes);
|
|
93
93
|
const args = ethereumjs_abi_1.default.rawEncode(walletUtil_1.sendMultiSigTokenTypes, params);
|
|
94
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
94
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
95
95
|
}
|
|
96
96
|
exports.sendMultiSigTokenData = sendMultiSigTokenData;
|
|
97
97
|
/**
|
|
@@ -104,7 +104,7 @@ function flushTokensData(forwarderAddress, tokenAddress) {
|
|
|
104
104
|
const params = [forwarderAddress, tokenAddress];
|
|
105
105
|
const method = ethereumjs_abi_1.default.methodID('flushForwarderTokens', walletUtil_1.flushTokensTypes);
|
|
106
106
|
const args = ethereumjs_abi_1.default.rawEncode(walletUtil_1.flushTokensTypes, params);
|
|
107
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
107
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
108
108
|
}
|
|
109
109
|
exports.flushTokensData = flushTokensData;
|
|
110
110
|
/**
|
|
@@ -114,7 +114,7 @@ function flushCoinsData() {
|
|
|
114
114
|
const params = [];
|
|
115
115
|
const method = ethereumjs_abi_1.default.methodID('flush', walletUtil_1.flushCoinsTypes);
|
|
116
116
|
const args = ethereumjs_abi_1.default.rawEncode(walletUtil_1.flushCoinsTypes, params);
|
|
117
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
117
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
118
118
|
}
|
|
119
119
|
exports.flushCoinsData = flushCoinsData;
|
|
120
120
|
/**
|
|
@@ -133,7 +133,7 @@ exports.getAddressInitializationData = getAddressInitializationData;
|
|
|
133
133
|
* @returns {boolean} - the validation result
|
|
134
134
|
*/
|
|
135
135
|
function isValidEthAddress(address) {
|
|
136
|
-
return ethereumjs_util_1.isValidAddress(address);
|
|
136
|
+
return (0, ethereumjs_util_1.isValidAddress)(address);
|
|
137
137
|
}
|
|
138
138
|
exports.isValidEthAddress = isValidEthAddress;
|
|
139
139
|
/**
|
|
@@ -171,16 +171,16 @@ function decodeWalletCreationData(data) {
|
|
|
171
171
|
}
|
|
172
172
|
// sometimes ethereumjs-abi removes 0 padding at the start of addresses,
|
|
173
173
|
// so we should pad until they are the standard 20 bytes
|
|
174
|
-
const paddedAddresses = addresses.map((address) => ethereumjs_util_1.stripHexPrefix(address.toString('hex')).padStart(40, '0'));
|
|
175
|
-
return { owners: paddedAddresses.map((address) => ethereumjs_util_1.addHexPrefix(address)) };
|
|
174
|
+
const paddedAddresses = addresses.map((address) => (0, ethereumjs_util_1.stripHexPrefix)(address.toString('hex')).padStart(40, '0'));
|
|
175
|
+
return { owners: paddedAddresses.map((address) => (0, ethereumjs_util_1.addHexPrefix)(address)) };
|
|
176
176
|
}
|
|
177
177
|
else {
|
|
178
178
|
const decodedDataForWalletCreation = getRawDecoded(walletUtil_1.createV1WalletTypes, getBufferedByteCode(walletUtil_1.v1CreateWalletMethodId, data));
|
|
179
179
|
const addresses = decodedDataForWalletCreation[0];
|
|
180
180
|
const saltBuffer = decodedDataForWalletCreation[1];
|
|
181
|
-
const salt = ethereumjs_util_1.bufferToHex(saltBuffer);
|
|
182
|
-
const paddedAddresses = addresses.map((address) => ethereumjs_util_1.stripHexPrefix(address.toString()).padStart(40, '0'));
|
|
183
|
-
const owners = paddedAddresses.map((address) => ethereumjs_util_1.addHexPrefix(address));
|
|
181
|
+
const salt = (0, ethereumjs_util_1.bufferToHex)(saltBuffer);
|
|
182
|
+
const paddedAddresses = addresses.map((address) => (0, ethereumjs_util_1.stripHexPrefix)(address.toString()).padStart(40, '0'));
|
|
183
|
+
const owners = paddedAddresses.map((address) => (0, ethereumjs_util_1.addHexPrefix)(address));
|
|
184
184
|
return {
|
|
185
185
|
owners,
|
|
186
186
|
salt,
|
|
@@ -218,12 +218,12 @@ function decodeTokenTransferData(data) {
|
|
|
218
218
|
}
|
|
219
219
|
const [to, amount, tokenContractAddress, expireTime, sequenceId, signature] = getRawDecoded(walletUtil_1.sendMultiSigTokenTypes, getBufferedByteCode(walletUtil_1.sendMultisigTokenMethodId, data));
|
|
220
220
|
return {
|
|
221
|
-
to: ethereumjs_util_1.addHexPrefix(to),
|
|
222
|
-
amount: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(amount)).toFixed(),
|
|
223
|
-
expireTime: ethereumjs_util_1.bufferToInt(expireTime),
|
|
224
|
-
sequenceId: ethereumjs_util_1.bufferToInt(sequenceId),
|
|
225
|
-
signature: ethereumjs_util_1.bufferToHex(signature),
|
|
226
|
-
tokenContractAddress: ethereumjs_util_1.addHexPrefix(tokenContractAddress),
|
|
221
|
+
to: (0, ethereumjs_util_1.addHexPrefix)(to),
|
|
222
|
+
amount: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(amount)).toFixed(),
|
|
223
|
+
expireTime: (0, ethereumjs_util_1.bufferToInt)(expireTime),
|
|
224
|
+
sequenceId: (0, ethereumjs_util_1.bufferToInt)(sequenceId),
|
|
225
|
+
signature: (0, ethereumjs_util_1.bufferToHex)(signature),
|
|
226
|
+
tokenContractAddress: (0, ethereumjs_util_1.addHexPrefix)(tokenContractAddress),
|
|
227
227
|
};
|
|
228
228
|
}
|
|
229
229
|
exports.decodeTokenTransferData = decodeTokenTransferData;
|
|
@@ -232,21 +232,21 @@ function decodeERC721TransferData(data) {
|
|
|
232
232
|
throw new sdk_core_1.BuildTransactionError(`Invalid transfer bytecode: ${data}`);
|
|
233
233
|
}
|
|
234
234
|
const [to, amount, internalData, expireTime, sequenceId, signature] = getRawDecoded(walletUtil_1.sendMultiSigTypes, getBufferedByteCode(walletUtil_1.sendMultisigMethodId, data));
|
|
235
|
-
const internalDataHex = ethereumjs_util_1.bufferToHex(internalData);
|
|
235
|
+
const internalDataHex = (0, ethereumjs_util_1.bufferToHex)(internalData);
|
|
236
236
|
if (!internalDataHex.startsWith(walletUtil_1.ERC721SafeTransferTypeMethodId)) {
|
|
237
237
|
throw new sdk_core_1.BuildTransactionError(`Invalid transfer bytecode: ${data}`);
|
|
238
238
|
}
|
|
239
239
|
const [from, receiver, tokenId, userSentData] = getRawDecoded(walletUtil_1.ERC721SafeTransferTypes, getBufferedByteCode(walletUtil_1.ERC721SafeTransferTypeMethodId, internalDataHex));
|
|
240
240
|
return {
|
|
241
|
-
to: ethereumjs_util_1.addHexPrefix(receiver),
|
|
242
|
-
from: ethereumjs_util_1.addHexPrefix(from),
|
|
243
|
-
expireTime: ethereumjs_util_1.bufferToInt(expireTime),
|
|
244
|
-
amount: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(amount)).toFixed(),
|
|
245
|
-
tokenId: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(tokenId)).toFixed(),
|
|
246
|
-
sequenceId: ethereumjs_util_1.bufferToInt(sequenceId),
|
|
247
|
-
signature: ethereumjs_util_1.bufferToHex(signature),
|
|
248
|
-
tokenContractAddress: ethereumjs_util_1.addHexPrefix(to),
|
|
249
|
-
userData: ethereumjs_util_1.bufferToHex(userSentData),
|
|
241
|
+
to: (0, ethereumjs_util_1.addHexPrefix)(receiver),
|
|
242
|
+
from: (0, ethereumjs_util_1.addHexPrefix)(from),
|
|
243
|
+
expireTime: (0, ethereumjs_util_1.bufferToInt)(expireTime),
|
|
244
|
+
amount: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(amount)).toFixed(),
|
|
245
|
+
tokenId: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(tokenId)).toFixed(),
|
|
246
|
+
sequenceId: (0, ethereumjs_util_1.bufferToInt)(sequenceId),
|
|
247
|
+
signature: (0, ethereumjs_util_1.bufferToHex)(signature),
|
|
248
|
+
tokenContractAddress: (0, ethereumjs_util_1.addHexPrefix)(to),
|
|
249
|
+
userData: (0, ethereumjs_util_1.bufferToHex)(userSentData),
|
|
250
250
|
};
|
|
251
251
|
}
|
|
252
252
|
exports.decodeERC721TransferData = decodeERC721TransferData;
|
|
@@ -258,33 +258,33 @@ function decodeERC1155TransferData(data) {
|
|
|
258
258
|
throw new sdk_core_1.BuildTransactionError(`Invalid transfer bytecode: ${data}`);
|
|
259
259
|
}
|
|
260
260
|
const [to, amount, internalData, expireTime, sequenceId, signature] = getRawDecoded(walletUtil_1.sendMultiSigTypes, getBufferedByteCode(walletUtil_1.sendMultisigMethodId, data));
|
|
261
|
-
const internalDataHex = ethereumjs_util_1.bufferToHex(internalData);
|
|
261
|
+
const internalDataHex = (0, ethereumjs_util_1.bufferToHex)(internalData);
|
|
262
262
|
if (internalDataHex.startsWith(walletUtil_1.ERC1155SafeTransferTypeMethodId)) {
|
|
263
263
|
let tokenId;
|
|
264
264
|
let value;
|
|
265
265
|
[from, receiver, tokenId, value, userSentData] = getRawDecoded(walletUtil_1.ERC1155SafeTransferTypes, getBufferedByteCode(walletUtil_1.ERC1155SafeTransferTypeMethodId, internalDataHex));
|
|
266
|
-
tokenIds = [new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(tokenId)).toFixed()];
|
|
267
|
-
values = [new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(value)).toFixed()];
|
|
266
|
+
tokenIds = [new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(tokenId)).toFixed()];
|
|
267
|
+
values = [new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(value)).toFixed()];
|
|
268
268
|
}
|
|
269
|
-
else if (ethereumjs_util_1.bufferToHex(internalData).startsWith(walletUtil_1.ERC1155BatchTransferTypeMethodId)) {
|
|
269
|
+
else if ((0, ethereumjs_util_1.bufferToHex)(internalData).startsWith(walletUtil_1.ERC1155BatchTransferTypeMethodId)) {
|
|
270
270
|
let tempTokenIds, tempValues;
|
|
271
271
|
[from, receiver, tempTokenIds, tempValues, userSentData] = getRawDecoded(walletUtil_1.ERC1155BatchTransferTypes, getBufferedByteCode(walletUtil_1.ERC1155BatchTransferTypeMethodId, internalDataHex));
|
|
272
|
-
tokenIds = tempTokenIds.map((x) => new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(x)).toFixed());
|
|
273
|
-
values = tempValues.map((x) => new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(x)).toFixed());
|
|
272
|
+
tokenIds = tempTokenIds.map((x) => new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(x)).toFixed());
|
|
273
|
+
values = tempValues.map((x) => new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(x)).toFixed());
|
|
274
274
|
}
|
|
275
275
|
else {
|
|
276
276
|
throw new sdk_core_1.BuildTransactionError(`Invalid transfer bytecode: ${data}`);
|
|
277
277
|
}
|
|
278
278
|
return {
|
|
279
|
-
to: ethereumjs_util_1.addHexPrefix(receiver),
|
|
280
|
-
from: ethereumjs_util_1.addHexPrefix(from),
|
|
281
|
-
expireTime: ethereumjs_util_1.bufferToInt(expireTime),
|
|
282
|
-
amount: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(amount)).toFixed(),
|
|
279
|
+
to: (0, ethereumjs_util_1.addHexPrefix)(receiver),
|
|
280
|
+
from: (0, ethereumjs_util_1.addHexPrefix)(from),
|
|
281
|
+
expireTime: (0, ethereumjs_util_1.bufferToInt)(expireTime),
|
|
282
|
+
amount: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(amount)).toFixed(),
|
|
283
283
|
tokenIds,
|
|
284
284
|
values,
|
|
285
|
-
sequenceId: ethereumjs_util_1.bufferToInt(sequenceId),
|
|
286
|
-
signature: ethereumjs_util_1.bufferToHex(signature),
|
|
287
|
-
tokenContractAddress: ethereumjs_util_1.addHexPrefix(to),
|
|
285
|
+
sequenceId: (0, ethereumjs_util_1.bufferToInt)(sequenceId),
|
|
286
|
+
signature: (0, ethereumjs_util_1.bufferToHex)(signature),
|
|
287
|
+
tokenContractAddress: (0, ethereumjs_util_1.addHexPrefix)(to),
|
|
288
288
|
userData: userSentData,
|
|
289
289
|
};
|
|
290
290
|
}
|
|
@@ -301,12 +301,12 @@ function decodeNativeTransferData(data) {
|
|
|
301
301
|
}
|
|
302
302
|
const [to, amount, internalData, expireTime, sequenceId, signature] = getRawDecoded(walletUtil_1.sendMultiSigTypes, getBufferedByteCode(walletUtil_1.sendMultisigMethodId, data));
|
|
303
303
|
return {
|
|
304
|
-
to: ethereumjs_util_1.addHexPrefix(to),
|
|
305
|
-
amount: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(amount)).toFixed(),
|
|
306
|
-
expireTime: ethereumjs_util_1.bufferToInt(expireTime),
|
|
307
|
-
sequenceId: ethereumjs_util_1.bufferToInt(sequenceId),
|
|
308
|
-
signature: ethereumjs_util_1.bufferToHex(signature),
|
|
309
|
-
data: ethereumjs_util_1.bufferToHex(internalData),
|
|
304
|
+
to: (0, ethereumjs_util_1.addHexPrefix)(to),
|
|
305
|
+
amount: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(amount)).toFixed(),
|
|
306
|
+
expireTime: (0, ethereumjs_util_1.bufferToInt)(expireTime),
|
|
307
|
+
sequenceId: (0, ethereumjs_util_1.bufferToInt)(sequenceId),
|
|
308
|
+
signature: (0, ethereumjs_util_1.bufferToHex)(signature),
|
|
309
|
+
data: (0, ethereumjs_util_1.bufferToHex)(internalData),
|
|
310
310
|
};
|
|
311
311
|
}
|
|
312
312
|
exports.decodeNativeTransferData = decodeNativeTransferData;
|
|
@@ -322,8 +322,8 @@ function decodeFlushTokensData(data) {
|
|
|
322
322
|
}
|
|
323
323
|
const [forwarderAddress, tokenAddress] = getRawDecoded(walletUtil_1.flushTokensTypes, getBufferedByteCode(walletUtil_1.flushForwarderTokensMethodId, data));
|
|
324
324
|
return {
|
|
325
|
-
forwarderAddress: ethereumjs_util_1.addHexPrefix(forwarderAddress),
|
|
326
|
-
tokenAddress: ethereumjs_util_1.addHexPrefix(tokenAddress),
|
|
325
|
+
forwarderAddress: (0, ethereumjs_util_1.addHexPrefix)(forwarderAddress),
|
|
326
|
+
tokenAddress: (0, ethereumjs_util_1.addHexPrefix)(tokenAddress),
|
|
327
327
|
};
|
|
328
328
|
}
|
|
329
329
|
exports.decodeFlushTokensData = decodeFlushTokensData;
|
|
@@ -396,8 +396,8 @@ exports.hexStringToNumber = hexStringToNumber;
|
|
|
396
396
|
* @returns {string} the calculated forwarder contract address
|
|
397
397
|
*/
|
|
398
398
|
function calculateForwarderAddress(contractAddress, contractCounter) {
|
|
399
|
-
const forwarderAddress = ethereumjs_util_1.generateAddress(buffer_1.Buffer.from(ethereumjs_util_1.stripHexPrefix(contractAddress), 'hex'), buffer_1.Buffer.from(ethereumjs_util_1.padToEven(ethereumjs_util_1.stripHexPrefix(numberToHexString(contractCounter))), 'hex'));
|
|
400
|
-
return ethereumjs_util_1.addHexPrefix(forwarderAddress.toString('hex'));
|
|
399
|
+
const forwarderAddress = (0, ethereumjs_util_1.generateAddress)(buffer_1.Buffer.from((0, ethereumjs_util_1.stripHexPrefix)(contractAddress), 'hex'), buffer_1.Buffer.from((0, ethereumjs_util_1.padToEven)((0, ethereumjs_util_1.stripHexPrefix)(numberToHexString(contractCounter))), 'hex'));
|
|
400
|
+
return (0, ethereumjs_util_1.addHexPrefix)(forwarderAddress.toString('hex'));
|
|
401
401
|
}
|
|
402
402
|
exports.calculateForwarderAddress = calculateForwarderAddress;
|
|
403
403
|
/**
|
|
@@ -409,8 +409,8 @@ exports.calculateForwarderAddress = calculateForwarderAddress;
|
|
|
409
409
|
* @return {string} The calculated address
|
|
410
410
|
*/
|
|
411
411
|
function calculateForwarderV1Address(creatorAddress, salt, initcode) {
|
|
412
|
-
const forwarderV1Address = ethereumjs_util_1.generateAddress2(buffer_1.Buffer.from(ethereumjs_util_1.stripHexPrefix(creatorAddress), 'hex'), buffer_1.Buffer.from(ethereumjs_util_1.stripHexPrefix(salt), 'hex'), buffer_1.Buffer.from(ethereumjs_util_1.padToEven(ethereumjs_util_1.stripHexPrefix(initcode)), 'hex'));
|
|
413
|
-
return ethereumjs_util_1.addHexPrefix(forwarderV1Address.toString('hex'));
|
|
412
|
+
const forwarderV1Address = (0, ethereumjs_util_1.generateAddress2)(buffer_1.Buffer.from((0, ethereumjs_util_1.stripHexPrefix)(creatorAddress), 'hex'), buffer_1.Buffer.from((0, ethereumjs_util_1.stripHexPrefix)(salt), 'hex'), buffer_1.Buffer.from((0, ethereumjs_util_1.padToEven)((0, ethereumjs_util_1.stripHexPrefix)(initcode)), 'hex'));
|
|
413
|
+
return (0, ethereumjs_util_1.addHexPrefix)(forwarderV1Address.toString('hex'));
|
|
414
414
|
}
|
|
415
415
|
exports.calculateForwarderV1Address = calculateForwarderV1Address;
|
|
416
416
|
/**
|
|
@@ -419,7 +419,7 @@ exports.calculateForwarderV1Address = calculateForwarderV1Address;
|
|
|
419
419
|
* @return {string} Binary hex string of the proxy
|
|
420
420
|
*/
|
|
421
421
|
function getProxyInitcode(implementationAddress) {
|
|
422
|
-
const target = ethereumjs_util_1.stripHexPrefix(implementationAddress.toLowerCase()).padStart(40, '0');
|
|
422
|
+
const target = (0, ethereumjs_util_1.stripHexPrefix)(implementationAddress.toLowerCase()).padStart(40, '0');
|
|
423
423
|
// bytecode of the proxy, from:
|
|
424
424
|
// https://github.com/BitGo/eth-multisig-v4/blob/d546a937f90f93e83b3423a5bf933d1d77c677c3/contracts/CloneFactory.sol#L42-L56
|
|
425
425
|
return `0x3d602d80600a3d3981f3363d3d373d3d3d363d73${target}5af43d82803e903d91602b57fd5bf3`;
|
|
@@ -432,10 +432,10 @@ exports.getProxyInitcode = getProxyInitcode;
|
|
|
432
432
|
* @returns {string} String representation of the signature
|
|
433
433
|
*/
|
|
434
434
|
function toStringSig(sig) {
|
|
435
|
-
return ethereumjs_util_1.bufferToHex(buffer_1.Buffer.concat([
|
|
436
|
-
ethereumjs_util_1.setLengthLeft(buffer_1.Buffer.from(ethereumjs_util_1.stripHexPrefix(sig.r), 'hex'), 32),
|
|
437
|
-
ethereumjs_util_1.setLengthLeft(buffer_1.Buffer.from(ethereumjs_util_1.stripHexPrefix(sig.s), 'hex'), 32),
|
|
438
|
-
ethereumjs_util_1.toBuffer(sig.v),
|
|
435
|
+
return (0, ethereumjs_util_1.bufferToHex)(buffer_1.Buffer.concat([
|
|
436
|
+
(0, ethereumjs_util_1.setLengthLeft)(buffer_1.Buffer.from((0, ethereumjs_util_1.stripHexPrefix)(sig.r), 'hex'), 32),
|
|
437
|
+
(0, ethereumjs_util_1.setLengthLeft)(buffer_1.Buffer.from((0, ethereumjs_util_1.stripHexPrefix)(sig.s), 'hex'), 32),
|
|
438
|
+
(0, ethereumjs_util_1.toBuffer)(sig.v),
|
|
439
439
|
]));
|
|
440
440
|
}
|
|
441
441
|
exports.toStringSig = toStringSig;
|
|
@@ -515,7 +515,7 @@ function getToken(tokenContractAddress, network) {
|
|
|
515
515
|
const tokensArray = tokens.map((token) => token);
|
|
516
516
|
if (tokensArray.length >= 1) {
|
|
517
517
|
// there should never be two tokens with the same contract address, so we assert that here
|
|
518
|
-
assert_1.default(tokensArray.length === 1);
|
|
518
|
+
(0, assert_1.default)(tokensArray.length === 1);
|
|
519
519
|
return tokensArray[0];
|
|
520
520
|
}
|
|
521
521
|
return undefined;
|
|
@@ -529,11 +529,11 @@ exports.getToken = getToken;
|
|
|
529
529
|
* @returns {string} - the createWallet method encoded
|
|
530
530
|
*/
|
|
531
531
|
function getV1WalletInitializationData(walletOwners, salt) {
|
|
532
|
-
const saltBuffer = ethereumjs_util_1.setLengthLeft(ethereumjs_util_1.toBuffer(salt), 32);
|
|
532
|
+
const saltBuffer = (0, ethereumjs_util_1.setLengthLeft)((0, ethereumjs_util_1.toBuffer)(salt), 32);
|
|
533
533
|
const params = [walletOwners, saltBuffer];
|
|
534
534
|
const method = ethereumjs_abi_1.default.methodID('createWallet', walletUtil_1.createV1WalletTypes);
|
|
535
535
|
const args = ethereumjs_abi_1.default.rawEncode(walletUtil_1.createV1WalletTypes, params);
|
|
536
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
536
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
537
537
|
}
|
|
538
538
|
exports.getV1WalletInitializationData = getV1WalletInitializationData;
|
|
539
539
|
/**
|
|
@@ -545,11 +545,11 @@ exports.getV1WalletInitializationData = getV1WalletInitializationData;
|
|
|
545
545
|
* @returns {string} - the createForwarder method encoded
|
|
546
546
|
*/
|
|
547
547
|
function getV1AddressInitializationData(baseAddress, salt, feeAddress) {
|
|
548
|
-
const saltBuffer = ethereumjs_util_1.setLengthLeft(ethereumjs_util_1.toBuffer(salt), 32);
|
|
548
|
+
const saltBuffer = (0, ethereumjs_util_1.setLengthLeft)((0, ethereumjs_util_1.toBuffer)(salt), 32);
|
|
549
549
|
const { createForwarderParams, createForwarderTypes } = getCreateForwarderParamsAndTypes(baseAddress, saltBuffer, feeAddress);
|
|
550
550
|
const method = ethereumjs_abi_1.default.methodID('createForwarder', createForwarderTypes);
|
|
551
551
|
const args = ethereumjs_abi_1.default.rawEncode(createForwarderTypes, createForwarderParams);
|
|
552
|
-
return ethereumjs_util_1.addHexPrefix(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
552
|
+
return (0, ethereumjs_util_1.addHexPrefix)(buffer_1.Buffer.concat([method, args]).toString('hex'));
|
|
553
553
|
}
|
|
554
554
|
exports.getV1AddressInitializationData = getV1AddressInitializationData;
|
|
555
555
|
/**
|
|
@@ -611,17 +611,17 @@ function decodeForwarderCreationData(data) {
|
|
|
611
611
|
else if (data.startsWith(walletUtil_1.v1CreateForwarderMethodId)) {
|
|
612
612
|
const [baseAddress, saltBuffer] = getRawDecoded(walletUtil_1.createV1ForwarderTypes, getBufferedByteCode(walletUtil_1.v1CreateForwarderMethodId, data));
|
|
613
613
|
return {
|
|
614
|
-
baseAddress: ethereumjs_util_1.addHexPrefix(baseAddress),
|
|
615
|
-
addressCreationSalt: ethereumjs_util_1.bufferToHex(saltBuffer),
|
|
614
|
+
baseAddress: (0, ethereumjs_util_1.addHexPrefix)(baseAddress),
|
|
615
|
+
addressCreationSalt: (0, ethereumjs_util_1.bufferToHex)(saltBuffer),
|
|
616
616
|
feeAddress: undefined,
|
|
617
617
|
};
|
|
618
618
|
}
|
|
619
619
|
else {
|
|
620
620
|
const [baseAddress, feeAddress, saltBuffer] = getRawDecoded(walletUtil_1.createV4ForwarderTypes, getBufferedByteCode(walletUtil_1.v4CreateForwarderMethodId, data));
|
|
621
621
|
return {
|
|
622
|
-
baseAddress: ethereumjs_util_1.addHexPrefix(baseAddress),
|
|
623
|
-
addressCreationSalt: ethereumjs_util_1.bufferToHex(saltBuffer),
|
|
624
|
-
feeAddress: ethereumjs_util_1.addHexPrefix(feeAddress),
|
|
622
|
+
baseAddress: (0, ethereumjs_util_1.addHexPrefix)(baseAddress),
|
|
623
|
+
addressCreationSalt: (0, ethereumjs_util_1.bufferToHex)(saltBuffer),
|
|
624
|
+
feeAddress: (0, ethereumjs_util_1.addHexPrefix)(feeAddress),
|
|
625
625
|
};
|
|
626
626
|
}
|
|
627
627
|
}
|
|
@@ -647,4 +647,4 @@ async function recoveryBlockchainExplorerQuery(query, explorerUrl, token) {
|
|
|
647
647
|
return response.body;
|
|
648
648
|
}
|
|
649
649
|
exports.recoveryBlockchainExplorerQuery = recoveryBlockchainExplorerQuery;
|
|
650
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQUFnQztBQUNoQyw0REFBaUM7QUFDakMsb0RBQTRCO0FBQzVCLHFEQVd5QjtBQUN6Qiw0Q0FBNEc7QUFDNUcsb0VBQXlDO0FBQ3pDLGdFQUFnRDtBQUNoRCxrREFBdUI7QUFDdkIsZ0VBQXFDO0FBQ3JDLDhDQVV5QjtBQWV6Qiw2Q0EwQnNCO0FBQ3RCLG1DQUE2QztBQUU3Qzs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxPQUF3QjtJQUNoRCxPQUFPLGdCQUFjLENBQUMsY0FBYztJQUNsQyx3RUFBd0U7SUFDeEUsU0FBUyxFQUNUO1FBQ0UsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTztRQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87S0FDekIsRUFDRCxRQUFRLENBQ1QsQ0FBQztBQUNKLENBQUM7QUFYRCw4QkFXQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFlBQVksQ0FDaEMsZUFBdUIsRUFDdkIsT0FBZ0IsRUFDaEIsWUFBNEI7SUFFNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsTUFBTSxJQUFJLHVCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQUMvQztJQUNELE1BQU0sS0FBSyxHQUFHLDBCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixPQUFPLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBWEQsb0NBV0M7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLGVBQXVCLEVBQUUsT0FBZ0I7SUFDbEUsT0FBTyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUEwQixDQUFDLENBQUMsQ0FBQztBQUN6RyxDQUFDO0FBRkQsb0JBRUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEVBQVUsRUFDVixLQUFhLEVBQ2IsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLFNBQWlCO0lBRWpCLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSwwQkFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsMEJBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSw4QkFBaUIsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLDhCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlELE9BQU8sOEJBQVksQ0FBQyxlQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQVpELDRDQVlDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLHFCQUFxQixDQUNuQyxFQUFVLEVBQ1YsS0FBYSxFQUNiLG9CQUE0QixFQUM1QixVQUFrQixFQUNsQixVQUFrQixFQUNsQixTQUFpQjtJQUVqQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSwwQkFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFOUYsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsbUNBQXNCLENBQUMsQ0FBQztJQUNqRixNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxtQ0FBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRSxPQUFPLDhCQUFZLENBQUMsZUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFiRCxzREFhQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLGdCQUF3QixFQUFFLFlBQW9CO0lBQzVFLE1BQU0sTUFBTSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsNkJBQWdCLENBQUMsQ0FBQztJQUM5RSxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyw2QkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RCxPQUFPLDhCQUFZLENBQUMsZUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFMRCwwQ0FLQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsY0FBYztJQUM1QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbEIsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLDRCQUFlLENBQUMsQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyw0QkFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELE9BQU8sOEJBQVksQ0FBQyxlQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUxELHdDQUtDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLDRCQUE0QjtJQUMxQyxPQUFPLG9DQUF1QixDQUFDO0FBQ2pDLENBQUM7QUFGRCxvRUFFQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBZTtJQUMvQyxPQUFPLGdDQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUZELDhDQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixhQUFhLENBQUMsTUFBYztJQUMxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLHNCQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxlQUFlLENBQUMsU0FBUyxFQUFFLElBQUksZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFIRCxzQ0FHQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtJQUNuRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLDJDQUE4QixDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQ0FBc0IsQ0FBQyxDQUFDLEVBQUU7UUFDakcsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDRCQUE0QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLDJDQUE4QixDQUFDLEVBQUU7UUFDbkQsTUFBTSxVQUFVLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJELDBEQUEwRDtRQUMxRCxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRCxNQUFNLHVCQUF1QixHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLG9DQUF1QixFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDbEcsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxpREFBaUQsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1NBQzdHO1FBRUQsTUFBTSxTQUFTLEdBQVMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUksZ0NBQXFCLENBQUMsc0RBQXNELFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDcEc7UUFFRCx3RUFBd0U7UUFDeEUsd0RBQXdEO1FBQ3hELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLGdDQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU5RyxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLDhCQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVFO1NBQU07UUFDTCxNQUFNLDRCQUE0QixHQUFHLGFBQWEsQ0FDaEQsZ0NBQW1CLEVBQ25CLG1CQUFtQixDQUFDLG1DQUFzQixFQUFFLElBQUksQ0FBQyxDQUNsRCxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsNEJBQTRCLENBQUMsQ0FBQyxDQUFhLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsNkJBQVcsQ0FBQyxVQUFvQixDQUFDLENBQUM7UUFDL0MsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZ0NBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekcsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsOEJBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU87WUFDTCxNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7S0FDSDtBQUNILENBQUM7QUF6Q0QsNERBeUNDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBb0IsQ0FBQyxFQUFFO1FBQ3pDLE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdkM7U0FBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsc0NBQXlCLENBQUMsRUFBRTtRQUNyRCxPQUFPLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3RDO1NBQU07UUFDTCxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDdkU7QUFDSCxDQUFDO0FBUkQsZ0RBUUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLElBQVk7SUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsc0NBQXlCLENBQUMsRUFBRTtRQUMvQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FDekYsbUNBQXNCLEVBQ3RCLG1CQUFtQixDQUFDLHNDQUF5QixFQUFFLElBQUksQ0FBQyxDQUNyRCxDQUFDO0lBRUYsT0FBTztRQUNMLEVBQUUsRUFBRSw4QkFBWSxDQUFDLEVBQVksQ0FBQztRQUM5QixNQUFNLEVBQUUsSUFBSSxzQkFBUyxDQUFDLDZCQUFXLENBQUMsTUFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQzlELFVBQVUsRUFBRSw2QkFBVyxDQUFDLFVBQW9CLENBQUM7UUFDN0MsVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsNkJBQVcsQ0FBQyxTQUFtQixDQUFDO1FBQzNDLG9CQUFvQixFQUFFLDhCQUFZLENBQUMsb0JBQThCLENBQUM7S0FDbkUsQ0FBQztBQUNKLENBQUM7QUFsQkQsMERBa0JDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtJQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBb0IsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUN2RTtJQUVELE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FDakYsOEJBQWlCLEVBQ2pCLG1CQUFtQixDQUFDLGlDQUFvQixFQUFFLElBQUksQ0FBQyxDQUNoRCxDQUFDO0lBRUYsTUFBTSxlQUFlLEdBQUcsNkJBQVcsQ0FBQyxZQUFzQixDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsMkNBQThCLENBQUMsRUFBRTtRQUMvRCxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUcsYUFBYSxDQUMzRCxvQ0FBdUIsRUFDdkIsbUJBQW1CLENBQUMsMkNBQThCLEVBQUUsZUFBZSxDQUFDLENBQ3JFLENBQUM7SUFFRixPQUFPO1FBQ0wsRUFBRSxFQUFFLDhCQUFZLENBQUMsUUFBa0IsQ0FBQztRQUNwQyxJQUFJLEVBQUUsOEJBQVksQ0FBQyxJQUFjLENBQUM7UUFDbEMsVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxNQUFNLEVBQUUsSUFBSSxzQkFBUyxDQUFDLDZCQUFXLENBQUMsTUFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQzlELE9BQU8sRUFBRSxJQUFJLHNCQUFTLENBQUMsNkJBQVcsQ0FBQyxPQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDaEUsVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsNkJBQVcsQ0FBQyxTQUFtQixDQUFDO1FBQzNDLG9CQUFvQixFQUFFLDhCQUFZLENBQUMsRUFBWSxDQUFDO1FBQ2hELFFBQVEsRUFBRSw2QkFBVyxDQUFDLFlBQXNCLENBQUM7S0FDOUMsQ0FBQztBQUNKLENBQUM7QUEvQkQsNERBK0JDO0FBRUQsU0FBZ0IseUJBQXlCLENBQUMsSUFBWTtJQUNwRCxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDO0lBQ2pDLElBQUksUUFBa0IsQ0FBQztJQUN2QixJQUFJLE1BQWdCLENBQUM7SUFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsaUNBQW9CLENBQUMsRUFBRTtRQUMxQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsR0FBRyxhQUFhLENBQ2pGLDhCQUFpQixFQUNqQixtQkFBbUIsQ0FBQyxpQ0FBb0IsRUFBRSxJQUFJLENBQUMsQ0FDaEQsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLDZCQUFXLENBQUMsWUFBc0IsQ0FBQyxDQUFDO0lBQzVELElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyw0Q0FBK0IsQ0FBQyxFQUFFO1FBQy9ELElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxLQUFLLENBQUM7UUFFVixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxhQUFhLENBQzVELHFDQUF3QixFQUN4QixtQkFBbUIsQ0FBQyw0Q0FBK0IsRUFBRSxlQUFlLENBQUMsQ0FDdEUsQ0FBQztRQUVGLFFBQVEsR0FBRyxDQUFDLElBQUksc0JBQVMsQ0FBQyw2QkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLEdBQUcsQ0FBQyxJQUFJLHNCQUFTLENBQUMsNkJBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDeEQ7U0FBTSxJQUFJLDZCQUFXLENBQUMsWUFBc0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyw2Q0FBZ0MsQ0FBQyxFQUFFO1FBQzNGLElBQUksWUFBWSxFQUFFLFVBQVUsQ0FBQztRQUM3QixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxhQUFhLENBQ3RFLHNDQUF5QixFQUN6QixtQkFBbUIsQ0FBQyw2Q0FBZ0MsRUFBRSxlQUFlLENBQUMsQ0FDdkUsQ0FBQztRQUNGLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHNCQUFTLENBQUMsNkJBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDNUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksc0JBQVMsQ0FBQyw2QkFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUN6RTtTQUFNO1FBQ0wsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsT0FBTztRQUNMLEVBQUUsRUFBRSw4QkFBWSxDQUFDLFFBQVEsQ0FBQztRQUMxQixJQUFJLEVBQUUsOEJBQVksQ0FBQyxJQUFJLENBQUM7UUFDeEIsVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxNQUFNLEVBQUUsSUFBSSxzQkFBUyxDQUFDLDZCQUFXLENBQUMsTUFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQzlELFFBQVE7UUFDUixNQUFNO1FBQ04sVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsNkJBQVcsQ0FBQyxTQUFtQixDQUFDO1FBQzNDLG9CQUFvQixFQUFFLDhCQUFZLENBQUMsRUFBWSxDQUFDO1FBQ2hELFFBQVEsRUFBRSxZQUFZO0tBQ3ZCLENBQUM7QUFDSixDQUFDO0FBbERELDhEQWtEQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtJQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBb0IsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUN2RTtJQUVELE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FDakYsOEJBQWlCLEVBQ2pCLG1CQUFtQixDQUFDLGlDQUFvQixFQUFFLElBQUksQ0FBQyxDQUNoRCxDQUFDO0lBRUYsT0FBTztRQUNMLEVBQUUsRUFBRSw4QkFBWSxDQUFDLEVBQVksQ0FBQztRQUM5QixNQUFNLEVBQUUsSUFBSSxzQkFBUyxDQUFDLDZCQUFXLENBQUMsTUFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQzlELFVBQVUsRUFBRSw2QkFBVyxDQUFDLFVBQW9CLENBQUM7UUFDN0MsVUFBVSxFQUFFLDZCQUFXLENBQUMsVUFBb0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsNkJBQVcsQ0FBQyxTQUFtQixDQUFDO1FBQzNDLElBQUksRUFBRSw2QkFBVyxDQUFDLFlBQXNCLENBQUM7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFsQkQsNERBa0JDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFZO0lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHlDQUE0QixDQUFDLEVBQUU7UUFDbEQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxHQUFHLGFBQWEsQ0FDcEQsNkJBQWdCLEVBQ2hCLG1CQUFtQixDQUFDLHlDQUE0QixFQUFFLElBQUksQ0FBQyxDQUN4RCxDQUFDO0lBRUYsT0FBTztRQUNMLGdCQUFnQixFQUFFLDhCQUFZLENBQUMsZ0JBQTBCLENBQUM7UUFDMUQsWUFBWSxFQUFFLDhCQUFZLENBQUMsWUFBc0IsQ0FBQztLQUNuRCxDQUFDO0FBQ0osQ0FBQztBQWRELHNEQWNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBWTtJQUM5QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1FBQ3BCLGlFQUFpRTtRQUNqRSxvRkFBb0Y7UUFDcEYsT0FBTywwQkFBZSxDQUFDLGFBQWEsQ0FBQztLQUN0QztJQUVELGtGQUFrRjtJQUNsRixJQUFJLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtRQUNqQyxlQUFlLEdBQUcsMEJBQWUsQ0FBQyxZQUFZLENBQUM7S0FDaEQ7SUFFRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBZEQsa0RBY0M7QUFFRDs7R0FFRztBQUNILE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsQ0FBQywyQ0FBOEIsQ0FBQyxFQUFFLDBCQUFlLENBQUMsb0JBQW9CO0lBQ3RFLENBQUMsbURBQXNDLENBQUMsRUFBRSwwQkFBZSxDQUFDLHdCQUF3QjtJQUNsRixDQUFDLG1DQUFzQixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxvQkFBb0I7SUFDOUQsQ0FBQyxvQ0FBdUIsQ0FBQyxFQUFFLDBCQUFlLENBQUMscUJBQXFCO0lBQ2hFLENBQUMsc0NBQXlCLENBQUMsRUFBRSwwQkFBZSxDQUFDLHFCQUFxQjtJQUNsRSxDQUFDLHNDQUF5QixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxxQkFBcUI7SUFDbEUsQ0FBQyxpQ0FBb0IsQ0FBQyxFQUFFLDBCQUFlLENBQUMsSUFBSTtJQUM1QyxDQUFDLHlDQUE0QixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxXQUFXO0lBQzNELENBQUMsK0JBQWtCLENBQUMsRUFBRSwwQkFBZSxDQUFDLFVBQVU7SUFDaEQsQ0FBQyxzQ0FBeUIsQ0FBQyxFQUFFLDBCQUFlLENBQUMsSUFBSTtJQUNqRCxDQUFDLHVCQUFZLENBQUMsRUFBRSwwQkFBZSxDQUFDLFdBQVc7SUFDM0MsQ0FBQyx1QkFBWSxDQUFDLEVBQUUsMEJBQWUsQ0FBQyxXQUFXO0lBQzNDLENBQUMsMkJBQWdCLENBQUMsRUFBRSwwQkFBZSxDQUFDLGVBQWU7SUFDbkQsQ0FBQyx5QkFBYyxDQUFDLEVBQUUsMEJBQWUsQ0FBQyxhQUFhO0lBQy9DLENBQUMseUJBQWMsQ0FBQyxFQUFFLDBCQUFlLENBQUMsYUFBYTtJQUMvQyxDQUFDLDJCQUFnQixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxlQUFlO0NBQ3BELENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pELENBQUM7QUFIRCw4Q0FHQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUZELDhDQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IseUJBQXlCLENBQUMsZUFBdUIsRUFBRSxlQUF1QjtJQUN4RixNQUFNLGdCQUFnQixHQUFHLGlDQUFlLENBQ3RDLGVBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDbkQsZUFBTSxDQUFDLElBQUksQ0FBQywyQkFBUyxDQUFDLGdDQUFjLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUNsRixDQUFDO0lBQ0YsT0FBTyw4QkFBWSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFORCw4REFNQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FBQyxjQUFzQixFQUFFLElBQVksRUFBRSxRQUFnQjtJQUNoRyxNQUFNLGtCQUFrQixHQUFHLGtDQUFnQixDQUN6QyxlQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQ2xELGVBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDeEMsZUFBTSxDQUFDLElBQUksQ0FBQywyQkFBUyxDQUFDLGdDQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FDeEQsQ0FBQztJQUNGLE9BQU8sOEJBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBUEQsa0VBT0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMscUJBQTZCO0lBQzVELE1BQU0sTUFBTSxHQUFHLGdDQUFjLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXJGLCtCQUErQjtJQUMvQiw0SEFBNEg7SUFDNUgsT0FBTyw2Q0FBNkMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixDQUFDO0FBTkQsNENBTUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxHQUFtQjtJQUM3QyxPQUFPLDZCQUFXLENBQ2hCLGVBQU0sQ0FBQyxNQUFNLENBQUM7UUFDWiwrQkFBYSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzVELCtCQUFhLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDNUQsMEJBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2hCLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQVJELGtDQVFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixZQUFZLENBQUMsTUFBYztJQUN6QyxPQUFPLENBQ0wsTUFBTSxDQUFDLENBQUMsS0FBSyxTQUFTO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLEtBQUssU0FBUztRQUN0QixNQUFNLENBQUMsQ0FBQyxLQUFLLFNBQVM7UUFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDcEIsQ0FBQztBQUNKLENBQUM7QUFURCxvQ0FTQztBQUlEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxLQUFlLEVBQUUsY0FBc0I7SUFDbkUsU0FBUyxTQUFTLENBQUMsQ0FBVSxFQUFFLENBQVM7UUFDdEMsSUFBSSxlQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxDQUFDLENBQUM7U0FDVjthQUFNLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLGVBQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxDQUFDLENBQUM7U0FDVjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekI7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFRCxPQUFPLHdCQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQWRELHNDQWNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxPQUFlO0lBQ25FLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksZ0NBQXFCLENBQUMsMEJBQTBCLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDdEU7SUFDRCxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsMEJBQTBCLE9BQU8saUJBQWlCLENBQUMsQ0FBQztLQUNyRjtJQUNELE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQVRELGtEQVNDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixRQUFRLENBQUMsb0JBQTRCLEVBQUUsT0FBb0I7SUFDekUsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ25DLElBQUksSUFBSSxZQUFZLHFDQUEyQixFQUFFO1lBQy9DLE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQ2hILENBQUM7U0FDSDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFFSCxvRUFBb0U7SUFDcEUsb0ZBQW9GO0lBQ3BGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDM0IsMEZBQTBGO1FBQzFGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2QjtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFuQkQsNEJBbUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQUMsWUFBc0IsRUFBRSxJQUFZO0lBQ2hGLE1BQU0sVUFBVSxHQUFHLCtCQUFhLENBQUMsMEJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsZ0NBQW1CLENBQUMsQ0FBQztJQUN6RSxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxnQ0FBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRSxPQUFPLDhCQUFZLENBQUMsZUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFORCxzRUFNQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxXQUFtQixFQUFFLElBQVksRUFBRSxVQUFtQjtJQUNuRyxNQUFNLFVBQVUsR0FBRywrQkFBYSxDQUFDLDBCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLEdBQUcsZ0NBQWdDLENBQ3RGLFdBQVcsRUFDWCxVQUFVLEVBQ1YsVUFBVSxDQUNYLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sSUFBSSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDaEYsT0FBTyw4QkFBWSxDQUFDLGVBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBWEQsd0VBV0M7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixzQ0FBc0MsQ0FDcEQsZ0JBQXdCLEVBQ3hCLFdBQW1CLEVBQ25CLElBQVksRUFDWixVQUFtQjtJQUVuQixJQUFJLGdCQUFnQixLQUFLLG9DQUF1QixFQUFFO1FBQ2hELE9BQU8sNEJBQTRCLEVBQUUsQ0FBQztLQUN2QztTQUFNO1FBQ0wsT0FBTyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ3RFO0FBQ0gsQ0FBQztBQVhELHdGQVdDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGdDQUFnQyxDQUM5QyxXQUFtQixFQUNuQixVQUFrQixFQUNsQixVQUFtQjtJQUVuQixJQUFJLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELElBQUksb0JBQW9CLEdBQUcsbUNBQXNCLENBQUM7SUFDbEQsSUFBSSxVQUFVLEVBQUU7UUFDZCxxQkFBcUIsR0FBRyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUQsb0JBQW9CLEdBQUcsbUNBQXNCLENBQUM7S0FDL0M7SUFDRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBWkQsNEVBWUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLDJCQUEyQixDQUFDLElBQVk7SUFDdEQsSUFDRSxDQUFDLENBQ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQ0FBeUIsQ0FBQztRQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLHNDQUF5QixDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0NBQXVCLENBQUMsQ0FDekMsRUFDRDtRQUNBLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw2QkFBNkIsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUN0RTtJQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQ0FBdUIsQ0FBQyxFQUFFO1FBQzVDLE9BQU87WUFDTCxXQUFXLEVBQUUsU0FBUztZQUN0QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLFVBQVUsRUFBRSxTQUFTO1NBQ3RCLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQ0FBeUIsQ0FBQyxFQUFFO1FBQ3JELE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsYUFBYSxDQUM3QyxtQ0FBc0IsRUFDdEIsbUJBQW1CLENBQUMsc0NBQXlCLEVBQUUsSUFBSSxDQUFDLENBQ3JELENBQUM7UUFFRixPQUFPO1lBQ0wsV0FBVyxFQUFFLDhCQUFZLENBQUMsV0FBcUIsQ0FBQztZQUNoRCxtQkFBbUIsRUFBRSw2QkFBVyxDQUFDLFVBQW9CLENBQUM7WUFDdEQsVUFBVSxFQUFFLFNBQVM7U0FDYixDQUFDO0tBQ1o7U0FBTTtRQUNMLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FDekQsbUNBQXNCLEVBQ3RCLG1CQUFtQixDQUFDLHNDQUF5QixFQUFFLElBQUksQ0FBQyxDQUNyRCxDQUFDO1FBRUYsT0FBTztZQUNMLFdBQVcsRUFBRSw4QkFBWSxDQUFDLFdBQXFCLENBQUM7WUFDaEQsbUJBQW1CLEVBQUUsNkJBQVcsQ0FBQyxVQUFvQixDQUFDO1lBQ3RELFVBQVUsRUFBRSw4QkFBWSxDQUFDLFVBQW9CLENBQUM7U0FDdEMsQ0FBQztLQUNaO0FBQ0gsQ0FBQztBQXhDRCxrRUF3Q0M7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsK0JBQStCLENBQ25ELEtBQTZCLEVBQzdCLFdBQW1CLEVBQ25CLEtBQWM7SUFFZCxJQUFJLEtBQUssRUFBRTtRQUNULEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0tBQ3RCO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxvQkFBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztLQUM3QztJQUVELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtRQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7S0FDaEQ7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQztBQWxCRCwwRUFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBhZGRIZXhQcmVmaXgsXG4gIGJ1ZmZlclRvSGV4LFxuICBidWZmZXJUb0ludCxcbiAgZ2VuZXJhdGVBZGRyZXNzLFxuICBpc1ZhbGlkQWRkcmVzcyxcbiAgc2V0TGVuZ3RoTGVmdCxcbiAgc3RyaXBIZXhQcmVmaXgsXG4gIHRvQnVmZmVyLFxuICBnZW5lcmF0ZUFkZHJlc3MyLFxuICBwYWRUb0V2ZW4sXG59IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgeyBCYXNlQ29pbiwgQmFzZU5ldHdvcmssIGNvaW5zLCBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4sIEV0aGVyZXVtTmV0d29yayB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgRXRoZXJldW1Db21tb24gZnJvbSAnQGV0aGVyZXVtanMvY29tbW9uJztcbmltcG9ydCBCTiBmcm9tICdibi5qcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZU1ldGhvZElkLFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIExvY2tNZXRob2RJZCxcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFVubG9ja01ldGhvZElkLFxuICBVbnZvdGVNZXRob2RJZCxcbiAgVm90ZU1ldGhvZElkLFxuICBXaXRoZHJhd01ldGhvZElkLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBFUkMxMTU1VHJhbnNmZXJEYXRhLFxuICBFUkM3MjFUcmFuc2ZlckRhdGEsXG4gIEZsdXNoVG9rZW5zRGF0YSxcbiAgTmF0aXZlVHJhbnNmZXJEYXRhLFxuICBTaWduYXR1cmVQYXJ0cyxcbiAgVG9rZW5UcmFuc2ZlckRhdGEsXG4gIFRyYW5zZmVyRGF0YSxcbiAgVHhEYXRhLFxuICBXYWxsZXRJbml0aWFsaXphdGlvbkRhdGEsXG4gIEZvcndhcmRlckluaXRpYWxpemF0aW9uRGF0YSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICBFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVNZXRob2RJZCxcbiAgRVJDMTE1NUJhdGNoVHJhbnNmZXJUeXBlcyxcbiAgRVJDMTE1NVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCxcbiAgRVJDMTE1NVNhZmVUcmFuc2ZlclR5cGVzLFxuICBFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsXG4gIEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVzLFxuICBmbHVzaENvaW5zTWV0aG9kSWQsXG4gIGZsdXNoQ29pbnNUeXBlcyxcbiAgZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCxcbiAgZmx1c2hUb2tlbnNUeXBlcyxcbiAgc2VuZE11bHRpc2lnTWV0aG9kSWQsXG4gIHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQsXG4gIHNlbmRNdWx0aVNpZ1Rva2VuVHlwZXMsXG4gIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICB3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMsXG4gIHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsXG4gIHdhbGxldFNpbXBsZUNvbnN0cnVjdG9yLFxuICBjcmVhdGVWMVdhbGxldFR5cGVzLFxuICB2MUNyZWF0ZVdhbGxldE1ldGhvZElkLFxuICBjcmVhdGVWMUZvcndhcmRlclR5cGVzLFxuICByZWNvdmVyeVdhbGxldEluaXRpYWxpemF0aW9uRmlyc3RCeXRlcyxcbiAgZGVmYXVsdEZvcndhcmRlclZlcnNpb24sXG4gIGNyZWF0ZVY0Rm9yd2FyZGVyVHlwZXMsXG4gIHY0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsXG59IGZyb20gJy4vd2FsbGV0VXRpbCc7XG5pbXBvcnQgeyBFdGhUcmFuc2FjdGlvbkRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBAcGFyYW0gbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uKG5ldHdvcms6IEV0aGVyZXVtTmV0d29yayk6IEV0aGVyZXVtQ29tbW9uIHtcbiAgcmV0dXJuIEV0aGVyZXVtQ29tbW9uLmZvckN1c3RvbUNoYWluKFxuICAgIC8vIHVzZSB0aGUgbWFpbm5ldCBjb25maWcgYXMgYSBiYXNlLCBvdmVycmlkZSBjaGFpbiBpZHMgYW5kIG5ldHdvcmsgbmFtZVxuICAgICdtYWlubmV0JyxcbiAgICB7XG4gICAgICBuYW1lOiBuZXR3b3JrLnR5cGUsXG4gICAgICBuZXR3b3JrSWQ6IG5ldHdvcmsuY2hhaW5JZCxcbiAgICAgIGNoYWluSWQ6IG5ldHdvcmsuY2hhaW5JZCxcbiAgICB9LFxuICAgICdsb25kb24nXG4gICk7XG59XG5cbi8qKlxuICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBhbGdvcml0aG1cbiAqIGFuZCB0aGUgcHJvdmlkZWQgY29tbW9uIGZvciB0aGUgYmxvY2tjaGFpblxuICpcbiAqIEBwYXJhbSB7VHhEYXRhfSB0cmFuc2FjdGlvbkRhdGEgdGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gc2lnblxuICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIHRoZSBzaWduZXIncyBrZXlwYWlyXG4gKiBAcGFyYW0ge0V0aGVyZXVtQ29tbW9ufSBjdXN0b21Db21tb24gdGhlIG5ldHdvcmsncyBjdXN0b20gY29tbW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdHJhbnNhY3Rpb24gc2lnbmVkIGFuZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW50ZXJuYWwoXG4gIHRyYW5zYWN0aW9uRGF0YTogVHhEYXRhLFxuICBrZXlQYWlyOiBLZXlQYWlyLFxuICBjdXN0b21Db21tb246IEV0aGVyZXVtQ29tbW9uXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIWtleVBhaXIuZ2V0S2V5cygpLnBydikge1xuICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgfVxuICBjb25zdCBldGhUeCA9IEV0aFRyYW5zYWN0aW9uRGF0YS5mcm9tSnNvbih0cmFuc2FjdGlvbkRhdGEsIGN1c3RvbUNvbW1vbik7XG4gIGV0aFR4LnNpZ24oa2V5UGFpcik7XG4gIHJldHVybiBldGhUeC50b1NlcmlhbGl6ZWQoKTtcbn1cblxuLyoqXG4gKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSB7VHhEYXRhfSB0cmFuc2FjdGlvbkRhdGEgdGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gc2lnblxuICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIHRoZSBzaWduZXIncyBrZXlwYWlyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdHJhbnNhY3Rpb24gc2lnbmVkIGFuZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduKHRyYW5zYWN0aW9uRGF0YTogVHhEYXRhLCBrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIHNpZ25JbnRlcm5hbCh0cmFuc2FjdGlvbkRhdGEsIGtleVBhaXIsIGdldENvbW1vbihjb2lucy5nZXQoJ3RldGgnKS5uZXR3b3JrIGFzIEV0aGVyZXVtTmV0d29yaykpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRyYWN0IG1ldGhvZCBlbmNvZGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG8gZGVzdGluYXRpb24gYWRkcmVzc1xuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIEFtb3VudCB0byB0cmFuZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBhZGl0aW9uYWwgbWV0aG9kIGNhbGwgZGF0YVxuICogQHBhcmFtIHtudW1iZXJ9IGV4cGlyZVRpbWUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2Vjb25kc1xuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlSWQgc2VxdWVuY2UgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBjYWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtLSB0aGUgY29udHJhY3QgbWV0aG9kIGVuY29kZWQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZE11bHRpU2lnRGF0YShcbiAgdG86IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nLFxuICBleHBpcmVUaW1lOiBudW1iZXIsXG4gIHNlcXVlbmNlSWQ6IG51bWJlcixcbiAgc2lnbmF0dXJlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0bywgdmFsdWUsIHRvQnVmZmVyKGRhdGEpLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCB0b0J1ZmZlcihzaWduYXR1cmUpXTtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ3NlbmRNdWx0aVNpZycsIHNlbmRNdWx0aVNpZ1R5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShzZW5kTXVsdGlTaWdUeXBlcywgcGFyYW1zKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRyYWN0IG1ldGhvZCBlbmNvZGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG8gZGVzdGluYXRpb24gYWRkcmVzc1xuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIEFtb3VudCB0byB0cmFuZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5Db250cmFjdEFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGVyYzIwIHRva2VuIGNvbnRyYWN0XG4gKiBAcGFyYW0ge251bWJlcn0gZXhwaXJlVGltZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzZWNvbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2VJZCBzZXF1ZW5jZSBpZFxuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSBzaWduYXR1cmUgb2YgdGhlIGNhbGxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0tIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5kTXVsdGlTaWdUb2tlbkRhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGV4cGlyZVRpbWU6IG51bWJlcixcbiAgc2VxdWVuY2VJZDogbnVtYmVyLFxuICBzaWduYXR1cmU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW3RvLCB2YWx1ZSwgdG9rZW5Db250cmFjdEFkZHJlc3MsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHRvQnVmZmVyKHNpZ25hdHVyZSldO1xuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdzZW5kTXVsdGlTaWdUb2tlbicsIHNlbmRNdWx0aVNpZ1Rva2VuVHlwZXMpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKHNlbmRNdWx0aVNpZ1Rva2VuVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGEgcmVxdWlyZWQgdG8gbWFrZSBhIGZsdXNoIHRva2VucyBjb250cmFjdCBjYWxsXG4gKlxuICogQHBhcmFtIGZvcndhcmRlckFkZHJlc3MgVGhlIGZvcndhcmRlciBhZGRyZXNzIHRvIGZsdXNoXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIGZsdXNoIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmcsIHRva2VuQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzc107XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaEZvcndhcmRlclRva2VucycsIGZsdXNoVG9rZW5zVHlwZXMpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGZsdXNoVG9rZW5zVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGEgcmVxdWlyZWQgdG8gbWFrZSBhIGZsdXNoIG5hdGl2ZSBjb2lucyBjb250cmFjdCBjYWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaENvaW5zRGF0YSgpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZsdXNoJywgZmx1c2hDb2luc1R5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaENvaW5zVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgZm9yd2FyZGVyIG1ldGhvZCBjYWxsaW5nIGRhdGFcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUZvcndhcmRlck1ldGhvZElkO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEV0aCBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSB0aGUgdHggaGFzaCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRXRoQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgd2FsbGV0IGNyZWF0aW9uIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGhlIGxpc3Qgb2Ygc2lnbmVyIGFkZHJlc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlV2FsbGV0Q3JlYXRpb25EYXRhKGRhdGE6IHN0cmluZyk6IFdhbGxldEluaXRpYWxpemF0aW9uRGF0YSB7XG4gIGlmICghKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpIHx8IGRhdGEuc3RhcnRzV2l0aCh2MUNyZWF0ZVdhbGxldE1ldGhvZElkKSkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHdhbGxldCBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpKSB7XG4gICAgY29uc3QgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEuc2xpY2UoMiksICdoZXgnKTtcblxuICAgIC8vIHRoZSBsYXN0IDE2MCBieXRlcyBjb250YWluIHRoZSBzZXJpYWxpemVkIGFkZHJlc3MgYXJyYXlcbiAgICBjb25zdCBzZXJpYWxpemVkU2lnbmVycyA9IGRhdGFCdWZmZXIuc2xpY2UoLTE2MCk7XG5cbiAgICBjb25zdCByZXN1bHRFbmNvZGVkUGFyYW1ldGVycyA9IEV0aGVyZXVtQWJpLnJhd0RlY29kZSh3YWxsZXRTaW1wbGVDb25zdHJ1Y3Rvciwgc2VyaWFsaXplZFNpZ25lcnMpO1xuICAgIGlmIChyZXN1bHRFbmNvZGVkUGFyYW1ldGVycy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYENvdWxkIG5vdCBkZWNvZGUgd2FsbGV0IGNvbnN0cnVjdG9yIGJ5dGVjb2RlOiAke3Jlc3VsdEVuY29kZWRQYXJhbWV0ZXJzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogQk5bXSA9IHJlc3VsdEVuY29kZWRQYXJhbWV0ZXJzWzBdO1xuICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gcGFyc2VkIGNvbnN0cnVjdG9yOiAke2FkZHJlc3Nlc31gKTtcbiAgICB9XG5cbiAgICAvLyBzb21ldGltZXMgZXRoZXJldW1qcy1hYmkgcmVtb3ZlcyAwIHBhZGRpbmcgYXQgdGhlIHN0YXJ0IG9mIGFkZHJlc3NlcyxcbiAgICAvLyBzbyB3ZSBzaG91bGQgcGFkIHVudGlsIHRoZXkgYXJlIHRoZSBzdGFuZGFyZCAyMCBieXRlc1xuICAgIGNvbnN0IHBhZGRlZEFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHN0cmlwSGV4UHJlZml4KGFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG5cbiAgICByZXR1cm4geyBvd25lcnM6IHBhZGRlZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IGFkZEhleFByZWZpeChhZGRyZXNzKSkgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVYxV2FsbGV0VHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHYxQ3JlYXRlV2FsbGV0TWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzBdIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHNhbHRCdWZmZXIgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzFdO1xuICAgIGNvbnN0IHNhbHQgPSBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlcik7XG4gICAgY29uc3QgcGFkZGVkQWRkcmVzc2VzID0gYWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gc3RyaXBIZXhQcmVmaXgoYWRkcmVzcy50b1N0cmluZygpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG4gICAgY29uc3Qgb3duZXJzID0gcGFkZGVkQWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gYWRkSGV4UHJlZml4KGFkZHJlc3MpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJzLFxuICAgICAgc2FsdCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCB0cmFuc2ZlciBkYXRhIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHJldHVybnMgcGFyc2VkIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcpOiBUcmFuc2ZlckRhdGEge1xuICBpZiAoZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgIHJldHVybiBkZWNvZGVOYXRpdmVUcmFuc2ZlckRhdGEoZGF0YSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQpKSB7XG4gICAgcmV0dXJuIGRlY29kZVRva2VuVHJhbnNmZXJEYXRhKGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdHJhbnNmZXIgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgdHJhbnNmZXIgZGF0YSBmb3IgdGhlIHNlbmRNdWx0aXNpZ1Rva2VuIGZ1bmN0aW9uIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHJldHVybnMgcGFyc2VkIHRva2VuIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRva2VuVHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IFRva2VuVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBjb25zdCBbdG8sIGFtb3VudCwgdG9rZW5Db250cmFjdEFkZHJlc3MsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIHNlbmRNdWx0aVNpZ1Rva2VuVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdUb2tlbk1ldGhvZElkLCBkYXRhKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdG86IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleChhbW91bnQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIGV4cGlyZVRpbWU6IGJ1ZmZlclRvSW50KGV4cGlyZVRpbWUgYXMgQnVmZmVyKSxcbiAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgc2lnbmF0dXJlOiBidWZmZXJUb0hleChzaWduYXR1cmUgYXMgQnVmZmVyKSxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogYWRkSGV4UHJlZml4KHRva2VuQ29udHJhY3RBZGRyZXNzIGFzIHN0cmluZyksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFUkM3MjFUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogRVJDNzIxVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgc2lnbmF0dXJlXSA9IGdldFJhd0RlY29kZWQoXG4gICAgc2VuZE11bHRpU2lnVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbERhdGFIZXggPSBidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKTtcbiAgaWYgKCFpbnRlcm5hbERhdGFIZXguc3RhcnRzV2l0aChFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBFUkM3MjFTYWZlVHJhbnNmZXJUeXBlcyxcbiAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCwgaW50ZXJuYWxEYXRhSGV4KVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdG86IGFkZEhleFByZWZpeChyZWNlaXZlciBhcyBzdHJpbmcpLFxuICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tIGFzIHN0cmluZyksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleChhbW91bnQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgc2VxdWVuY2VJZDogYnVmZmVyVG9JbnQoc2VxdWVuY2VJZCBhcyBCdWZmZXIpLFxuICAgIHNpZ25hdHVyZTogYnVmZmVyVG9IZXgoc2lnbmF0dXJlIGFzIEJ1ZmZlciksXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgIHVzZXJEYXRhOiBidWZmZXJUb0hleCh1c2VyU2VudERhdGEgYXMgQnVmZmVyKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVSQzExNTVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogRVJDMTE1NVRyYW5zZmVyRGF0YSB7XG4gIGxldCBmcm9tLCByZWNlaXZlciwgdXNlclNlbnREYXRhO1xuICBsZXQgdG9rZW5JZHM6IHN0cmluZ1tdO1xuICBsZXQgdmFsdWVzOiBzdHJpbmdbXTtcblxuICBpZiAoIWRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBjb25zdCBbdG8sIGFtb3VudCwgaW50ZXJuYWxEYXRhLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ01ldGhvZElkLCBkYXRhKVxuICApO1xuXG4gIGNvbnN0IGludGVybmFsRGF0YUhleCA9IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpO1xuICBpZiAoaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoRVJDMTE1NVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCkpIHtcbiAgICBsZXQgdG9rZW5JZDtcbiAgICBsZXQgdmFsdWU7XG5cbiAgICBbZnJvbSwgcmVjZWl2ZXIsIHRva2VuSWQsIHZhbHVlLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoRVJDMTE1NVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCwgaW50ZXJuYWxEYXRhSGV4KVxuICAgICk7XG5cbiAgICB0b2tlbklkcyA9IFtuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRva2VuSWQpKS50b0ZpeGVkKCldO1xuICAgIHZhbHVlcyA9IFtuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHZhbHVlKSkudG9GaXhlZCgpXTtcbiAgfSBlbHNlIGlmIChidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKS5zdGFydHNXaXRoKEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkKSkge1xuICAgIGxldCB0ZW1wVG9rZW5JZHMsIHRlbXBWYWx1ZXM7XG4gICAgW2Zyb20sIHJlY2VpdmVyLCB0ZW1wVG9rZW5JZHMsIHRlbXBWYWx1ZXMsIHVzZXJTZW50RGF0YV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgRVJDMTE1NUJhdGNoVHJhbnNmZXJUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoRVJDMTE1NUJhdGNoVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuICAgIHRva2VuSWRzID0gdGVtcFRva2VuSWRzLm1hcCgoeCkgPT4gbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh4KSkudG9GaXhlZCgpKTtcbiAgICB2YWx1ZXMgPSB0ZW1wVmFsdWVzLm1hcCgoeCkgPT4gbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh4KSkudG9GaXhlZCgpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIpLFxuICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tKSxcbiAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgdG9rZW5JZHMsXG4gICAgdmFsdWVzLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBhZGRIZXhQcmVmaXgodG8gYXMgc3RyaW5nKSxcbiAgICB1c2VyRGF0YTogdXNlclNlbnREYXRhLFxuICB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgdHJhbnNmZXIgZGF0YSBmb3IgdGhlIHNlbmRNdWx0aXNpZyBmdW5jdGlvbiBhbmQgcmV0dXJuIHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVOYXRpdmVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogTmF0aXZlVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgc2lnbmF0dXJlXSA9IGdldFJhd0RlY29kZWQoXG4gICAgc2VuZE11bHRpU2lnVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHRvOiBhZGRIZXhQcmVmaXgodG8gYXMgc3RyaW5nKSxcbiAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgc2VxdWVuY2VJZDogYnVmZmVyVG9JbnQoc2VxdWVuY2VJZCBhcyBCdWZmZXIpLFxuICAgIHNpZ25hdHVyZTogYnVmZmVyVG9IZXgoc2lnbmF0dXJlIGFzIEJ1ZmZlciksXG4gICAgZGF0YTogYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlciksXG4gIH07XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCBmbHVzaCB0b2tlbnMgZGF0YSBhbmQgcmV0dXJuIHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbHVzaFRva2Vuc0RhdGEoZGF0YTogc3RyaW5nKTogRmx1c2hUb2tlbnNEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBjb25zdCBbZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzXSA9IGdldFJhd0RlY29kZWQoXG4gICAgZmx1c2hUb2tlbnNUeXBlcyxcbiAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsIGRhdGEpXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb3J3YXJkZXJBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIHRva2VuQWRkcmVzczogYWRkSGV4UHJlZml4KHRva2VuQWRkcmVzcyBhcyBzdHJpbmcpLFxuICB9O1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBkYXRhIGJhc2VkIGFzIGEgdHJhbnNhY3Rpb24gdHlwZS5cbiAqIEVUSCB0cmFuc2FjdGlvbnMgYXJlIGRlZmluZWQgYnkgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHRyYW5zYWN0aW9uIGRhdGEsIGFsc28ga25vd24gYXMgdGhlIG1ldGhvZCBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGNsYXNzaWZ5IHRoZSB0cmFuc2FjdGlvbiB3aXRoXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSBUaGUgY2xhc3NpZmllZCB0cmFuc2FjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVRyYW5zYWN0aW9uKGRhdGE6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgLy8gY29udHJhY3QgY2FsbHMgbXVzdCBoYXZlIGF0IGxlYXN0IDQgYnl0ZXMgKG1ldGhvZCBpZCkgYW5kICcweCdcbiAgICAvLyBpZiBpdCBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gYmUgYSBjb250cmFjdCBjYWxsIGl0IG11c3QgYmUgYSBzaW5nbGUgc2lnIHNlbmRcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNpbmdsZVNpZ1NlbmQ7XG4gIH1cblxuICAvLyBUT0RPKFNUTFgtMTk3MCk6IHZhbGlkYXRlIGlmIHdlIGFyZSBnb2luZyB0byBjb25zdHJhaW50IHRvIHNvbWUgbWV0aG9kcyBhbGxvd2VkXG4gIGxldCB0cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGVzTWFwW2RhdGEuc2xpY2UoMCwgMTApLnRvTG93ZXJDYXNlKCldO1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHR5cGVzIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0aW5nIHBhcnQgb2YgdGhlIGVuY29kZWQgZGF0YVxuICovXG5jb25zdCB0cmFuc2FjdGlvblR5cGVzTWFwID0ge1xuICBbd2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzXTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICBbcmVjb3ZlcnlXYWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXNdOiBUcmFuc2FjdGlvblR5cGUuUmVjb3ZlcnlXYWxsZXREZXBsb3ltZW50LFxuICBbdjFDcmVhdGVXYWxsZXRNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgW2NyZWF0ZUZvcndhcmRlck1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgW3YxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uLFxuICBbdjRDcmVhdGVGb3J3YXJkZXJNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24sXG4gIFtzZW5kTXVsdGlzaWdNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICBbZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaFRva2VucyxcbiAgW2ZsdXNoQ29pbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaENvaW5zLFxuICBbc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICBbTG9ja01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdMb2NrLFxuICBbVm90ZU1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdWb3RlLFxuICBbQWN0aXZhdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUsXG4gIFtVbnZvdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW52b3RlLFxuICBbVW5sb2NrTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayxcbiAgW1dpdGhkcmF3TWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3LFxufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG51bSBudW1iZXIgdG8gYmUgY29udmVydGVkIHRvIGhleFxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGhleCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvSGV4U3RyaW5nKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaGV4ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGhleC5sZW5ndGggJSAyID09PSAwID8gJzB4JyArIGhleCA6ICcweDAnICsgaGV4O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGV4IFRoZSBoZXggc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHJldHVybnMge251bWJlcn0gdGhlIHJlc3VsdGluZyBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhleFN0cmluZ1RvTnVtYmVyKGhleDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBhcnNlSW50KGhleC5zbGljZSgyKSwgMTYpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBhZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgYWRkcmVzcyB0byBiZSBkZXBsb3llZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250cmFjdEFkZHJlc3MgdGhlIGFkZHJlc3Mgd2hpY2ggaXMgY3JlYXRpbmcgdGhpcyBuZXcgYWRkcmVzc1xuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRyYWN0Q291bnRlciB0aGUgbm9uY2Ugb2YgdGhlIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBjYWxjdWxhdGVkIGZvcndhcmRlciBjb250cmFjdCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVGb3J3YXJkZXJBZGRyZXNzKGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLCBjb250cmFjdENvdW50ZXI6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSBnZW5lcmF0ZUFkZHJlc3MoXG4gICAgQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoY29udHJhY3RBZGRyZXNzKSwgJ2hleCcpLFxuICAgIEJ1ZmZlci5mcm9tKHBhZFRvRXZlbihzdHJpcEhleFByZWZpeChudW1iZXJUb0hleFN0cmluZyhjb250cmFjdENvdW50ZXIpKSksICdoZXgnKVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KGZvcndhcmRlckFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGZvcndhcmRlciB2MSBhZGRyZXNzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYGNyZWF0b3JBZGRyZXNzYCBjcmVhdGVzIGl0IHdpdGggc2FsdCBgc2FsdGBcbiAqIGFuZCBpbml0Y29kZSBgaW5pY29kZSB1c2luZyB0aGUgY3JlYXRlMiBvcGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjcmVhdG9yQWRkcmVzcyBUaGUgYWRkcmVzcyB0aGF0IGlzIHNlbmRpbmcgdGhlIHR4IHRvIGNyZWF0ZSBhIG5ldyBhZGRyZXNzLCBoZXggc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCBUaGUgc2FsdCB0byBjcmVhdGUgdGhlIGFkZHJlc3Mgd2l0aCB1c2luZyBjcmVhdGUyLCBoZXggc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5pdGNvZGUgVGhlIGluaXRjb2RlIHRoYXQgd2lsbCBiZSBkZXBsb3llZCB0byB0aGUgYWRkcmVzcywgaGV4IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FsY3VsYXRlZCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVGb3J3YXJkZXJWMUFkZHJlc3MoY3JlYXRvckFkZHJlc3M6IHN0cmluZywgc2FsdDogc3RyaW5nLCBpbml0Y29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm9yd2FyZGVyVjFBZGRyZXNzID0gZ2VuZXJhdGVBZGRyZXNzMihcbiAgICBCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChjcmVhdG9yQWRkcmVzcyksICdoZXgnKSxcbiAgICBCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzYWx0KSwgJ2hleCcpLFxuICAgIEJ1ZmZlci5mcm9tKHBhZFRvRXZlbihzdHJpcEhleFByZWZpeChpbml0Y29kZSkpLCAnaGV4JylcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChmb3J3YXJkZXJWMUFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBUYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBhZGRyZXNzIGZvciB0aGUgcHJveHkgY29udHJhY3QsIGFuZCBnZXQgdGhlIGJpbmFyeSBpbml0Y29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgcHJveHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbXBsZW1lbnRhdGlvbkFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNvbnRyYWN0IGZvciB0aGUgcHJveHlcbiAqIEByZXR1cm4ge3N0cmluZ30gQmluYXJ5IGhleCBzdHJpbmcgb2YgdGhlIHByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm94eUluaXRjb2RlKGltcGxlbWVudGF0aW9uQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0ID0gc3RyaXBIZXhQcmVmaXgoaW1wbGVtZW50YXRpb25BZGRyZXNzLnRvTG93ZXJDYXNlKCkpLnBhZFN0YXJ0KDQwLCAnMCcpO1xuXG4gIC8vIGJ5dGVjb2RlIG9mIHRoZSBwcm94eSwgZnJvbTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0JpdEdvL2V0aC1tdWx0aXNpZy12NC9ibG9iL2Q1NDZhOTM3ZjkwZjkzZTgzYjM0MjNhNWJmOTMzZDFkNzdjNjc3YzMvY29udHJhY3RzL0Nsb25lRmFjdG9yeS5zb2wjTDQyLUw1NlxuICByZXR1cm4gYDB4M2Q2MDJkODA2MDBhM2QzOTgxZjMzNjNkM2QzNzNkM2QzZDM2M2Q3MyR7dGFyZ2V0fTVhZjQzZDgyODAzZTkwM2Q5MTYwMmI1N2ZkNWJmM2A7XG59XG5cbi8qKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gc2lnbmF0dXJlIHBhcnRzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQYXJ0c30gc2lnIFRoZSBzaWduYXR1cmUgdG8gY29udmVydCB0byBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2lnbmF0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZ1NpZyhzaWc6IFNpZ25hdHVyZVBhcnRzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1ZmZlclRvSGV4KFxuICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgc2V0TGVuZ3RoTGVmdChCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzaWcuciksICdoZXgnKSwgMzIpLFxuICAgICAgc2V0TGVuZ3RoTGVmdChCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzaWcucyksICdoZXgnKSwgMzIpLFxuICAgICAgdG9CdWZmZXIoc2lnLnYpLFxuICAgIF0pXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0eCBkYXRhIGhhcyBhIHNpZ25hdHVyZVxuICpcbiAqIEBwYXJhbSB7VHhEYXRhfSB0eERhdGEgVGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gY2hlY2sgZm9yIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHR4IGhhcyBhIHNpZ25hdHVyZSwgZWxzZSBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzU2lnbmF0dXJlKHR4RGF0YTogVHhEYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHhEYXRhLnYgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR4RGF0YS5yICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eERhdGEucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHhEYXRhLnYubGVuZ3RoID4gMCAmJlxuICAgIHR4RGF0YS5yLmxlbmd0aCA+IDAgJiZcbiAgICB0eERhdGEucy5sZW5ndGggPiAwXG4gICk7XG59XG5cbnR5cGUgUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgPSBzdHJpbmcgfCBCdWZmZXIgfCBCTiB8IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nW107XG5cbi8qKlxuICogR2V0IHRoZSByYXcgZGF0YSBkZWNvZGVkIGZvciBzb21lIHR5cGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdHlwZXMgQUJJIHR5cGVzIGRlZmluaXRpb25cbiAqIEBwYXJhbSB7QnVmZmVyfSBzZXJpYWxpemVkQXJncyBlbmNvZGVkIGFyZ3NcbiAqIEByZXR1cm5zIHtCdWZmZXJbXX0gdGhlIGRlY29kZWQgcmF3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYXdEZWNvZGVkKHR5cGVzOiBzdHJpbmdbXSwgc2VyaWFsaXplZEFyZ3M6IEJ1ZmZlcik6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nW10ge1xuICBmdW5jdGlvbiBub3JtYWxpemUodjogdW5rbm93biwgaTogbnVtYmVyKTogdW5rbm93biB7XG4gICAgaWYgKEJOLmlzQk4odikpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnIHx8IEJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICByZXR1cm4gdi5tYXAobm9ybWFsaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgJHt0eXBlc31bJHtpfV0gZ290ICR7dHlwZW9mIHZ9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEV0aGVyZXVtQWJpLnJhd0RlY29kZSh0eXBlcywgc2VyaWFsaXplZEFyZ3MpLm1hcChub3JtYWxpemUpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYnVmZmVyZWQgYnl0ZWNvZGUgZnJvbSByYXdEYXRhIHVzaW5nIGEgbWV0aG9kSWQgYXMgZGVsaW1pdGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZElkIHRoZSBoZXggZW5jb2RlZCBtZXRob2QgSWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdEYXRhIHRoZSBoZXggZW5jb2RlZCByYXcgZGF0YVxuICogQHJldHVybnMge0J1ZmZlcn0gZGF0YSBidWZmZXJlZCBieXRlY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVmZmVyZWRCeXRlQ29kZShtZXRob2RJZDogc3RyaW5nLCByYXdEYXRhOiBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCBzcGxpdEJ5dGVjb2RlID0gcmF3RGF0YS5zcGxpdChtZXRob2RJZCk7XG4gIGlmIChzcGxpdEJ5dGVjb2RlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgc2VuZCBieXRlY29kZTogJHtyYXdEYXRhfWApO1xuICB9XG4gIGlmIChzcGxpdEJ5dGVjb2RlWzFdLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHNlbmQgYnl0ZWNvZGU6ICR7cmF3RGF0YX0gKHdyb25nIGxlbmdodClgKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oc3BsaXRCeXRlY29kZVsxXSwgJ2hleCcpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIGNvbnRyYWN0IGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzIFRoZSBjb250cmFjdCBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRva2VuKHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiYgY29pbi5jb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICAvLyBpZiBsZW5ndGggb2YgdG9rZW5zIGlzIDEsIHJldHVybiB0aGUgZmlyc3QsIGVsc2UgcmV0dXJuIHVuZGVmaW5lZFxuICAvLyBDYW4ndCBkaXJlY3RseSBpbmRleCBpbnRvIHRva2Vucywgb3IgY2FsbCBgbGVuZ3RoYCwgc28gd2UgdXNlIG1hcCB0byBnZXQgYW4gYXJyYXlcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgd2FsbGV0IG1ldGhvZCBjYWxsaW5nIGRhdGEgZm9yIHYxIHdhbGxldHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB3YWxsZXRPd25lcnMgLSB3YWxsZXQgb3duZXIgYWRkcmVzc2VzIGZvciB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCAtIFRoZSBzYWx0IGZvciB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVXYWxsZXQgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFYxV2FsbGV0SW5pdGlhbGl6YXRpb25EYXRhKHdhbGxldE93bmVyczogc3RyaW5nW10sIHNhbHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHRCdWZmZXIgPSBzZXRMZW5ndGhMZWZ0KHRvQnVmZmVyKHNhbHQpLCAzMik7XG4gIGNvbnN0IHBhcmFtcyA9IFt3YWxsZXRPd25lcnMsIHNhbHRCdWZmZXJdO1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY3JlYXRlV2FsbGV0JywgY3JlYXRlVjFXYWxsZXRUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoY3JlYXRlVjFXYWxsZXRUeXBlcywgcGFyYW1zKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNyZWF0ZSBhZGRyZXNzIG1ldGhvZCBjYWxsaW5nIGRhdGEgZm9yIHYxLCB2MiwgdjQgZm9yd2FyZGVyc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlQWRkcmVzcyAtIFRoZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0IC0gVGhlIHNhbHQgZm9yIGFkZHJlc3MgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlQWRkcmVzcyAtIFRoZSBmZWUgYWRkcmVzcyBmb3IgdGhlIGVudGVycHJpc2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNyZWF0ZUZvcndhcmRlciBtZXRob2QgZW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VjFBZGRyZXNzSW5pdGlhbGl6YXRpb25EYXRhKGJhc2VBZGRyZXNzOiBzdHJpbmcsIHNhbHQ6IHN0cmluZywgZmVlQWRkcmVzcz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHRCdWZmZXIgPSBzZXRMZW5ndGhMZWZ0KHRvQnVmZmVyKHNhbHQpLCAzMik7XG4gIGNvbnN0IHsgY3JlYXRlRm9yd2FyZGVyUGFyYW1zLCBjcmVhdGVGb3J3YXJkZXJUeXBlcyB9ID0gZ2V0Q3JlYXRlRm9yd2FyZGVyUGFyYW1zQW5kVHlwZXMoXG4gICAgYmFzZUFkZHJlc3MsXG4gICAgc2FsdEJ1ZmZlcixcbiAgICBmZWVBZGRyZXNzXG4gICk7XG5cbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NyZWF0ZUZvcndhcmRlcicsIGNyZWF0ZUZvcndhcmRlclR5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShjcmVhdGVGb3J3YXJkZXJUeXBlcywgY3JlYXRlRm9yd2FyZGVyUGFyYW1zKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNyZWF0ZSBhZGRyZXNzIG1ldGhvZCBjYWxsaW5nIGRhdGEgZm9yIGFsbCBmb3J3YXJkZXIgdmVyc2lvbnNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yd2FyZGVyVmVyc2lvbiAtIFRoZSB2ZXJzaW9uIG9mIHRoZSBmb3J3YXJkZXIgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZUFkZHJlc3MgLSBUaGUgYWRkcmVzcyBvZiB0aGUgd2FsbGV0IGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCAtIFRoZSBzYWx0IGZvciBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZUFkZHJlc3MgLSBUaGUgZmVlIGFkZHJlc3MgZm9yIHRoZSBlbnRlcnByaXNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzSW5pdERhdGFBbGxGb3J3YXJkZXJWZXJzaW9ucyhcbiAgZm9yd2FyZGVyVmVyc2lvbjogbnVtYmVyLFxuICBiYXNlQWRkcmVzczogc3RyaW5nLFxuICBzYWx0OiBzdHJpbmcsXG4gIGZlZUFkZHJlc3M/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChmb3J3YXJkZXJWZXJzaW9uID09PSBkZWZhdWx0Rm9yd2FyZGVyVmVyc2lvbikge1xuICAgIHJldHVybiBnZXRBZGRyZXNzSW5pdGlhbGl6YXRpb25EYXRhKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldFYxQWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YShiYXNlQWRkcmVzcywgc2FsdCwgZmVlQWRkcmVzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGVGb3J3YXJkZXJUeXBlcyBhbmQgY3JlYXRlRm9yd2FyZGVyUGFyYW1zIGZvciBhbGwgZm9yd2FyZGVyIHZlcnNpb25zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VBZGRyZXNzIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldCBjb250cmFjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHNhbHRCdWZmZXIgLSBUaGUgc2FsdCBmb3IgYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGZlZUFkZHJlc3MgLSBUaGUgZmVlIGFkZHJlc3MgZm9yIHRoZSBlbnRlcnByaXNlXG4gKiBAcmV0dXJucyB7Y3JlYXRlRm9yd2FyZGVyUGFyYW1zOiAoc3RyaW5nIHwgQnVmZmVyKVtdLCBjcmVhdGVGb3J3YXJkZXJUeXBlczogc3RyaW5nW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVGb3J3YXJkZXJQYXJhbXNBbmRUeXBlcyhcbiAgYmFzZUFkZHJlc3M6IHN0cmluZyxcbiAgc2FsdEJ1ZmZlcjogQnVmZmVyLFxuICBmZWVBZGRyZXNzPzogc3RyaW5nXG4pOiB7IGNyZWF0ZUZvcndhcmRlclBhcmFtczogKHN0cmluZyB8IEJ1ZmZlcilbXTsgY3JlYXRlRm9yd2FyZGVyVHlwZXM6IHN0cmluZ1tdIH0ge1xuICBsZXQgY3JlYXRlRm9yd2FyZGVyUGFyYW1zID0gW2Jhc2VBZGRyZXNzLCBzYWx0QnVmZmVyXTtcbiAgbGV0IGNyZWF0ZUZvcndhcmRlclR5cGVzID0gY3JlYXRlVjFGb3J3YXJkZXJUeXBlcztcbiAgaWYgKGZlZUFkZHJlc3MpIHtcbiAgICBjcmVhdGVGb3J3YXJkZXJQYXJhbXMgPSBbYmFzZUFkZHJlc3MsIGZlZUFkZHJlc3MsIHNhbHRCdWZmZXJdO1xuICAgIGNyZWF0ZUZvcndhcmRlclR5cGVzID0gY3JlYXRlVjRGb3J3YXJkZXJUeXBlcztcbiAgfVxuICByZXR1cm4geyBjcmVhdGVGb3J3YXJkZXJQYXJhbXMsIGNyZWF0ZUZvcndhcmRlclR5cGVzIH07XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCBjcmVhdGUgZm9yd2FyZGVyIGRhdGEgYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyBwYXJzZWQgdHJhbnNmZXIgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRm9yd2FyZGVyQ3JlYXRpb25EYXRhKGRhdGE6IHN0cmluZyk6IEZvcndhcmRlckluaXRpYWxpemF0aW9uRGF0YSB7XG4gIGlmIChcbiAgICAhKFxuICAgICAgZGF0YS5zdGFydHNXaXRoKHY0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpIHx8XG4gICAgICBkYXRhLnN0YXJ0c1dpdGgodjFDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCkgfHxcbiAgICAgIGRhdGEuc3RhcnRzV2l0aChjcmVhdGVGb3J3YXJkZXJNZXRob2RJZClcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgYWRkcmVzcyBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhcnRzV2l0aChjcmVhdGVGb3J3YXJkZXJNZXRob2RJZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZUFkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICAgIGFkZHJlc3NDcmVhdGlvblNhbHQ6IHVuZGVmaW5lZCxcbiAgICAgIGZlZUFkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9IGVsc2UgaWYgKGRhdGEuc3RhcnRzV2l0aCh2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkKSkge1xuICAgIGNvbnN0IFtiYXNlQWRkcmVzcywgc2FsdEJ1ZmZlcl0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgY3JlYXRlVjFGb3J3YXJkZXJUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUodjFDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VBZGRyZXNzOiBhZGRIZXhQcmVmaXgoYmFzZUFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIGFkZHJlc3NDcmVhdGlvblNhbHQ6IGJ1ZmZlclRvSGV4KHNhbHRCdWZmZXIgYXMgQnVmZmVyKSxcbiAgICAgIGZlZUFkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICB9IGFzIGNvbnN0O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtiYXNlQWRkcmVzcywgZmVlQWRkcmVzcywgc2FsdEJ1ZmZlcl0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgY3JlYXRlVjRGb3J3YXJkZXJUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUodjRDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VBZGRyZXNzOiBhZGRIZXhQcmVmaXgoYmFzZUFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIGFkZHJlc3NDcmVhdGlvblNhbHQ6IGJ1ZmZlclRvSGV4KHNhbHRCdWZmZXIgYXMgQnVmZmVyKSxcbiAgICAgIGZlZUFkZHJlc3M6IGFkZEhleFByZWZpeChmZWVBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgfSBhcyBjb25zdDtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2UgYSBxdWVyeSB0byBleHBsb3JlciBmb3IgaW5mb3JtYXRpb24gc3VjaCBhcyBiYWxhbmNlLCB0b2tlbiBiYWxhbmNlLCBzb2xpZGl0eSBjYWxsc1xuICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5IGtleS12YWx1ZSBwYWlycyBvZiBwYXJhbWV0ZXJzIHRvIGFwcGVuZCBhZnRlciAvYXBpXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW4gdGhlIEFQSSB0b2tlbiB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwbG9yZXJVcmwgdGhlIFVSTCBvZiB0aGUgZXhwbG9yZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IHJlc3BvbnNlIGZyb20gZXhwbG9yZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoXG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBleHBsb3JlclVybDogc3RyaW5nLFxuICB0b2tlbj86IHN0cmluZ1xuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAodG9rZW4pIHtcbiAgICBxdWVyeS5hcGlrZXkgPSB0b2tlbjtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZ2V0KGAke2V4cGxvcmVyVXJsfS9hcGlgKS5xdWVyeShxdWVyeSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWNoIGV4cGxvcmVyJyk7XG4gIH1cblxuICBpZiAocmVzcG9uc2UuYm9keS5zdGF0dXMgPT09ICcwJyAmJiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UgPT09ICdOT1RPSycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGxvcmVyIHJhdGUgbGltaXQgcmVhY2hlZCcpO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5ib2R5O1xufVxuIl19
|
|
650
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQUFnQztBQUNoQyw0REFBaUM7QUFDakMsb0RBQTRCO0FBQzVCLHFEQVd5QjtBQUN6Qiw0Q0FBNEc7QUFDNUcsb0VBQXlDO0FBQ3pDLGdFQUFnRDtBQUNoRCxrREFBdUI7QUFDdkIsZ0VBQXFDO0FBQ3JDLDhDQVV5QjtBQWV6Qiw2Q0EwQnNCO0FBQ3RCLG1DQUE2QztBQUU3Qzs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxPQUF3QjtJQUNoRCxPQUFPLGdCQUFjLENBQUMsY0FBYztJQUNsQyx3RUFBd0U7SUFDeEUsU0FBUyxFQUNUO1FBQ0UsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTztRQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87S0FDekIsRUFDRCxRQUFRLENBQ1QsQ0FBQztBQUNKLENBQUM7QUFYRCw4QkFXQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFlBQVksQ0FDaEMsZUFBdUIsRUFDdkIsT0FBZ0IsRUFDaEIsWUFBNEI7SUFFNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsTUFBTSxJQUFJLHVCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQUMvQztJQUNELE1BQU0sS0FBSyxHQUFHLDBCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixPQUFPLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBWEQsb0NBV0M7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLGVBQXVCLEVBQUUsT0FB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QUssQ0FBQztLQUN0QjtJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sb0JBQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7S0FDN0M7SUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7UUFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0tBQ2hEO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFsQkQsMEVBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3N1cGVyYWdlbnQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgYWRkSGV4UHJlZml4LFxuICBidWZmZXJUb0hleCxcbiAgYnVmZmVyVG9JbnQsXG4gIGdlbmVyYXRlQWRkcmVzcyxcbiAgaXNWYWxpZEFkZHJlc3MsXG4gIHNldExlbmd0aExlZnQsXG4gIHN0cmlwSGV4UHJlZml4LFxuICB0b0J1ZmZlcixcbiAgZ2VuZXJhdGVBZGRyZXNzMixcbiAgcGFkVG9FdmVuLFxufSBmcm9tICdldGhlcmV1bWpzLXV0aWwnO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBjb2lucywgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuLCBFdGhlcmV1bU5ldHdvcmsgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IEV0aGVyZXVtQ29tbW9uIGZyb20gJ0BldGhlcmV1bWpzL2NvbW1vbic7XG5pbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVNZXRob2RJZCxcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBMb2NrTWV0aG9kSWQsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVbmxvY2tNZXRob2RJZCxcbiAgVW52b3RlTWV0aG9kSWQsXG4gIFZvdGVNZXRob2RJZCxcbiAgV2l0aGRyYXdNZXRob2RJZCxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHtcbiAgRVJDMTE1NVRyYW5zZmVyRGF0YSxcbiAgRVJDNzIxVHJhbnNmZXJEYXRhLFxuICBGbHVzaFRva2Vuc0RhdGEsXG4gIE5hdGl2ZVRyYW5zZmVyRGF0YSxcbiAgU2lnbmF0dXJlUGFydHMsXG4gIFRva2VuVHJhbnNmZXJEYXRhLFxuICBUcmFuc2ZlckRhdGEsXG4gIFR4RGF0YSxcbiAgV2FsbGV0SW5pdGlhbGl6YXRpb25EYXRhLFxuICBGb3J3YXJkZXJJbml0aWFsaXphdGlvbkRhdGEsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQge1xuICBjcmVhdGVGb3J3YXJkZXJNZXRob2RJZCxcbiAgRVJDMTE1NUJhdGNoVHJhbnNmZXJUeXBlTWV0aG9kSWQsXG4gIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZXMsXG4gIEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsXG4gIEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlcyxcbiAgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkM3MjFTYWZlVHJhbnNmZXJUeXBlcyxcbiAgZmx1c2hDb2luc01ldGhvZElkLFxuICBmbHVzaENvaW5zVHlwZXMsXG4gIGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsXG4gIGZsdXNoVG9rZW5zVHlwZXMsXG4gIHNlbmRNdWx0aXNpZ01ldGhvZElkLFxuICBzZW5kTXVsdGlzaWdUb2tlbk1ldGhvZElkLFxuICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzLFxuICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgd2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzLFxuICB2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICB3YWxsZXRTaW1wbGVDb25zdHJ1Y3RvcixcbiAgY3JlYXRlVjFXYWxsZXRUeXBlcyxcbiAgdjFDcmVhdGVXYWxsZXRNZXRob2RJZCxcbiAgY3JlYXRlVjFGb3J3YXJkZXJUeXBlcyxcbiAgcmVjb3ZlcnlXYWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMsXG4gIGRlZmF1bHRGb3J3YXJkZXJWZXJzaW9uLFxuICBjcmVhdGVWNEZvcndhcmRlclR5cGVzLFxuICB2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxufSBmcm9tICcuL3dhbGxldFV0aWwnO1xuaW1wb3J0IHsgRXRoVHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbihuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmspOiBFdGhlcmV1bUNvbW1vbiB7XG4gIHJldHVybiBFdGhlcmV1bUNvbW1vbi5mb3JDdXN0b21DaGFpbihcbiAgICAvLyB1c2UgdGhlIG1haW5uZXQgY29uZmlnIGFzIGEgYmFzZSwgb3ZlcnJpZGUgY2hhaW4gaWRzIGFuZCBuZXR3b3JrIG5hbWVcbiAgICAnbWFpbm5ldCcsXG4gICAge1xuICAgICAgbmFtZTogbmV0d29yay50eXBlLFxuICAgICAgbmV0d29ya0lkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgICBjaGFpbklkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgfSxcbiAgICAnbG9uZG9uJ1xuICApO1xufVxuXG4vKipcbiAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgYXBwcm9wcmlhdGUgYWxnb3JpdGhtXG4gKiBhbmQgdGhlIHByb3ZpZGVkIGNvbW1vbiBmb3IgdGhlIGJsb2NrY2hhaW5cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHBhcmFtIHtFdGhlcmV1bUNvbW1vbn0gY3VzdG9tQ29tbW9uIHRoZSBuZXR3b3JrJ3MgY3VzdG9tIGNvbW1vblxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkludGVybmFsKFxuICB0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSxcbiAga2V5UGFpcjogS2V5UGFpcixcbiAgY3VzdG9tQ29tbW9uOiBFdGhlcmV1bUNvbW1vblxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gIH1cbiAgY29uc3QgZXRoVHggPSBFdGhUcmFuc2FjdGlvbkRhdGEuZnJvbUpzb24odHJhbnNhY3Rpb25EYXRhLCBjdXN0b21Db21tb24pO1xuICBldGhUeC5zaWduKGtleVBhaXIpO1xuICByZXR1cm4gZXRoVHgudG9TZXJpYWxpemVkKCk7XG59XG5cbi8qKlxuICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbih0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSwga2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBzaWduSW50ZXJuYWwodHJhbnNhY3Rpb25EYXRhLCBrZXlQYWlyLCBnZXRDb21tb24oY29pbnMuZ2V0KCd0ZXRoJykubmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgYWRpdGlvbmFsIG1ldGhvZCBjYWxsIGRhdGFcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBpcmVUaW1lIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNlY29uZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZUlkIHNlcXVlbmNlIGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIHNpZ25hdHVyZSBvZiB0aGUgY2FsbFxuICogQHJldHVybnMge3N0cmluZ30gLS0gdGhlIGNvbnRyYWN0IG1ldGhvZCBlbmNvZGVkIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRNdWx0aVNpZ0RhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyxcbiAgZXhwaXJlVGltZTogbnVtYmVyLFxuICBzZXF1ZW5jZUlkOiBudW1iZXIsXG4gIHNpZ25hdHVyZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSBbdG8sIHZhbHVlLCB0b0J1ZmZlcihkYXRhKSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgdG9CdWZmZXIoc2lnbmF0dXJlKV07XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdzZW5kTXVsdGlTaWcnLCBzZW5kTXVsdGlTaWdUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoc2VuZE11bHRpU2lnVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBlcmMyMCB0b2tlbiBjb250cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IGV4cGlyZVRpbWUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2Vjb25kc1xuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlSWQgc2VxdWVuY2UgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBjYWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtLSB0aGUgY29udHJhY3QgbWV0aG9kIGVuY29kZWQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZE11bHRpU2lnVG9rZW5EYXRhKFxuICB0bzogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBleHBpcmVUaW1lOiBudW1iZXIsXG4gIHNlcXVlbmNlSWQ6IG51bWJlcixcbiAgc2lnbmF0dXJlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0bywgdmFsdWUsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCB0b0J1ZmZlcihzaWduYXR1cmUpXTtcblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnc2VuZE11bHRpU2lnVG9rZW4nLCBzZW5kTXVsdGlTaWdUb2tlblR5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShzZW5kTXVsdGlTaWdUb2tlblR5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCB0b2tlbnMgY29udHJhY3QgY2FsbFxuICpcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIFRoZSBmb3J3YXJkZXIgYWRkcmVzcyB0byBmbHVzaFxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBmbHVzaCBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaFRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nLCB0b2tlbkFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFtmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3NdO1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmx1c2hGb3J3YXJkZXJUb2tlbnMnLCBmbHVzaFRva2Vuc1R5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaFRva2Vuc1R5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCBuYXRpdmUgY29pbnMgY29udHJhY3QgY2FsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hDb2luc0RhdGEoKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW107XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaCcsIGZsdXNoQ29pbnNUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hDb2luc1R5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlIGZvcndhcmRlciBtZXRob2QgY2FsbGluZyBkYXRhXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlRm9yd2FyZGVyIG1ldGhvZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzSW5pdGlhbGl6YXRpb25EYXRhKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVGb3J3YXJkZXJNZXRob2RJZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBFdGggYWRkcmVzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gdGhlIHR4IGhhc2ggdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEV0aEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc21hcnQgY29udHJhY3QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgVGhlIHdhbGxldCBjcmVhdGlvbiBkYXRhIHRvIGRlY29kZVxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRoZSBsaXN0IG9mIHNpZ25lciBhZGRyZXNzZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVdhbGxldENyZWF0aW9uRGF0YShkYXRhOiBzdHJpbmcpOiBXYWxsZXRJbml0aWFsaXphdGlvbkRhdGEge1xuICBpZiAoIShkYXRhLnN0YXJ0c1dpdGgod2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzKSB8fCBkYXRhLnN0YXJ0c1dpdGgodjFDcmVhdGVXYWxsZXRNZXRob2RJZCkpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB3YWxsZXQgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgod2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzKSkge1xuICAgIGNvbnN0IGRhdGFCdWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDIpLCAnaGV4Jyk7XG5cbiAgICAvLyB0aGUgbGFzdCAxNjAgYnl0ZXMgY29udGFpbiB0aGUgc2VyaWFsaXplZCBhZGRyZXNzIGFycmF5XG4gICAgY29uc3Qgc2VyaWFsaXplZFNpZ25lcnMgPSBkYXRhQnVmZmVyLnNsaWNlKC0xNjApO1xuXG4gICAgY29uc3QgcmVzdWx0RW5jb2RlZFBhcmFtZXRlcnMgPSBFdGhlcmV1bUFiaS5yYXdEZWNvZGUod2FsbGV0U2ltcGxlQ29uc3RydWN0b3IsIHNlcmlhbGl6ZWRTaWduZXJzKTtcbiAgICBpZiAocmVzdWx0RW5jb2RlZFBhcmFtZXRlcnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBDb3VsZCBub3QgZGVjb2RlIHdhbGxldCBjb25zdHJ1Y3RvciBieXRlY29kZTogJHtyZXN1bHRFbmNvZGVkUGFyYW1ldGVyc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzZXM6IEJOW10gPSByZXN1bHRFbmNvZGVkUGFyYW1ldGVyc1swXTtcbiAgICBpZiAoYWRkcmVzc2VzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgaW52YWxpZCBudW1iZXIgb2YgYWRkcmVzc2VzIGluIHBhcnNlZCBjb25zdHJ1Y3RvcjogJHthZGRyZXNzZXN9YCk7XG4gICAgfVxuXG4gICAgLy8gc29tZXRpbWVzIGV0aGVyZXVtanMtYWJpIHJlbW92ZXMgMCBwYWRkaW5nIGF0IHRoZSBzdGFydCBvZiBhZGRyZXNzZXMsXG4gICAgLy8gc28gd2Ugc2hvdWxkIHBhZCB1bnRpbCB0aGV5IGFyZSB0aGUgc3RhbmRhcmQgMjAgYnl0ZXNcbiAgICBjb25zdCBwYWRkZWRBZGRyZXNzZXMgPSBhZGRyZXNzZXMubWFwKChhZGRyZXNzKSA9PiBzdHJpcEhleFByZWZpeChhZGRyZXNzLnRvU3RyaW5nKCdoZXgnKSkucGFkU3RhcnQoNDAsICcwJykpO1xuXG4gICAgcmV0dXJuIHsgb3duZXJzOiBwYWRkZWRBZGRyZXNzZXMubWFwKChhZGRyZXNzKSA9PiBhZGRIZXhQcmVmaXgoYWRkcmVzcykpIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVjb2RlZERhdGFGb3JXYWxsZXRDcmVhdGlvbiA9IGdldFJhd0RlY29kZWQoXG4gICAgICBjcmVhdGVWMVdhbGxldFR5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZSh2MUNyZWF0ZVdhbGxldE1ldGhvZElkLCBkYXRhKVxuICAgICk7XG4gICAgY29uc3QgYWRkcmVzc2VzID0gZGVjb2RlZERhdGFGb3JXYWxsZXRDcmVhdGlvblswXSBhcyBzdHJpbmdbXTtcbiAgICBjb25zdCBzYWx0QnVmZmVyID0gZGVjb2RlZERhdGFGb3JXYWxsZXRDcmVhdGlvblsxXTtcbiAgICBjb25zdCBzYWx0ID0gYnVmZmVyVG9IZXgoc2FsdEJ1ZmZlciBhcyBCdWZmZXIpO1xuICAgIGNvbnN0IHBhZGRlZEFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHN0cmlwSGV4UHJlZml4KGFkZHJlc3MudG9TdHJpbmcoKSkucGFkU3RhcnQoNDAsICcwJykpO1xuICAgIGNvbnN0IG93bmVycyA9IHBhZGRlZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IGFkZEhleFByZWZpeChhZGRyZXNzKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG93bmVycyxcbiAgICAgIHNhbHQsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgdHJhbnNmZXIgZGF0YSBhbmQgcmV0dXJuIHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogVHJhbnNmZXJEYXRhIHtcbiAgaWYgKGRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICByZXR1cm4gZGVjb2RlTmF0aXZlVHJhbnNmZXJEYXRhKGRhdGEpO1xuICB9IGVsc2UgaWYgKGRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdUb2tlbk1ldGhvZElkKSkge1xuICAgIHJldHVybiBkZWNvZGVUb2tlblRyYW5zZmVyRGF0YShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIHRyYW5zZmVyIGRhdGEgZm9yIHRoZSBzZW5kTXVsdGlzaWdUb2tlbiBmdW5jdGlvbiBhbmQgcmV0dXJuIHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHBhcnNlZCB0b2tlbiB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUb2tlblRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcpOiBUb2tlblRyYW5zZmVyRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHRvOiBhZGRIZXhQcmVmaXgodG8gYXMgc3RyaW5nKSxcbiAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgc2VxdWVuY2VJZDogYnVmZmVyVG9JbnQoc2VxdWVuY2VJZCBhcyBCdWZmZXIpLFxuICAgIHNpZ25hdHVyZTogYnVmZmVyVG9IZXgoc2lnbmF0dXJlIGFzIEJ1ZmZlciksXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkNvbnRyYWN0QWRkcmVzcyBhcyBzdHJpbmcpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRVJDNzIxVHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IEVSQzcyMVRyYW5zZmVyRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdHJhbnNmZXIgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0bywgYW1vdW50LCBpbnRlcm5hbERhdGEsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICk7XG5cbiAgY29uc3QgaW50ZXJuYWxEYXRhSGV4ID0gYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcik7XG4gIGlmICghaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdHJhbnNmZXIgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGNvbnN0IFtmcm9tLCByZWNlaXZlciwgdG9rZW5JZCwgdXNlclNlbnREYXRhXSA9IGdldFJhd0RlY29kZWQoXG4gICAgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIgYXMgc3RyaW5nKSxcbiAgICBmcm9tOiBhZGRIZXhQcmVmaXgoZnJvbSBhcyBzdHJpbmcpLFxuICAgIGV4cGlyZVRpbWU6IGJ1ZmZlclRvSW50KGV4cGlyZVRpbWUgYXMgQnVmZmVyKSxcbiAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICB0b2tlbklkOiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRva2VuSWQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBhZGRIZXhQcmVmaXgodG8gYXMgc3RyaW5nKSxcbiAgICB1c2VyRGF0YTogYnVmZmVyVG9IZXgodXNlclNlbnREYXRhIGFzIEJ1ZmZlciksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFUkMxMTU1VHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IEVSQzExNTVUcmFuc2ZlckRhdGEge1xuICBsZXQgZnJvbSwgcmVjZWl2ZXIsIHVzZXJTZW50RGF0YTtcbiAgbGV0IHRva2VuSWRzOiBzdHJpbmdbXTtcbiAgbGV0IHZhbHVlczogc3RyaW5nW107XG5cbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgc2lnbmF0dXJlXSA9IGdldFJhd0RlY29kZWQoXG4gICAgc2VuZE11bHRpU2lnVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbERhdGFIZXggPSBidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKTtcbiAgaWYgKGludGVybmFsRGF0YUhleC5zdGFydHNXaXRoKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgbGV0IHRva2VuSWQ7XG4gICAgbGV0IHZhbHVlO1xuXG4gICAgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB2YWx1ZSwgdXNlclNlbnREYXRhXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgdG9rZW5JZHMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b2tlbklkKSkudG9GaXhlZCgpXTtcbiAgICB2YWx1ZXMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh2YWx1ZSkpLnRvRml4ZWQoKV07XG4gIH0gZWxzZSBpZiAoYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcikuc3RhcnRzV2l0aChFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVNZXRob2RJZCkpIHtcbiAgICBsZXQgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzO1xuICAgIFtmcm9tLCByZWNlaXZlciwgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLCBpbnRlcm5hbERhdGFIZXgpXG4gICAgKTtcbiAgICB0b2tlbklkcyA9IHRlbXBUb2tlbklkcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gICAgdmFsdWVzID0gdGVtcFZhbHVlcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0bzogYWRkSGV4UHJlZml4KHJlY2VpdmVyKSxcbiAgICBmcm9tOiBhZGRIZXhQcmVmaXgoZnJvbSksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleChhbW91bnQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIHRva2VuSWRzLFxuICAgIHZhbHVlcyxcbiAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgc2lnbmF0dXJlOiBidWZmZXJUb0hleChzaWduYXR1cmUgYXMgQnVmZmVyKSxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgdXNlckRhdGE6IHVzZXJTZW50RGF0YSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIHRyYW5zZmVyIGRhdGEgZm9yIHRoZSBzZW5kTXVsdGlzaWcgZnVuY3Rpb24gYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyBwYXJzZWQgdHJhbnNmZXIgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTmF0aXZlVHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IE5hdGl2ZVRyYW5zZmVyRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdHJhbnNmZXIgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0bywgYW1vdW50LCBpbnRlcm5hbERhdGEsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB0bzogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIGRhdGE6IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpLFxuICB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgZmx1c2ggdG9rZW5zIGRhdGEgYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyBwYXJzZWQgdHJhbnNmZXIgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hUb2tlbnNEYXRhKGRhdGE6IHN0cmluZyk6IEZsdXNoVG9rZW5zRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzc10gPSBnZXRSYXdEZWNvZGVkKFxuICAgIGZsdXNoVG9rZW5zVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShmbHVzaEZvcndhcmRlclRva2Vuc01ldGhvZElkLCBkYXRhKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgZm9yd2FyZGVyQWRkcmVzczogYWRkSGV4UHJlZml4KGZvcndhcmRlckFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmeSB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gZGF0YSBiYXNlZCBhcyBhIHRyYW5zYWN0aW9uIHR5cGUuXG4gKiBFVEggdHJhbnNhY3Rpb25zIGFyZSBkZWZpbmVkIGJ5IHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSB0cmFuc2FjdGlvbiBkYXRhLCBhbHNvIGtub3duIGFzIHRoZSBtZXRob2QgaWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBjbGFzc2lmeSB0aGUgdHJhbnNhY3Rpb24gd2l0aFxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gVGhlIGNsYXNzaWZpZWQgdHJhbnNhY3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlUcmFuc2FjdGlvbihkYXRhOiBzdHJpbmcpOiBUcmFuc2FjdGlvblR5cGUge1xuICBpZiAoZGF0YS5sZW5ndGggPCAxMCkge1xuICAgIC8vIGNvbnRyYWN0IGNhbGxzIG11c3QgaGF2ZSBhdCBsZWFzdCA0IGJ5dGVzIChtZXRob2QgaWQpIGFuZCAnMHgnXG4gICAgLy8gaWYgaXQgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHRvIGJlIGEgY29udHJhY3QgY2FsbCBpdCBtdXN0IGJlIGEgc2luZ2xlIHNpZyBzZW5kXG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVTaWdTZW5kO1xuICB9XG5cbiAgLy8gVE9ETyhTVExYLTE5NzApOiB2YWxpZGF0ZSBpZiB3ZSBhcmUgZ29pbmcgdG8gY29uc3RyYWludCB0byBzb21lIG1ldGhvZHMgYWxsb3dlZFxuICBsZXQgdHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlc01hcFtkYXRhLnNsaWNlKDAsIDEwKS50b0xvd2VyQ2FzZSgpXTtcbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2FjdGlvblR5cGU7XG59XG5cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB0eXBlcyBtYXAgYWNjb3JkaW5nIHRvIHRoZSBzdGFydGluZyBwYXJ0IG9mIHRoZSBlbmNvZGVkIGRhdGFcbiAqL1xuY29uc3QgdHJhbnNhY3Rpb25UeXBlc01hcCA9IHtcbiAgW3dhbGxldEluaXRpYWxpemF0aW9uRmlyc3RCeXRlc106IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgW3JlY292ZXJ5V2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzXTogVHJhbnNhY3Rpb25UeXBlLlJlY292ZXJ5V2FsbGV0RGVwbG95bWVudCxcbiAgW3YxQ3JlYXRlV2FsbGV0TWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24sXG4gIFtjcmVhdGVGb3J3YXJkZXJNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24sXG4gIFt2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgW3Y0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uLFxuICBbc2VuZE11bHRpc2lnTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgW2ZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hUb2tlbnMsXG4gIFtmbHVzaENvaW5zTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hDb2lucyxcbiAgW3NlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgW0xvY2tNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nTG9jayxcbiAgW1ZvdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZSxcbiAgW0FjdGl2YXRlTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlLFxuICBbVW52b3RlTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1Vudm90ZSxcbiAgW1VubG9ja01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2ssXG4gIFtXaXRoZHJhd01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyxcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW0gbnVtYmVyIHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBoZXggbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb0hleFN0cmluZyhudW06IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGhleCA9IG51bS50b1N0cmluZygxNik7XG4gIHJldHVybiBoZXgubGVuZ3RoICUgMiA9PT0gMCA/ICcweCcgKyBoZXggOiAnMHgwJyArIGhleDtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhleCBUaGUgaGV4IHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSByZXN1bHRpbmcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhTdHJpbmdUb051bWJlcihoZXg6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBwYXJzZUludChoZXguc2xpY2UoMiksIDE2KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIGFkZHJlc3MgdG8gYmUgZGVwbG95ZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RBZGRyZXNzIHRoZSBhZGRyZXNzIHdoaWNoIGlzIGNyZWF0aW5nIHRoaXMgbmV3IGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250cmFjdENvdW50ZXIgdGhlIG5vbmNlIG9mIHRoZSBjb250cmFjdCBhZGRyZXNzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgY2FsY3VsYXRlZCBmb3J3YXJkZXIgY29udHJhY3QgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRm9yd2FyZGVyQWRkcmVzcyhjb250cmFjdEFkZHJlc3M6IHN0cmluZywgY29udHJhY3RDb3VudGVyOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gZ2VuZXJhdGVBZGRyZXNzKFxuICAgIEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KGNvbnRyYWN0QWRkcmVzcyksICdoZXgnKSxcbiAgICBCdWZmZXIuZnJvbShwYWRUb0V2ZW4oc3RyaXBIZXhQcmVmaXgobnVtYmVyVG9IZXhTdHJpbmcoY29udHJhY3RDb3VudGVyKSkpLCAnaGV4JylcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChmb3J3YXJkZXJBZGRyZXNzLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBmb3J3YXJkZXIgdjEgYWRkcmVzcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGBjcmVhdG9yQWRkcmVzc2AgY3JlYXRlcyBpdCB3aXRoIHNhbHQgYHNhbHRgXG4gKiBhbmQgaW5pdGNvZGUgYGluaWNvZGUgdXNpbmcgdGhlIGNyZWF0ZTIgb3Bjb2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gY3JlYXRvckFkZHJlc3MgVGhlIGFkZHJlc3MgdGhhdCBpcyBzZW5kaW5nIHRoZSB0eCB0byBjcmVhdGUgYSBuZXcgYWRkcmVzcywgaGV4IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgVGhlIHNhbHQgdG8gY3JlYXRlIHRoZSBhZGRyZXNzIHdpdGggdXNpbmcgY3JlYXRlMiwgaGV4IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGluaXRjb2RlIFRoZSBpbml0Y29kZSB0aGF0IHdpbGwgYmUgZGVwbG95ZWQgdG8gdGhlIGFkZHJlc3MsIGhleCBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNhbGN1bGF0ZWQgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRm9yd2FyZGVyVjFBZGRyZXNzKGNyZWF0b3JBZGRyZXNzOiBzdHJpbmcsIHNhbHQ6IHN0cmluZywgaW5pdGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZvcndhcmRlclYxQWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzczIoXG4gICAgQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoY3JlYXRvckFkZHJlc3MpLCAnaGV4JyksXG4gICAgQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoc2FsdCksICdoZXgnKSxcbiAgICBCdWZmZXIuZnJvbShwYWRUb0V2ZW4oc3RyaXBIZXhQcmVmaXgoaW5pdGNvZGUpKSwgJ2hleCcpXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyVjFBZGRyZXNzLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogVGFrZSB0aGUgaW1wbGVtZW50YXRpb24gYWRkcmVzcyBmb3IgdGhlIHByb3h5IGNvbnRyYWN0LCBhbmQgZ2V0IHRoZSBiaW5hcnkgaW5pdGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIHByb3h5XG4gKiBAcGFyYW0ge3N0cmluZ30gaW1wbGVtZW50YXRpb25BZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjb250cmFjdCBmb3IgdGhlIHByb3h5XG4gKiBAcmV0dXJuIHtzdHJpbmd9IEJpbmFyeSBoZXggc3RyaW5nIG9mIHRoZSBwcm94eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJveHlJbml0Y29kZShpbXBsZW1lbnRhdGlvbkFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldCA9IHN0cmlwSGV4UHJlZml4KGltcGxlbWVudGF0aW9uQWRkcmVzcy50b0xvd2VyQ2FzZSgpKS5wYWRTdGFydCg0MCwgJzAnKTtcblxuICAvLyBieXRlY29kZSBvZiB0aGUgcHJveHksIGZyb206XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby9ldGgtbXVsdGlzaWctdjQvYmxvYi9kNTQ2YTkzN2Y5MGY5M2U4M2IzNDIzYTViZjkzM2QxZDc3YzY3N2MzL2NvbnRyYWN0cy9DbG9uZUZhY3Rvcnkuc29sI0w0Mi1MNTZcbiAgcmV0dXJuIGAweDNkNjAyZDgwNjAwYTNkMzk4MWYzMzYzZDNkMzczZDNkM2QzNjNkNzMke3RhcmdldH01YWY0M2Q4MjgwM2U5MDNkOTE2MDJiNTdmZDViZjNgO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIHNpZ25hdHVyZSBwYXJ0cyB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUGFydHN9IHNpZyBUaGUgc2lnbmF0dXJlIHRvIGNvbnZlcnQgdG8gc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNpZ25hdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmdTaWcoc2lnOiBTaWduYXR1cmVQYXJ0cyk6IHN0cmluZyB7XG4gIHJldHVybiBidWZmZXJUb0hleChcbiAgICBCdWZmZXIuY29uY2F0KFtcbiAgICAgIHNldExlbmd0aExlZnQoQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoc2lnLnIpLCAnaGV4JyksIDMyKSxcbiAgICAgIHNldExlbmd0aExlZnQoQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoc2lnLnMpLCAnaGV4JyksIDMyKSxcbiAgICAgIHRvQnVmZmVyKHNpZy52KSxcbiAgICBdKVxuICApO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gdHggZGF0YSBoYXMgYSBzaWduYXR1cmVcbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHhEYXRhIFRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIGNoZWNrIGZvciBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSB0eCBoYXMgYSBzaWduYXR1cmUsIGVsc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NpZ25hdHVyZSh0eERhdGE6IFR4RGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR4RGF0YS52ICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eERhdGEuciAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHhEYXRhLnMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR4RGF0YS52Lmxlbmd0aCA+IDAgJiZcbiAgICB0eERhdGEuci5sZW5ndGggPiAwICYmXG4gICAgdHhEYXRhLnMubGVuZ3RoID4gMFxuICApO1xufVxuXG50eXBlIFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nID0gc3RyaW5nIHwgQnVmZmVyIHwgQk4gfCBSZWN1cnNpdmVCdWZmZXJPclN0cmluZ1tdO1xuXG4vKipcbiAqIEdldCB0aGUgcmF3IGRhdGEgZGVjb2RlZCBmb3Igc29tZSB0eXBlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHR5cGVzIEFCSSB0eXBlcyBkZWZpbml0aW9uXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZEFyZ3MgZW5jb2RlZCBhcmdzXG4gKiBAcmV0dXJucyB7QnVmZmVyW119IHRoZSBkZWNvZGVkIHJhd1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmF3RGVjb2RlZCh0eXBlczogc3RyaW5nW10sIHNlcmlhbGl6ZWRBcmdzOiBCdWZmZXIpOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZ1tdIHtcbiAgZnVuY3Rpb24gbm9ybWFsaXplKHY6IHVua25vd24sIGk6IG51bWJlcik6IHVua25vd24ge1xuICAgIGlmIChCTi5pc0JOKHYpKSB7XG4gICAgICByZXR1cm4gdjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIodikpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgcmV0dXJuIHYubWFwKG5vcm1hbGl6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yICR7dHlwZXN9WyR7aX1dIGdvdCAke3R5cGVvZiB2fWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBFdGhlcmV1bUFiaS5yYXdEZWNvZGUodHlwZXMsIHNlcmlhbGl6ZWRBcmdzKS5tYXAobm9ybWFsaXplKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJ1ZmZlcmVkIGJ5dGVjb2RlIGZyb20gcmF3RGF0YSB1c2luZyBhIG1ldGhvZElkIGFzIGRlbGltaXRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RJZCB0aGUgaGV4IGVuY29kZWQgbWV0aG9kIElkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3RGF0YSB0aGUgaGV4IGVuY29kZWQgcmF3IGRhdGFcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IGRhdGEgYnVmZmVyZWQgYnl0ZWNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1ZmZlcmVkQnl0ZUNvZGUobWV0aG9kSWQ6IHN0cmluZywgcmF3RGF0YTogc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3Qgc3BsaXRCeXRlY29kZSA9IHJhd0RhdGEuc3BsaXQobWV0aG9kSWQpO1xuICBpZiAoc3BsaXRCeXRlY29kZS5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHNlbmQgYnl0ZWNvZGU6ICR7cmF3RGF0YX1gKTtcbiAgfVxuICBpZiAoc3BsaXRCeXRlY29kZVsxXS5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBzZW5kIGJ5dGVjb2RlOiAke3Jhd0RhdGF9ICh3cm9uZyBsZW5naHQpYCk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNwbGl0Qnl0ZWNvZGVbMV0sICdoZXgnKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBjb250cmFjdCBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkNvbnRyYWN0QWRkcmVzcyBUaGUgY29udHJhY3QgYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbih0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yayk6IFJlYWRvbmx5PEJhc2VDb2luPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgIGlmIChjb2luIGluc3RhbmNlb2YgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2luLm5ldHdvcmsudHlwZSA9PT0gbmV0d29yay50eXBlICYmIGNvaW4uY29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gaWYgbGVuZ3RoIG9mIHRva2VucyBpcyAxLCByZXR1cm4gdGhlIGZpcnN0LCBlbHNlIHJldHVybiB1bmRlZmluZWRcbiAgLy8gQ2FuJ3QgZGlyZWN0bHkgaW5kZXggaW50byB0b2tlbnMsIG9yIGNhbGwgYGxlbmd0aGAsIHNvIHdlIHVzZSBtYXAgdG8gZ2V0IGFuIGFycmF5XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlIHdhbGxldCBtZXRob2QgY2FsbGluZyBkYXRhIGZvciB2MSB3YWxsZXRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gd2FsbGV0T3duZXJzIC0gd2FsbGV0IG93bmVyIGFkZHJlc3NlcyBmb3Igd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgLSBUaGUgc2FsdCBmb3Igd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlV2FsbGV0IG1ldGhvZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWMVdhbGxldEluaXRpYWxpemF0aW9uRGF0YSh3YWxsZXRPd25lcnM6IHN0cmluZ1tdLCBzYWx0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzYWx0QnVmZmVyID0gc2V0TGVuZ3RoTGVmdCh0b0J1ZmZlcihzYWx0KSwgMzIpO1xuICBjb25zdCBwYXJhbXMgPSBbd2FsbGV0T3duZXJzLCBzYWx0QnVmZmVyXTtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NyZWF0ZVdhbGxldCcsIGNyZWF0ZVYxV2FsbGV0VHlwZXMpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGNyZWF0ZVYxV2FsbGV0VHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgYWRkcmVzcyBtZXRob2QgY2FsbGluZyBkYXRhIGZvciB2MSwgdjIsIHY0IGZvcndhcmRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZUFkZHJlc3MgLSBUaGUgYWRkcmVzcyBvZiB0aGUgd2FsbGV0IGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCAtIFRoZSBzYWx0IGZvciBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZUFkZHJlc3MgLSBUaGUgZmVlIGFkZHJlc3MgZm9yIHRoZSBlbnRlcnByaXNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFYxQWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YShiYXNlQWRkcmVzczogc3RyaW5nLCBzYWx0OiBzdHJpbmcsIGZlZUFkZHJlc3M/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzYWx0QnVmZmVyID0gc2V0TGVuZ3RoTGVmdCh0b0J1ZmZlcihzYWx0KSwgMzIpO1xuICBjb25zdCB7IGNyZWF0ZUZvcndhcmRlclBhcmFtcywgY3JlYXRlRm9yd2FyZGVyVHlwZXMgfSA9IGdldENyZWF0ZUZvcndhcmRlclBhcmFtc0FuZFR5cGVzKFxuICAgIGJhc2VBZGRyZXNzLFxuICAgIHNhbHRCdWZmZXIsXG4gICAgZmVlQWRkcmVzc1xuICApO1xuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjcmVhdGVGb3J3YXJkZXInLCBjcmVhdGVGb3J3YXJkZXJUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoY3JlYXRlRm9yd2FyZGVyVHlwZXMsIGNyZWF0ZUZvcndhcmRlclBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgYWRkcmVzcyBtZXRob2QgY2FsbGluZyBkYXRhIGZvciBhbGwgZm9yd2FyZGVyIHZlcnNpb25zXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvcndhcmRlclZlcnNpb24gLSBUaGUgdmVyc2lvbiBvZiB0aGUgZm9yd2FyZGVyIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VBZGRyZXNzIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldCBjb250cmFjdFxuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgLSBUaGUgc2FsdCBmb3IgYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWVBZGRyZXNzIC0gVGhlIGZlZSBhZGRyZXNzIGZvciB0aGUgZW50ZXJwcmlzZVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlRm9yd2FyZGVyIG1ldGhvZCBlbmNvZGVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkcmVzc0luaXREYXRhQWxsRm9yd2FyZGVyVmVyc2lvbnMoXG4gIGZvcndhcmRlclZlcnNpb246IG51bWJlcixcbiAgYmFzZUFkZHJlc3M6IHN0cmluZyxcbiAgc2FsdDogc3RyaW5nLFxuICBmZWVBZGRyZXNzPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoZm9yd2FyZGVyVmVyc2lvbiA9PT0gZGVmYXVsdEZvcndhcmRlclZlcnNpb24pIHtcbiAgICByZXR1cm4gZ2V0QWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YSgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRWMUFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoYmFzZUFkZHJlc3MsIHNhbHQsIGZlZUFkZHJlc3MpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlRm9yd2FyZGVyVHlwZXMgYW5kIGNyZWF0ZUZvcndhcmRlclBhcmFtcyBmb3IgYWxsIGZvcndhcmRlciB2ZXJzaW9uc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlQWRkcmVzcyAtIFRoZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBzYWx0QnVmZmVyIC0gVGhlIHNhbHQgZm9yIGFkZHJlc3MgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWVBZGRyZXNzIC0gVGhlIGZlZSBhZGRyZXNzIGZvciB0aGUgZW50ZXJwcmlzZVxuICogQHJldHVybnMge2NyZWF0ZUZvcndhcmRlclBhcmFtczogKHN0cmluZyB8IEJ1ZmZlcilbXSwgY3JlYXRlRm9yd2FyZGVyVHlwZXM6IHN0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlRm9yd2FyZGVyUGFyYW1zQW5kVHlwZXMoXG4gIGJhc2VBZGRyZXNzOiBzdHJpbmcsXG4gIHNhbHRCdWZmZXI6IEJ1ZmZlcixcbiAgZmVlQWRkcmVzcz86IHN0cmluZ1xuKTogeyBjcmVhdGVGb3J3YXJkZXJQYXJhbXM6IChzdHJpbmcgfCBCdWZmZXIpW107IGNyZWF0ZUZvcndhcmRlclR5cGVzOiBzdHJpbmdbXSB9IHtcbiAgbGV0IGNyZWF0ZUZvcndhcmRlclBhcmFtcyA9IFtiYXNlQWRkcmVzcywgc2FsdEJ1ZmZlcl07XG4gIGxldCBjcmVhdGVGb3J3YXJkZXJUeXBlcyA9IGNyZWF0ZVYxRm9yd2FyZGVyVHlwZXM7XG4gIGlmIChmZWVBZGRyZXNzKSB7XG4gICAgY3JlYXRlRm9yd2FyZGVyUGFyYW1zID0gW2Jhc2VBZGRyZXNzLCBmZWVBZGRyZXNzLCBzYWx0QnVmZmVyXTtcbiAgICBjcmVhdGVGb3J3YXJkZXJUeXBlcyA9IGNyZWF0ZVY0Rm9yd2FyZGVyVHlwZXM7XG4gIH1cbiAgcmV0dXJuIHsgY3JlYXRlRm9yd2FyZGVyUGFyYW1zLCBjcmVhdGVGb3J3YXJkZXJUeXBlcyB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgY3JlYXRlIGZvcndhcmRlciBkYXRhIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHJldHVybnMgcGFyc2VkIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZvcndhcmRlckNyZWF0aW9uRGF0YShkYXRhOiBzdHJpbmcpOiBGb3J3YXJkZXJJbml0aWFsaXphdGlvbkRhdGEge1xuICBpZiAoXG4gICAgIShcbiAgICAgIGRhdGEuc3RhcnRzV2l0aCh2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkKSB8fFxuICAgICAgZGF0YS5zdGFydHNXaXRoKHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpIHx8XG4gICAgICBkYXRhLnN0YXJ0c1dpdGgoY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpXG4gICAgKVxuICApIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGFkZHJlc3MgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiB1bmRlZmluZWQsXG4gICAgICBmZWVBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgodjFDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCkpIHtcbiAgICBjb25zdCBbYmFzZUFkZHJlc3MsIHNhbHRCdWZmZXJdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVYxRm9yd2FyZGVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlQWRkcmVzczogYWRkSGV4UHJlZml4KGJhc2VBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlciksXG4gICAgICBmZWVBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgfSBhcyBjb25zdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbYmFzZUFkZHJlc3MsIGZlZUFkZHJlc3MsIHNhbHRCdWZmZXJdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVY0Rm9yd2FyZGVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHY0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlQWRkcmVzczogYWRkSGV4UHJlZml4KGJhc2VBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlciksXG4gICAgICBmZWVBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZmVlQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIH0gYXMgY29uc3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIGEgcXVlcnkgdG8gZXhwbG9yZXIgZm9yIGluZm9ybWF0aW9uIHN1Y2ggYXMgYmFsYW5jZSwgdG9rZW4gYmFsYW5jZSwgc29saWRpdHkgY2FsbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBxdWVyeSBrZXktdmFsdWUgcGFpcnMgb2YgcGFyYW1ldGVycyB0byBhcHBlbmQgYWZ0ZXIgL2FwaVxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuIHRoZSBBUEkgdG9rZW4gdG8gdXNlIGZvciB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGxvcmVyVXJsIHRoZSBVUkwgb2YgdGhlIGV4cGxvcmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSByZXNwb25zZSBmcm9tIGV4cGxvcmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KFxuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZXhwbG9yZXJVcmw6IHN0cmluZyxcbiAgdG9rZW4/OiBzdHJpbmdcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWYgKHRva2VuKSB7XG4gICAgcXVlcnkuYXBpa2V5ID0gdG9rZW47XG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmdldChgJHtleHBsb3JlclVybH0vYXBpYCkucXVlcnkocXVlcnkpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFjaCBleHBsb3JlcicpO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09PSAnMCcgJiYgcmVzcG9uc2UuYm9keS5tZXNzYWdlID09PSAnTk9UT0snKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsb3JlciByYXRlIGxpbWl0IHJlYWNoZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbn1cbiJdfQ==
|