@bitgo/sdk-core 36.43.0 → 37.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/dist/src/account-lib/baseCoin/enum.d.ts +19 -15
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +24 -16
- package/dist/src/api/types.d.ts +12 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +4 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +6 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/bitgoBase.d.ts +3 -1
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +8 -2
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +12 -1
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/decryptKeychain.js +34 -2
- package/dist/src/bitgo/keychain/iKeychains.d.ts +6 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +10 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +2 -4
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +12 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/network/network.d.ts +1 -1
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/network.js +3 -5
- package/dist/src/bitgo/trading/network/types.d.ts +1 -1
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/types.js +1 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts +14 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +53 -7
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.js +6 -9
- package/dist/src/bitgo/tss/common.d.ts +2 -1
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +10 -1
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -1
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +8 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +10 -7
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +33 -7
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +96 -18
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +26 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +8 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +27 -8
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +14 -4
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +125 -50
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -6
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +96 -38
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +32 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +141 -6
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -1
- package/dist/src/bitgo/utils/txRequest.js +6 -4
- package/dist/src/bitgo/wallet/BuildParams.d.ts +20 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +12 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts +60 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +20 -19
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +16 -8
- package/dist/src/bitgo/wallet/wallet.d.ts +77 -2
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +281 -13
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +49 -23
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +183 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +75 -1
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +5 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +0 -20
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +0 -46
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +0 -2
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +0 -1
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +0 -137
|
@@ -48,12 +48,12 @@ const baseTypes_1 = require("../baseTypes");
|
|
|
48
48
|
const tss_2 = require("../../../tss");
|
|
49
49
|
const types_1 = require("../../../tss/ecdsa/types");
|
|
50
50
|
const opengpgUtils_1 = require("../../opengpgUtils");
|
|
51
|
+
const errors_1 = require("../../../errors");
|
|
51
52
|
const ecdsa_2 = require("../../../tss/ecdsa/ecdsa");
|
|
52
53
|
const ecdh_1 = require("../../../ecdh");
|
|
53
54
|
const common_1 = require("../../../tss/common");
|
|
54
55
|
const types_2 = require("../../../tss/types");
|
|
55
56
|
const base_1 = require("./base");
|
|
56
|
-
const recipientUtils_1 = require("../recipientUtils");
|
|
57
57
|
const encryptNShare = ecdsa_1.default.encryptNShare;
|
|
58
58
|
/** @inheritdoc */
|
|
59
59
|
class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
@@ -121,6 +121,7 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
121
121
|
bitgoKeychain,
|
|
122
122
|
passphrase: params.passphrase,
|
|
123
123
|
originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
|
|
124
|
+
webauthnInfo: params.webauthnInfo,
|
|
124
125
|
});
|
|
125
126
|
const backupKeychainPromise = this.createBackupKeychain({
|
|
126
127
|
userGpgKey,
|
|
@@ -147,12 +148,12 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
147
148
|
};
|
|
148
149
|
return backupKeyShare;
|
|
149
150
|
}
|
|
150
|
-
createUserKeychain({ userGpgKey, backupGpgKey, bitgoPublicGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, }) {
|
|
151
|
+
createUserKeychain({ userGpgKey, backupGpgKey, bitgoPublicGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, webauthnInfo, }) {
|
|
151
152
|
if (!passphrase) {
|
|
152
153
|
throw new Error('Please provide a wallet passphrase');
|
|
153
154
|
}
|
|
154
155
|
(0, assert_1.default)(backupKeyShare.userHeldKeyShare);
|
|
155
|
-
return this.createParticipantKeychain(userGpgKey, backupGpgKey, bitgoPublicGpgKey, 1, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
|
|
156
|
+
return this.createParticipantKeychain(userGpgKey, backupGpgKey, bitgoPublicGpgKey, 1, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, webauthnInfo);
|
|
156
157
|
}
|
|
157
158
|
async createBackupKeychain({ userGpgKey, userKeyShare, backupGpgKey, backupKeyShare, bitgoKeychain, bitgoPublicGpgKey, passphrase, }) {
|
|
158
159
|
(0, assert_1.default)(backupKeyShare.userHeldKeyShare);
|
|
@@ -209,7 +210,7 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
209
210
|
return backupToRecipientShare;
|
|
210
211
|
}
|
|
211
212
|
/** @inheritdoc */
|
|
212
|
-
async createParticipantKeychain(userGpgKey, userLocalBackupGpgKey, bitgoPublicGpgKey, recipientIndex, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
|
|
213
|
+
async createParticipantKeychain(userGpgKey, userLocalBackupGpgKey, bitgoPublicGpgKey, recipientIndex, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, webauthnInfo) {
|
|
213
214
|
const bitgoKeyShares = bitgoKeychain.keyShares;
|
|
214
215
|
if (!bitgoKeyShares) {
|
|
215
216
|
throw new Error('Missing BitGo key shares');
|
|
@@ -281,6 +282,18 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
281
282
|
password: passphrase,
|
|
282
283
|
}),
|
|
283
284
|
originalPasscodeEncryptionCode,
|
|
285
|
+
webauthnDevices: webauthnInfo && recipientIndex === types_2.ShareKeyPosition.USER
|
|
286
|
+
? [
|
|
287
|
+
{
|
|
288
|
+
otpDeviceId: webauthnInfo.otpDeviceId,
|
|
289
|
+
prfSalt: webauthnInfo.prfSalt,
|
|
290
|
+
encryptedPrv: await this.bitgo.encryptAsync({
|
|
291
|
+
input: prv,
|
|
292
|
+
password: webauthnInfo.passphrase,
|
|
293
|
+
}),
|
|
294
|
+
},
|
|
295
|
+
]
|
|
296
|
+
: undefined,
|
|
284
297
|
};
|
|
285
298
|
const keychains = this.baseCoin.keychains();
|
|
286
299
|
return recipientIndex === 1
|
|
@@ -496,7 +509,11 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
496
509
|
if (requestType === baseTypes_1.RequestType.tx) {
|
|
497
510
|
(0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
498
511
|
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
499
|
-
|
|
512
|
+
if ('recipientSource' in params &&
|
|
513
|
+
params.recipientSource === baseTypes_1.TssTxRecipientSource.Explicit &&
|
|
514
|
+
!params.txParams?.recipients?.length) {
|
|
515
|
+
throw new errors_1.InvalidTransactionError('recipientSource "explicit" requires txParams.recipients with at least one recipient.');
|
|
516
|
+
}
|
|
500
517
|
// For ICP transactions, the HSM signs the serializedTxHex, while the user signs the signableHex separately.
|
|
501
518
|
// Verification cannot be performed directly on the signableHex alone. However, we can parse the serializedTxHex
|
|
502
519
|
// to regenerate the signableHex and compare it against the provided value for verification.
|
|
@@ -504,7 +521,7 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
504
521
|
if (this.baseCoin.getConfig().family === 'icp') {
|
|
505
522
|
await this.baseCoin.verifyTransaction({
|
|
506
523
|
txPrebuild: { txHex: unsignedTx.serializedTxHex, txInfo: unsignedTx.signableHex },
|
|
507
|
-
txParams:
|
|
524
|
+
txParams: params.txParams || { recipients: [] },
|
|
508
525
|
wallet: this.wallet,
|
|
509
526
|
walletType: this.wallet.multisigType(),
|
|
510
527
|
});
|
|
@@ -512,7 +529,7 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
512
529
|
else {
|
|
513
530
|
await this.baseCoin.verifyTransaction({
|
|
514
531
|
txPrebuild: { txHex: unsignedTx.signableHex },
|
|
515
|
-
txParams:
|
|
532
|
+
txParams: params.txParams || { recipients: [] },
|
|
516
533
|
wallet: this.wallet,
|
|
517
534
|
walletType: this.wallet.multisigType(),
|
|
518
535
|
});
|
|
@@ -559,6 +576,8 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
559
576
|
* @param {string | TxRequest} params.txRequest - transaction request object or id
|
|
560
577
|
* @param {string} params.prv - decrypted private key
|
|
561
578
|
* @param {string} params.reqId - request id
|
|
579
|
+
* @param params.recipientSource - optional; use TssTxRecipientSource.Explicit with a non-empty
|
|
580
|
+
* txParams.recipients list when you want TypeScript to enforce passing recipient details at compile time.
|
|
562
581
|
* @returns {Promise<TxRequest>} fully signed TxRequest object
|
|
563
582
|
*/
|
|
564
583
|
async signTxRequest(params) {
|
|
@@ -850,4 +869,4 @@ class EcdsaUtils extends base_1.BaseEcdsaUtils {
|
|
|
850
869
|
}
|
|
851
870
|
}
|
|
852
871
|
exports.EcdsaUtils = EcdsaUtils;
|
|
853
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMsaURBQW1DO0FBR25DLG9EQUF1SDtBQUN2SCw4Q0FBd0M7QUFFeEMseURBQStEO0FBRS9ELCtEQUFvRTtBQVVwRSw0Q0Fhc0I7QUFDdEIsc0NBQTRDO0FBQzVDLG9EQUFrSDtBQUNsSCxxREFBNkY7QUFFN0Ysb0RBQWlFO0FBQ2pFLHdDQUFtRjtBQUNuRixnREFBNEQ7QUFDNUQsOENBSzRCO0FBQzVCLGlDQUF3QztBQUN4QyxzREFBNkQ7QUFHN0QsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEscUJBQWM7SUFDNUMsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxLQUFhLEVBQ2IsY0FBc0IsRUFDdEIsWUFBc0IsRUFDdEIsYUFBdUIsRUFDdkIsVUFBcUMsRUFDckMsNEJBQWlDO1FBRWpDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxhQUFhLENBQ3BELFlBQVksRUFDWixDQUFDLEVBQ0QsNEJBQTRCLENBQUMsS0FBSyxFQUFFLEVBQ3BDLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FDekQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUNwRSxDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsZUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxlQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENB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QixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDBCQUEwQjtpQkFDM0M7YUFDRjtZQUNELGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUU7b0JBQ1QsY0FBYyxFQUFFLDRCQUE0QjtpQkFDN0M7YUFDRjtTQUNGLENBQUM7UUFDRixJQUFJLGFBQWEsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sS0FBSzthQUNSLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGVBQWUsS0FBSyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFwc0NELGdDQW9zQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IEtleSwgU2VyaWFsaXplZEtleVBhaXIgfSBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IEhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRWNkc2FQYWlsbGllclByb29mLCBFY2RzYVJhbmdlUHJvb2YsIEVjZHNhVHlwZXMsIGhleFRvQmlnSW50LCBtaW5Nb2R1bHVzQml0TGVuZ3RoIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHsgRUNEU0EsIEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcyc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IEVDRFNBTWV0aG9kcywgeyBFQ0RTQU1ldGhvZFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhJztcbmltcG9ydCB7IEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQge1xuICBCaXRHb1Byb29mU2lnbmF0dXJlcyxcbiAgQ3JlYXRlRWNkc2FCaXRHb0tleWNoYWluUGFyYW1zLFxuICBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zLFxuICBEZWNyeXB0YWJsZU5TaGFyZSxcbiAgR2V0Qml0R29DaGFsbGVuZ2VzQXBpLFxuICBLZXlTaGFyZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBCYWNrdXBLZXlTaGFyZSxcbiAgQml0Z29IZWxkQmFja3VwS2V5U2hhcmUsXG4gIEN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgQ3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBSZXF1ZXN0VHlwZSxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHhSZXF1ZXN0LFxufSBmcm9tICcuLi9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcbmltcG9ydCB7IEFTaGFyZSwgRFNoYXJlLCBFbmNyeXB0ZWROU2hhcmUsIFNlbmRTaGFyZVR5cGUsIFNTaGFyZSwgV1NoYXJlLCBPU2hhcmUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVQcm9vZiwgZ2VuZXJhdGVHUEdLZXlQYWlyLCBnZXRCaXRnb0dwZ1B1YktleSB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL2VjZHNhJztcbmltcG9ydCB7IHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5LCB2ZXJpZnlFY2RoU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vLi4vZWNkaCc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3RDaGFsbGVuZ2UgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7XG4gIFNoYXJlS2V5UG9zaXRpb24sXG4gIFRzc0VjZHNhU3RlcDFSZXR1cm5NZXNzYWdlLFxuICBUc3NFY2RzYVN0ZXAyUmV0dXJuTWVzc2FnZSxcbiAgVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2UsXG59IGZyb20gJy4uLy4uLy4uL3Rzcy90eXBlcyc7XG5pbXBvcnQgeyBCYXNlRWNkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSBmcm9tICcuLi9yZWNpcGllbnRVdGlscyc7XG5pbXBvcnQgeyBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5cbmNvbnN0IGVuY3J5cHROU2hhcmUgPSBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZTtcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgY2xhc3MgRWNkc2FVdGlscyBleHRlbmRzIEJhc2VFY2RzYVV0aWxzIHtcbiAgYXN5bmMgZmluYWxpemVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZShcbiAgICBrZXlJZDogc3RyaW5nLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICB1c2VyR3BnS2V5OiBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgIHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXk6IEtleVxuICApOiBQcm9taXNlPEJpdGdvSGVsZEJhY2t1cEtleVNoYXJlPiB7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgMixcbiAgICAgIHRoaXJkUGFydHlCYWNrdXBQdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgIHVzZXJHcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBLZXlTaGFyZSA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzPy5maW5kKFxuICAgICAgKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAnYmFja3VwJ1xuICAgICk7XG4gICAgY29uc3QgdXNlclB1YmxpY1NoYXJlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUublNoYXJlc1syXS55LCAnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUublNoYXJlc1syXS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0KGJpdGdvVG9CYWNrdXBLZXlTaGFyZSk7XG4gICAgY29uc3Qga2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYmFzZUNvaW4udXJsKGAva3JzL2JhY2t1cGtleXMvJHtrZXlJZH1gKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGtleVNoYXJlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICAgIHRvOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyUHVibGljU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmU6IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgICAgIHZzc1Byb29mOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS52c3NQcm9vZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpdGdvVG9CYWNrdXBLZXlTaGFyZSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgaWYgKCFrZXlSZXNwb25zZSB8fCAha2V5UmVzcG9uc2UuY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIGJhY2t1cCBrZXkgdmVyaWZpY2F0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGtleVJlc3BvbnNlLmlkLFxuICAgICAga2V5U2hhcmVzOiBrZXlSZXNwb25zZS5rZXlTaGFyZXMsXG4gICAgICBjb21tb25LZXljaGFpbjoga2V5UmVzcG9uc2UuY29tbW9uS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBhd2FpdCBNUEMua2V5U2hhcmUoMSwgbSwgbik7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEtleVNoYXJlcygpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwR3BnUHViS2V5KCk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXk6IHByaW1hcnlHcGdLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IHByaW1hcnlHcGdLZXkgPz8gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW5Qcm9taXNlLCBiYWNrdXBLZXljaGFpblByb21pc2VdKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleVNoYXJlcygpOiBQcm9taXNlPEJhY2t1cEtleVNoYXJlPiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSB7XG4gICAgICB1c2VySGVsZEtleVNoYXJlOiBhd2FpdCBNUEMua2V5U2hhcmUoMiwgbSwgbiksXG4gICAgfTtcbiAgICByZXR1cm4gYmFja3VwS2V5U2hhcmU7XG4gIH1cblxuICBjcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIHBhc3NwaHJhc2UsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGlmICghcGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICAxLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICBwYXNzcGhyYXNlLFxuICB9OiBDcmVhdGVFY2RzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICBhc3NlcnQocGFzc3BocmFzZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMixcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZVxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGVudGVycHJpc2UsXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gIH06IENyZWF0ZUVjZHNhQml0R29LZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCByZWNpcGllbnRJbmRleCA9IDM7XG4gICAgY29uc3QgdXNlclRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSwgdXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvU2hhcmUgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz5cbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQml0R29NUENQYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IHVzZXJUb0JpdGdvU2hhcmUubixcbiAgICAgICAgICB2c3NQcm9vZjogdXNlclRvQml0Z29TaGFyZS52c3NQcm9vZixcbiAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogdXNlclRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiBiYWNrdXBUb0JpdGdvU2hhcmUuZW5jcnlwdGVkUHJpdmF0ZVNoYXJlLFxuICAgICAgICAgIG46IGJhY2t1cFRvQml0Z29TaGFyZS5uLFxuICAgICAgICAgIHZzc1Byb29mOiBiYWNrdXBUb0JpdGdvU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJhY2t1cFRvQml0Z29TaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogKGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+KS5wdWJsaWNLZXksXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLFxuICAgICAgYWxnb1VzZWQ6ICdlY2RzYScsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChjcmVhdGVCaXRHb01QQ1BhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBidWlsZHMgdGhlIHJlbGV2YW50IGJhY2t1cCBlbmNyeXB0ZWROU2hhcmUgYmFzZWQgb24gd2hldGhlciB0aGVcbiAgICogYmFja3VwIGtleSBpcyB1c2VyIG9yIHRoaXJkIHBhcnR5IGdlbmVyYXRlZFxuICAgKiBAcGFyYW0gYmFja3VwU2hhcmUgY2FuIGVpdGhlciBoYXZlIGtleSBzaGFyZXMgZnJvbSB0aGUgdXNlciBvciB0aGlyZCBwYXJ0eVxuICAgKiBAcGFyYW0gcmVjaXBpZW50SW5kZXggaW5kZXggb2YgdGhlIHBhcnR5IHJlY2VpdmluZyB0aGUgYmFja3VwIHNoYXJlc1xuICAgKiBAcGFyYW0gcmVjaXBpZW50R3BnUHVibGljQXJtb3IgZ3BnIGFybW9yIG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIGJhY2t1cEdwZ0tleSBiYWNrdXAgZ3BnIGtleVxuICAgKiBAcGFyYW0gaXNUaGlyZFBhcnR5QmFja3VwIHdoZXRoZXIgdGhlIGJhY2t1cCBpcyBnZW5lcmF0ZWQgYnkgdGhpcmQgcGFydHlcbiAgICovXG4gIGFzeW5jIGdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICBiYWNrdXBTaGFyZTogQmFja3VwS2V5U2hhcmUsXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICByZWNpcGllbnRHcGdQdWJsaWNBcm1vcjogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPlxuICApOiBQcm9taXNlPEVuY3J5cHRlZE5TaGFyZT4ge1xuICAgIGFzc2VydChiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICBjb25zdCBiYWNrdXBUb1JlY2lwaWVudFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIGJhY2t1cFNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICByZWNpcGllbnRJbmRleCxcbiAgICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yLFxuICAgICAgYmFja3VwR3BnS2V5XG4gICAgKTtcbiAgICByZXR1cm4gYmFja3VwVG9SZWNpcGllbnRTaGFyZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogS2V5LFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgbGV0IHJlY2lwaWVudDogc3RyaW5nO1xuICAgIGxldCBrZXlTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IG90aGVyU2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCByZWNpcGllbnRHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBsZXQgc2VuZGVyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gICAgaWYgKHJlY2lwaWVudEluZGV4ID09PSAxKSB7XG4gICAgICBrZXlTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICd1c2VyJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgICBzZW5kZXJHcGdLZXkgPSB1c2VyTG9jYWxCYWNrdXBHcGdLZXk7XG4gICAgfSBlbHNlIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMikge1xuICAgICAga2V5U2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICByZWNpcGllbnQgPSAnYmFja3VwJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1JlY2lwaWVudFNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gcmVjaXBpZW50XG4gICAgKTtcbiAgICBpZiAoIWJpdEdvVG9SZWNpcGllbnRTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIEJpdEdvIHRvICR7cmVjaXBpZW50fSBrZXkgc2hhcmVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZSA9IGF3YWl0IHRoaXMuZGVjcnlwdFByaXZhdGVTaGFyZShiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlLCByZWNpcGllbnRHcGdLZXkpO1xuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXhcbiAgICApO1xuXG4gICAgY29uc3Qgc2VuZGVyVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICBvdGhlclNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICByZWNpcGllbnRHcGdLZXkucHVibGljS2V5LFxuICAgICAgc2VuZGVyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICAvLyB1c2VyVG9CYWNrdXAgb3IgYmFja3VwVG9Vc2VyXG4gICAgICAgIG5TaGFyZTogc2VuZGVyVG9SZWNpcGllbnRTaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHNlbmRlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBiaXRnb1RvUmVjaXBpZW50XG4gICAgICAgIG5TaGFyZToge1xuICAgICAgICAgIGk6IHJlY2lwaWVudEluZGV4LFxuICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBlbmNyeXB0ZWRQcml2YXRlU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYml0R29Ub1JlY2lwaWVudFNoYXJlLm4hLFxuICAgICAgICAgIHZzc1Byb29mOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVjaXBpZW50Q29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICBrZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHJlY2lwaWVudENvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6IHJlY2lwaWVudCxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgICAgZW5jcnlwdGVkUHJ2OiB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogcHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiByZWNpcGllbnRJbmRleCA9PT0gMVxuICAgICAgPyBhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKVxuICAgICAgOiBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbChwYXJhbXM6IHtcbiAgICBjaGFsbGVuZ2VzOiB7XG4gICAgICBlbnRlcnByaXNlQ2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXM7XG4gICAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gICAgfTtcbiAgICBwcnY6IHN0cmluZztcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFRzc0VjZHNhU3RlcDFSZXR1cm5NZXNzYWdlPiB7XG4gICAgY29uc3QgeyBjaGFsbGVuZ2VzLCBkZXJpdmF0aW9uUGF0aCwgcHJ2IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgaWYgKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmkgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cE5TaGFyZScpO1xuICAgIH1cbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBzaWduaW5nS2V5ID0gTVBDLmtleURlcml2ZShcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLFxuICAgICAgW3VzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlXSxcbiAgICAgIGRlcml2YXRpb25QYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvSW5kZXggPSBTaGFyZUtleVBvc2l0aW9uLkJJVEdPO1xuICAgIGNvbnN0IHVzZXJJbmRleCA9IHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmk7XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSwgcDogcGEgfSA9IGNoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZTtcbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiwgcDogcGIsIG46IG5iIH0gPSBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlO1xuICAgIGNvbnN0IHVzZXJYU2hhcmUgPSBNUEMuYXBwZW5kQ2hhbGxlbmdlKHNpZ25pbmdLZXkueFNoYXJlLCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSB9LCB7IHA6IHBhIH0pO1xuICAgIGNvbnN0IGJpdGdvWVNoYXJlID0gTVBDLmFwcGVuZENoYWxsZW5nZShcbiAgICAgIHtcbiAgICAgICAgaTogdXNlckluZGV4LFxuICAgICAgICBqOiBiaXRnb0luZGV4LFxuICAgICAgICBuOiBuYixcbiAgICAgIH0sXG4gICAgICB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9LFxuICAgICAgeyBwOiBwYiB9XG4gICAgKTtcblxuICAgIGNvbnN0IHVzZXJTaWduU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25TaGFyZSh1c2VyWFNoYXJlLCBiaXRnb1lTaGFyZSk7XG4gICAgY29uc3QgdSA9IHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS51O1xuXG4gICAgbGV0IGNoYWluY29kZSA9IHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUuY2hhaW5jb2RlO1xuICAgIHdoaWxlIChjaGFpbmNvZGUubGVuZ3RoIDwgNjQpIHtcbiAgICAgIGNoYWluY29kZSA9ICcwJyArIGNoYWluY29kZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyU2hhcmUgPSBiaXAzMi5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbSh1LCAnaGV4JyksIEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gKGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pKS5tcGNWMTtcbiAgICBjb25zdCBlbmNyeXB0ZWRTaWduZXJTaGFyZSA9IChhd2FpdCBvcGVucGdwLmVuY3J5cHQoe1xuICAgICAgbWVzc2FnZTogYXdhaXQgb3BlbnBncC5jcmVhdGVNZXNzYWdlKHtcbiAgICAgICAgdGV4dDogc2lnbmVyU2hhcmUsXG4gICAgICB9KSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uS2V5czogW2JpdGdvR3BnS2V5XSxcbiAgICB9KSkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IHByaXZhdGVTaGFyZVByb29mID0gYXdhaXQgY3JlYXRlU2hhcmVQcm9vZih1c2VyR3BnS2V5LnByaXZhdGVLZXksIHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS51LCAnZWNkc2EnKTtcbiAgICBjb25zdCB2c3NQcm9vZiA9IHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS52O1xuICAgIGNvbnN0IHVzZXJQdWJsaWNHcGdLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcbiAgICBjb25zdCBwdWJsaWNTaGFyZSA9IHNpZ25pbmdLZXkublNoYXJlc1tiaXRnb0luZGV4XS55ICsgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLmNoYWluY29kZTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IHByaXZhdGVTaGFyZVByb29mLFxuICAgICAgdnNzUHJvb2Y6IHZzc1Byb29mLFxuICAgICAgcHVibGljU2hhcmU6IHB1YmxpY1NoYXJlLFxuICAgICAgZW5jcnlwdGVkU2lnbmVyT2Zmc2V0U2hhcmU6IGVuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgdXNlclB1YmxpY0dwZ0tleTogdXNlclB1YmxpY0dwZ0tleSxcbiAgICAgIGtTaGFyZTogdXNlclNpZ25TaGFyZS5rU2hhcmUsXG4gICAgICB3U2hhcmU6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlXG4gICAgICAgID8gdGhpcy5iaXRnby5lbmNyeXB0KHsgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHVzZXJTaWduU2hhcmUud1NoYXJlKSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pXG4gICAgICAgIDogdXNlclNpZ25TaGFyZS53U2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHNzRWNkc2FTdGVwMlNpZ25pbmdNYXRlcmlhbChwYXJhbXM6IHtcbiAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gICAgd1NoYXJlOiBXU2hhcmU7XG4gICAgYVNoYXJlRnJvbUJpdGdvOiBPbWl0PEFTaGFyZSwgJ2gxJyB8ICdoMicgfCAnbnRpbGRlJz47XG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2U+IHtcbiAgICAvLyBBcHBlbmQgdGhlIEJpdEdvIGNoYWxsZW5nZSB0byB0aGUgQXNoYXJlIHRvIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBwcm9vZnNcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZVdpdGhOdGlsZGU6IEFTaGFyZSA9IHtcbiAgICAgIC4uLnBhcmFtcy5hU2hhcmVGcm9tQml0Z28sXG4gICAgICAuLi5wYXJhbXMuYml0Z29DaGFsbGVuZ2UsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyR2FtbWFBbmRNdVNoYXJlcyA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyR2FtbWFBbmRNdVNoYXJlKFxuICAgICAgcGFyYW1zLndTaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE50aWxkZVxuICAgICk7XG4gICAgY29uc3QgdXNlck9taWNyb25BbmREZWx0YVNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZShcbiAgICAgIHVzZXJHYW1tYUFuZE11U2hhcmVzLmdTaGFyZSBhcyBFQ0RTQS5HU2hhcmVcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBtdURTaGFyZToge1xuICAgICAgICBtdVNoYXJlOiB1c2VyR2FtbWFBbmRNdVNoYXJlcy5tdVNoYXJlLFxuICAgICAgICBkU2hhcmU6IHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5kU2hhcmUsXG4gICAgICAgIGk6IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUuaSxcbiAgICAgIH0sXG4gICAgICBvU2hhcmU6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlXG4gICAgICAgID8gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUub1NoYXJlKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIGdldE9mZmxpbmVTaWduZXJQYWlsbGllck1vZHVsdXMocGFyYW1zOiB7IHBydjogc3RyaW5nIH0pOiB7IHVzZXJQYWlsbGllck1vZHVsdXM6IHN0cmluZyB9IHtcbiAgICBhc3NlcnQocGFyYW1zLnBydiwgJ1BhcmFtcyB0byBnZXQgcGFpbGxpZXIgbW9kdWx1cyBhcmUgbWlzc2luZyBwcnYuJyk7XG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBhcmFtcy5wcnYpO1xuICAgIHJldHVybiB7IHVzZXJQYWlsbGllck1vZHVsdXM6IHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLm4gfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVLU2hhcmUocGFyYW1zOiB7XG4gICAgdHNzUGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlO1xuICAgIGNoYWxsZW5nZXM6IHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB9O1xuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZTtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFRzc0VjZHNhU3RlcDFSZXR1cm5NZXNzYWdlPiB7XG4gICAgY29uc3QgeyB0c3NQYXJhbXMsIHBydiwgcmVxdWVzdFR5cGUsIGNoYWxsZW5nZXMgfSA9IHBhcmFtcztcbiAgICBhc3NlcnQodHlwZW9mIHRzc1BhcmFtcy50eFJlcXVlc3QgIT09ICdzdHJpbmcnLCAnSW52YWxpZCB0eFJlcXVlc3QgdHlwZScpO1xuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID0gdHNzUGFyYW1zLnR4UmVxdWVzdDtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgKHR4UmVxdWVzdCBhcyBUeFJlcXVlc3QpLnVuc2lnbmVkVHhzLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICAgICk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgLy8gVE9ETyBCRy02NzI5OSBNZXNzYWdlIHNpZ25pbmcgd2l0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICAgIGRlcml2YXRpb25QYXRoID0gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDFTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgcHJ2OiBwcnYsXG4gICAgICBjaGFsbGVuZ2VzOiBjaGFsbGVuZ2VzLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IGRlcml2YXRpb25QYXRoLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lTXVEZWx0YVNoYXJlKHBhcmFtczoge1xuICAgIGFTaGFyZUZyb21CaXRnbzogT21pdDxBU2hhcmUsICdudGlsZGUnIHwgJ2gxJyB8ICdoMic+O1xuICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICBlbmNyeXB0ZWRXU2hhcmU6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFRzc0VjZHNhU3RlcDJSZXR1cm5NZXNzYWdlPiB7XG4gICAgY29uc3QgZGVjcnlwdGVkV1NoYXJlID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHBhcmFtcy5lbmNyeXB0ZWRXU2hhcmUsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogcGFyYW1zLmFTaGFyZUZyb21CaXRnbyxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBwYXJhbXMuYml0Z29DaGFsbGVuZ2UsXG4gICAgICB3U2hhcmU6IEpTT04ucGFyc2UoZGVjcnlwdGVkV1NoYXJlKSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVNTaGFyZShwYXJhbXM6IHtcbiAgICB0c3NQYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2U7XG4gICAgZFNoYXJlRnJvbUJpdGdvOiBEU2hhcmU7XG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlO1xuICAgIGVuY3J5cHRlZE9TaGFyZTogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U1NoYXJlPiB7XG4gICAgY29uc3QgeyB0c3NQYXJhbXMsIHJlcXVlc3RUeXBlLCBkU2hhcmVGcm9tQml0Z28sIGVuY3J5cHRlZE9TaGFyZSwgd2FsbGV0UGFzc3BocmFzZSB9ID0gcGFyYW1zO1xuICAgIGFzc2VydCh0eXBlb2YgdHNzUGFyYW1zLnR4UmVxdWVzdCAhPT0gJ3N0cmluZycsICdJbnZhbGlkIHR4UmVxdWVzdCB0eXBlJyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPSB0c3NQYXJhbXMudHhSZXF1ZXN0O1xuICAgIGxldCBzaWduYWJsZVBheWxvYWQ7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IChwYXJhbXMudHNzUGFyYW1zIGFzIFRTU1BhcmFtc0Zvck1lc3NhZ2UpLmJ1ZmZlclRvU2lnbjtcbiAgICB9XG4gICAgbGV0IGhhc2g6IEhhc2ggfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVjcnlwdGVkT1NoYXJlID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZE9TaGFyZSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgY29uc3QgeyBpLCBSLCBzLCB5IH0gPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25hdHVyZVNoYXJlKFxuICAgICAgSlNPTi5wYXJzZShkZWNyeXB0ZWRPU2hhcmUpLFxuICAgICAgZFNoYXJlRnJvbUJpdGdvLFxuICAgICAgc2lnbmFibGVQYXlsb2FkLFxuICAgICAgaGFzaFxuICAgICk7XG4gICAgLy8gcmV0dXJuIG9ubHkgcmVxdWlyZWQgU1NoYXJlIHdpdGhvdXQgYmlnaW50cyBmcm9tIFZBU2hhcmVcbiAgICByZXR1cm4ge1xuICAgICAgaSxcbiAgICAgIFIsXG4gICAgICBzLFxuICAgICAgeSxcbiAgICB9O1xuICB9XG4gIGFzeW5jIHNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSxcbiAgICBleHRlcm5hbFNpZ25lclBhaWxsaWVyTW9kdWx1c0dldHRlcjogQ3VzdG9tUGFpbGxpZXJNb2R1bHVzR2V0dGVyRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcjogQ3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyU1NoYXJlR2VuZXJhdG9yOiBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHR4UmVxdWVzdE9iajogVHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCBhcyBzdHJpbmcsIHBhcmFtcy5yZXFJZCk7XG4gICAgY29uc3QgeyB1c2VyUGFpbGxpZXJNb2R1bHVzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lclBhaWxsaWVyTW9kdWx1c0dldHRlcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0T2JqIH0pO1xuICAgIGNvbnN0IHsgZW50ZXJwcmlzZUNoYWxsZW5nZSwgYml0Z29DaGFsbGVuZ2UgfSA9IGF3YWl0IHRoaXMuZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyhcbiAgICAgIHR4UmVxdWVzdCBhcyBzdHJpbmcsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHVzZXJQYWlsbGllck1vZHVsdXMsXG4gICAgICAwLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBjb25zdCBzdGVwMVNpZ25pbmdNYXRlcmlhbCA9IGF3YWl0IGV4dGVybmFsU2lnbmVyS1NoYXJlR2VuZXJhdG9yKHtcbiAgICAgIHRzc1BhcmFtczoge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0T2JqLFxuICAgICAgfSxcbiAgICAgIGNoYWxsZW5nZXM6IHsgZW50ZXJwcmlzZUNoYWxsZW5nZSwgYml0Z29DaGFsbGVuZ2UgfSxcbiAgICAgIHJlcXVlc3RUeXBlOiByZXF1ZXN0VHlwZSxcbiAgICB9KTtcbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwua1NoYXJlLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkU2lnbmVyT2Zmc2V0U2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC52c3NQcm9vZixcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwucHVibGljU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC51c2VyUHVibGljR3BnS2V5LFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgT21pdDxBU2hhcmUsICdudGlsZGUnIHwgJ2gxJyB8ICdoMic+OyAvLyBXUC9IU00gZG9lcyBub3QgcmV0dXJuIHRoZSBpbml0aWFsIGNoYWxsZW5nZVxuICAgIGNvbnN0IHN0ZXAyUmV0dXJuID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJNdURlbHRhU2hhcmVHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmosXG4gICAgICBhU2hhcmVGcm9tQml0Z286IGJpdGdvVG9Vc2VyQVNoYXJlLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IGJpdGdvQ2hhbGxlbmdlLFxuICAgICAgZW5jcnlwdGVkV1NoYXJlOiBzdGVwMVNpZ25pbmdNYXRlcmlhbC53U2hhcmUgYXMgc3RyaW5nLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdHdvIHdpdGggbXVTaGFyZSBhbmQgZFNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEQgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckRTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0T2JqLnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLk1VU2hhcmUsXG4gICAgICBzdGVwMlJldHVybi5tdURTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICkpIGFzIERTaGFyZTtcbiAgICBjb25zdCB1c2VyU1NoYXJlID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJTU2hhcmVHZW5lcmF0b3Ioe1xuICAgICAgdHNzUGFyYW1zOiB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmosXG4gICAgICB9LFxuICAgICAgZFNoYXJlRnJvbUJpdGdvOiBiaXRnb1RvVXNlckRTaGFyZSxcbiAgICAgIHJlcXVlc3RUeXBlOiByZXF1ZXN0VHlwZSxcbiAgICAgIGVuY3J5cHRlZE9TaGFyZTogc3RlcDJSZXR1cm4ub1NoYXJlIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuU1NoYXJlLFxuICAgICAgdXNlclNTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzaWduaW5nIGtleSwgdHhSZXF1ZXN0UmVzb2x2ZWQgYW5kIHR4UmVxdWVzdElkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHsgc3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25SZXF1ZXN0QmFzZShcbiAgICBwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYgfCBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGVcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCBwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbiA9IHRoaXMud2FsbGV0LmNvaW5TcGVjaWZpYygpPy5wZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbjtcbiAgICBpZiAocGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dhbGxldCBpcyBub3QgcmVhZHkgZm9yIFRTUyBFQ0RTQSBzaWduaW5nLiBQbGVhc2UgY29udGFjdCB5b3VyIGVudGVycHJpc2UgYWRtaW4gdG8gZmluaXNoIHRoZSBlbnRlcnByaXNlIFRTUyBpbml0aWFsaXphdGlvbi4nXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgaWYgKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLmkgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cE5TaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcblxuICAgIGxldCBzaWduYWJsZVBheWxvYWQgPSBuZXcgQnVmZmVyKCcnKTtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGggPSAnJztcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IHR4UmVxdWVzdC51bnNpZ25lZFR4cywgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcblxuICAgICAgY29uc3QgZWZmZWN0aXZlVHhQYXJhbXMgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCBwYXJhbXMudHhQYXJhbXMpO1xuXG4gICAgICAvLyBGb3IgSUNQIHRyYW5zYWN0aW9ucywgdGhlIEhTTSBzaWducyB0aGUgc2VyaWFsaXplZFR4SGV4LCB3aGlsZSB0aGUgdXNlciBzaWducyB0aGUgc2lnbmFibGVIZXggc2VwYXJhdGVseS5cbiAgICAgIC8vIFZlcmlmaWNhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGRpcmVjdGx5IG9uIHRoZSBzaWduYWJsZUhleCBhbG9uZS4gSG93ZXZlciwgd2UgY2FuIHBhcnNlIHRoZSBzZXJpYWxpemVkVHhIZXhcbiAgICAgIC8vIHRvIHJlZ2VuZXJhdGUgdGhlIHNpZ25hYmxlSGV4IGFuZCBjb21wYXJlIGl0IGFnYWluc3QgdGhlIHByb3ZpZGVkIHZhbHVlIGZvciB2ZXJpZmljYXRpb24uXG4gICAgICAvLyBJbiBjb250cmFzdCwgZm9yIG90aGVyIGNvaW4gZmFtaWxpZXMsIHZlcmlmaWNhdGlvbiBpcyB0eXBpY2FsbHkgZG9uZSB1c2luZyBqdXN0IHRoZSBzaWduYWJsZUhleC5cbiAgICAgIGlmICh0aGlzLmJhc2VDb2luLmdldENvbmZpZygpLmZhbWlseSA9PT0gJ2ljcCcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsIHR4SW5mbzogdW5zaWduZWRUeC5zaWduYWJsZUhleCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiBlZmZlY3RpdmVUeFBhcmFtcyxcbiAgICAgICAgICB3YWxsZXQ6IHRoaXMud2FsbGV0LFxuICAgICAgICAgIHdhbGxldFR5cGU6IHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZSgpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHVuc2lnbmVkVHguc2lnbmFibGVIZXggfSxcbiAgICAgICAgICB0eFBhcmFtczogZWZmZWN0aXZlVHhQYXJhbXMsXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcyBhcyBUU1NQYXJhbXNGb3JNZXNzYWdlKS5idWZmZXJUb1NpZ247XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgIH1cbiAgICBjb25zdCBwYWlsbGllck1vZHVsdXMgPSB0aGlzLmdldE9mZmxpbmVTaWduZXJQYWlsbGllck1vZHVsdXMoeyBwcnY6IHBhcmFtcy5wcnYgfSk7XG4gICAgY29uc3QgY2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMuZ2V0RWNkc2FTaWduaW5nQ2hhbGxlbmdlcyhcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcGFpbGxpZXJNb2R1bHVzLnVzZXJQYWlsbGllck1vZHVsdXMsXG4gICAgICAwLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGNvbnN0IHN0ZXAxUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgfSk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIG9uZSB3aXRoIEsgc2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgQSBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4ua1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4uZW5jcnlwdGVkU2lnbmVyT2Zmc2V0U2hhcmUsXG4gICAgICBzdGVwMVJldHVybi52c3NQcm9vZixcbiAgICAgIHN0ZXAxUmV0dXJuLnByaXZhdGVTaGFyZVByb29mLFxuICAgICAgc3RlcDFSZXR1cm4ucHVibGljU2hhcmUsXG4gICAgICBzdGVwMVJldHVybi51c2VyUHVibGljR3BnS2V5LFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgT21pdDxBU2hhcmUsICdudGlsZGUnIHwgJ2gxJyB8ICdoMic+OyAvLyBXUC9IU00gZG9lcyBub3QgcmV0dXJuIHRoZSBpbml0aWFsIGNoYWxsZW5nZVxuXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBiaXRnb1RvVXNlckFTaGFyZSxcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBjaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLFxuICAgICAgd1NoYXJlOiBzdGVwMVJldHVybi53U2hhcmUgYXMgV1NoYXJlLFxuICAgIH0pO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgLy8gSWYgb25seSB0aGUgZ2V0SGFzaEZ1bmN0aW9uKCkgaXMgZGVmaW5lZCBmb3IgdGhlIGNvaW4gdXNlIGl0IG90aGVyd2lzZVxuICAgIC8vIHBhc3MgdW5kZWZpbmVkIGhhc2gsIGRlZmF1bHQgaGFzaCB3aWxsIGJlIHVzZWQgaW4gdGhhdCBjYXNlLlxuICAgIGxldCBoYXNoOiBIYXNoIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBzdGVwMlJldHVybi5vU2hhcmUgYXMgT1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBoYXNoXG4gICAgKTtcblxuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSAgKDAgZm9yIHR4LCAxIGZvciBtZXNzYWdlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFpbGxpZXJNb2R1bHVzIC0gcGFpbGxpZXIgcHVia2V5ICRuJFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgcmVxdWVzdFR5cGVcbiAgICogQHBhcmFtIHtJUmVxdWVzdFRyYWNlcn0gcmVxSWQgLSByZXF1ZXN0IHRyYWNlciByZXF1ZXN0IGlkXG4gICAqL1xuICBhc3luYyBnZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgIHR4UmVxdWVzdElkOiBzdHJpbmcsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIHdhbGxldFBhaWxsaWVyTW9kdWx1czogc3RyaW5nLFxuICAgIGluZGV4ID0gMCxcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8e1xuICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gIH0+IHtcbiAgICBjb25zdCBlbnRlcnByaXNlSWQgPSB0aGlzLndhbGxldC50b0pTT04oKS5lbnRlcnByaXNlO1xuICAgIGlmICghZW50ZXJwcmlzZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBtdXN0IGJlIGFuIGVudGVycHJpc2Ugd2FsbGV0LicpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBCaXRHbyByYW5nZSBwcm9vZiBhbmQgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3QgY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZSA9IGF3YWl0IGdldFR4UmVxdWVzdENoYWxsZW5nZShcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICBpbmRleC50b1N0cmluZygpLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB3YWxsZXRQYWlsbGllck1vZHVsdXMsXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb1RvRW50ZXJwcmlzZVBhaWxsaWVyQ2hhbGxlbmdlID0geyBwOiBjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLnAgfTtcbiAgICBjb25zdCBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5zZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7XG4gICAgICBwOiBhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YuZ2VuZXJhdGVQKGhleFRvQmlnSW50KGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubikpLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETyhCRy03ODc2NCk6IG9uY2UgdGhlIHBhaWxsaWVyIHByb29mcyBhcmUgY29tcGxldGUsIHJlZHVjZSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gb25lIEFQSSBjYWxsXG4gICAgY29uc3Qgd2FsbGV0Q2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMud2FsbGV0LmdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkID0gd2FsbGV0Q2hhbGxlbmdlcy5jcmVhdGVkQnk7XG4gICAgY29uc3QgYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCwgY2hhbGxlbmdlVmVyaWZpZXJVc2VySWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UuZGVyaXZlZFB1YmtleTtcblxuICAgIC8vIFZlcmlmeSBlbnRlcnByaXNlJ3MgY2hhbGxlbmdlIGlzIHNpZ25lZCBieSB0aGUgcmVzcGVjdGl2ZSBhZG1pbnMgZWNkaCBrZXljaGFpblxuICAgIGNvbnN0IGVudGVycHJpc2VSYXdDaGFsbGVuZ2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogd2FsbGV0Q2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5oMixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2U6IHN0cmluZyA9IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS52ZXJpZmllcnMuYWRtaW5TaWduYXR1cmU7XG4gICAgaWYgKFxuICAgICAgIXZlcmlmeUVjZGhTaWduYXR1cmUoXG4gICAgICAgIEVjZHNhVXRpbHMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoZW50ZXJwcmlzZVJhd0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBlbnRlcnByaXNlIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQml0R28gY2hhbGxlbmdlJ3MgWksgcHJvb2ZzIGhhdmUgYmVlbiB2ZXJpZmllZCBieSB0aGUgYWRtaW5cbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogd2FsbGV0Q2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZS5oMixcbiAgICAgIHA6IGJpdGdvVG9FbnRlcnByaXNlUGFpbGxpZXJDaGFsbGVuZ2UucCxcbiAgICAgIG46IGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UgPSB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLnZlcmlmaWVycy5hZG1pblNpZ25hdHVyZTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5RWNkaFNpZ25hdHVyZShcbiAgICAgICAgRWNkc2FVdGlscy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShiaXRnb0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBCaXRHbydzIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZToge1xuICAgICAgICAuLi5lbnRlcnByaXNlUmF3Q2hhbGxlbmdlLFxuICAgICAgICBwOiBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlLnAsXG4gICAgICB9LFxuICAgICAgYml0Z29DaGFsbGVuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgdS12YWx1ZSBwcm9vZnMgYW5kIEdQRyBrZXlzIHVzZWQgaW4gZ2VuZXJhdGluZyBhIFRTUyBFQ0RTQSB3YWxsZXQuXG4gICAqIEBwYXJhbSB1c2VyR3BnUHViIFRoZSB1c2VyJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiB1c2VyL3NlcnZlclxuICAgKiBAcGFyYW0gYmFja3VwR3BnUHViIFRoZSBiYWNrdXAncyBwdWJsaWMgR1BHIGtleSBmb3IgZW5jcnlwdGlvbiBiZXR3ZWVuIGJhY2t1cC9zZXJ2ZXJcbiAgICogQHBhcmFtIGJpdGdvS2V5Y2hhaW4gcHJldmlvdXNseSBjcmVhdGVkIEJpdEdvIGtleWNoYWluOyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlc1xuICAgKiBAcGFyYW0gZGVjcnlwdGVkU2hhcmUgVGhlIGRlY3J5cHRlZCBiaXRnby10by11c2VyL2JhY2t1cCBwcml2YXRlIHNoYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gdmVyaWZpZXJJbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhcnR5IHRvIHZlcmlmeTogMSA9IHVzZXIsIDIgPSBiYWNrdXBcbiAgICovXG4gIGFzeW5jIHZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgdXNlckdwZ1B1Yjogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1Yjogc3RyaW5nLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIGRlY3J5cHRlZFNoYXJlOiBzdHJpbmcsXG4gICAgdmVyaWZpZXJJbmRleDogMSB8IDJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MpO1xuXG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IHVzZXJLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHViIH0pO1xuICAgIGNvbnN0IHVzZXJLZXlJZCA9IHVzZXJLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG4gICAgY29uc3QgYmFja3VwS2V5UHViID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYmFja3VwR3BnUHViIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleUlkID0gYmFja3VwS2V5UHViLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpO1xuXG4gICAgY29uc3Qgd2FsbGV0U2lnbmF0dXJlcyA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleXMoeyBhcm1vcmVkS2V5czogYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzIH0pO1xuICAgIGlmICh3YWxsZXRTaWduYXR1cmVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdhbGxldCBzaWduYXR1cmVzJyk7XG4gICAgfVxuICAgIGlmICh1c2VyS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMF0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmlyc3Qgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCB1c2VyIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cbiAgICBpZiAoYmFja3VwS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMV0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2Vjb25kIHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgYmFja3VwIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICB3YWxsZXRTaWduYXR1cmU6IHdhbGxldFNpZ25hdHVyZXNbMF0sXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJLZXlJZCxcbiAgICAgIGJhY2t1cEtleUlkLFxuICAgICAgYml0Z29QdWI6IGJpdGdvR3BnS2V5LFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICB2ZXJpZmllckluZGV4LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1sxXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBjaGFsbGVuZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgdjEgZWNkaCBrZXkgYXQgYSBkZXJpdmVkIHBhdGhcbiAgICogQHBhcmFtIGNoYWxsZW5nZSBjaGFsbGVuZ2UgdG8gc2lnblxuICAgKiBAcGFyYW0gZWNkaFhwcnYgeHBydiBvZiB0aGUgZWNkaCBrZXlcbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmVkIHBhdGggYXQgd2hpY2ggdGhlIGVjZGgga2V5IHdpbGwgc2lnblxuICAgKi9cbiAgc3RhdGljIHNpZ25DaGFsbGVuZ2UoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUsIGVjZGhYcHJ2OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1NpZ24gPSB0aGlzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZSk7XG4gICAgcmV0dXJuIHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KG1lc3NhZ2VUb1NpZ24sIGVjZGhYcHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgY2hhbGxlbmdlIHRvIGEgY29tbW9uIG1lc3NhZ2UgZm9ybWF0IHdoaWNoIGNhbiBiZSBzaWduZWQuXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBnZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNoYWxsZW5nZS5udGlsZGUuY29uY2F0KGNoYWxsZW5nZS5oMSkuY29uY2F0KGNoYWxsZW5nZS5oMik7XG4gIH1cblxuICAvKipcbiAgIFZlcmlmaWVzIFpLIHByb29mcyBvZiBCaXRHbydzIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNc1xuICAgd2hpY2ggYXJlIGZldGNoZWQgZnJvbSB0aGUgV1AgQVBJLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXM6IEdldEJpdEdvQ2hhbGxlbmdlc0FwaSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFZlcmlmeSBpbnN0aXR1dGlvbmFsIGhzbSBjaGFsbGVuZ2UgcHJvb2ZcbiAgICBjb25zdCBpbnN0Q2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSxcbiAgICAgIGgyOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICAvLyBWZXJpZnkgbml0cm8gaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RDaGFsbGVuZ2VWZXJpZmllZCAmJiBuaXRyb0NoYWxsZW5nZVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIFpLIHByb29mIGZvciBhIHNpbmdsZSBCaXRHbyBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoYml0Z29DaGFsbGVuZ2UpO1xuICAgIGNvbnN0IG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnZlcmlmeU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMSxcbiAgICAgICAgaDI6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICB9LFxuICAgICAgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyXG4gICAgKTtcbiAgICBjb25zdCBudGlsZGVQcm9vZkgyV3J0SDFWZXJpZmllZCA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDJXcnRIMVxuICAgICk7XG4gICAgcmV0dXJuIG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkICYmIG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJpdGdvIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNcyBmcm9tIFdQIEFQSS5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvOiBCaXRHb0Jhc2UpOiBQcm9taXNlPEdldEJpdEdvQ2hhbGxlbmdlc0FwaT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJpdGdvLmdldChiaXRnby51cmwoJy90c3MvZWNkc2EvY2hhbGxlbmdlcycsIDIpKS5zZW5kKCkucmVzdWx0KCk7XG4gICAgaWYgKFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20uaDEgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5oMiB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDIgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZVByb29mXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEJpdEdvIGNoYWxsZW5nZSBwcm9vZiB0byBiZSBwcmVzZW50LiBDb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgQml0R28ncyBwcm9vZnMgZnJvbSBBUEkgYW5kIHNpZ25zIHRoZW0gaWYgdGhlIHByb29mcyBhcmUgdmFsaWQuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRWZXJpZnlBbmRTaWduQml0R29DaGFsbGVuZ2VzKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCaXRHb1Byb29mU2lnbmF0dXJlcz4ge1xuICAgIC8vIEZldGNoIEJpdEdvJ3MgY2hhbGxlbmdlIGFuZCB2ZXJpZnlcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYXdhaXQgRWNkc2FVdGlscy5nZXRCaXRHb0NoYWxsZW5nZXMoYml0Z28pO1xuICAgIGlmICghKGF3YWl0IEVjZHNhVXRpbHMudmVyaWZ5Qml0R29DaGFsbGVuZ2VzKGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHZlcmlmeSBCaXRHbydzIGNoYWxsZW5nZSBuZWVkZWQgdG8gZW5hYmxlIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IEVjZHNhVXRpbHMuc2lnbkJpdGdvQ2hhbGxlbmdlcyhiaXRnbywgZW50ZXJwcmlzZUlkLCB1c2VyUGFzc3dvcmQsIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gQml0Z28ncyBwcm9vZnMsIHZlcmlmaWNhdGlvbiBvZiBwcm9vZnMgaXMgbGVmdCB0byB0aGUgY2FsbGVyXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMgT3B0aW9uYWxseSBwcm92aWRlIEJpdGdvIENoYWxsYWVuZ2UgJiBQcm9vZnMgaW5zdGVhZCBvZiBmZXRjaGluZyBmcm9tIEFQSVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpZ25CaXRnb0NoYWxsZW5nZXMoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZyxcbiAgICBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzPzogR2V0Qml0R29DaGFsbGVuZ2VzQXBpXG4gICk6IFByb21pc2U8Qml0R29Qcm9vZlNpZ25hdHVyZXM+IHtcbiAgICAvLyBmZXRjaCBjaGFsbGVuZ2UgJiBwcm9vZiBpZiBub25lIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGNoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mc1xuICAgICAgPyBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzXG4gICAgICA6IGF3YWl0IEVjZHNhVXRpbHMuZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvKTtcblxuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudGVycHJpc2VJZCk7XG5cbiAgICBjb25zdCBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb0luc3RpdHV0aW9uYWxIc20sXG4gICAgICBlY2RoS2V5cGFpci54cHJ2LFxuICAgICAgZWNkaEtleXBhaXIuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgZWNkaEtleXBhaXIueHBydixcbiAgICAgIGVjZGhLZXlwYWlyLmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBvcGVuU1NMQnl0ZXM6IFVpbnQ4QXJyYXksXG4gICAgY2hhbGxlbmdlPzogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudElkKTtcblxuICAgIC8vIEdlbmVyYXRlIGFuZCBzaWduIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAgY29uc3QgZW50Q2hhbGxlbmdlV2l0aFByb29mID1cbiAgICAgIGNoYWxsZW5nZSA/PyAoYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKG9wZW5TU0xCeXRlcywgbWluTW9kdWx1c0JpdExlbmd0aCkpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoZW50Q2hhbGxlbmdlV2l0aFByb29mKTtcbiAgICBjb25zdCBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIGVjZGhLZXlwYWlyLnhwcnYsXG4gICAgICBlY2RoS2V5cGFpci5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLnVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgICBiaXRnbyxcbiAgICAgIGVudElkLFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIHNpZ25lZEVudGVycHJpc2VDaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyB0aGUgc2lnbmVkIGNoYWxsZW5nZXMgYW5kIHRoZWlyIHByb29mcyBvbiB0aGUgZW50ZXJwcmlzZS5cbiAgICogVGhpcyBpbml0aWF0ZXMgZWNkc2Egc2lnbmluZyBmb3IgdGhlIGVudGVycHJpc2UgdXNlcnMuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2UgLSBjbGllbnQgc2lkZSBnZW5lcmF0ZWQgZW50IGNoYWxsZW5nZSB3aXRoIFpLIHByb29mc1xuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb0ludENoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIGluc3RpdHV0aW9uYWwgSFNNIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIG5pdHJvIEhTTSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyB1cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50SWQ6IHN0cmluZyxcbiAgICBlbnRDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB8IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG4gICAgZW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmU6IHN0cmluZyxcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgbnRpbGRlOiBlbnRDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZW50Q2hhbGxlbmdlLmgxLFxuICAgICAgICBoMjogZW50Q2hhbGxlbmdlLmgyLFxuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogZW50Q2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJpdGdvSW5zdGl0dXRpb25hbEhzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29OaXRyb0hzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoJ250aWxkZVByb29mJyBpbiBlbnRDaGFsbGVuZ2UpIHtcbiAgICAgIGJvZHkuZW50ZXJwcmlzZVsnbnRpbGRlUHJvb2YnXSA9IGVudENoYWxsZW5nZS5udGlsZGVQcm9vZjtcbiAgICB9XG4gICAgYXdhaXQgYml0Z29cbiAgICAgIC5wdXQoYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke2VudElkfS90c3Njb25maWcvZWNkc2EvY2hhbGxlbmdlYCwgMikpXG4gICAgICAuc2VuZChib2R5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG59XG4iXX0=
|
|
872
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMsaURBQW1DO0FBR25DLG9EQUF1SDtBQUN2SCw4Q0FBd0M7QUFFeEMseURBQStEO0FBRS9ELCtEQUFvRTtBQVVwRSw0Q0Flc0I7QUFDdEIsc0NBQTRDO0FBQzVDLG9EQUFrSDtBQUNsSCxxREFBNkY7QUFFN0YsNENBQTBEO0FBQzFELG9EQUFpRTtBQUNqRSx3Q0FBbUY7QUFDbkYsZ0RBQTREO0FBQzVELDhDQUs0QjtBQUM1QixpQ0FBd0M7QUFHeEMsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEscUJBQWM7SUFDNUMsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxLQUFhLEVBQ2IsY0FBc0IsRUFDdEIsWUFBc0IsRUFDdEIsYUFBdUIsRUFDdkIsVUFBcUMsRUFDckMsNEJBQWlDO1FBRWpDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxhQUFhLENBQ3BELFlBQVksRUFDWixDQUFDLEVBQ0QsNEJBQTRCLENBQUMsS0FBSyxFQUFFLEVBQ3BDLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FDekQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUNwRSxDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsZUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxlQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENB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Q0FBQztJQUNkLENBQUM7Q0FDRjtBQWh1Q0QsZ0NBZ3VDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgS2V5LCBTZXJpYWxpemVkS2V5UGFpciB9IGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBFY2RzYVBhaWxsaWVyUHJvb2YsIEVjZHNhUmFuZ2VQcm9vZiwgRWNkc2FUeXBlcywgaGV4VG9CaWdJbnQsIG1pbk1vZHVsdXNCaXRMZW5ndGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbXBvcnQgeyBFQ0RTQSwgRWNkc2EgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUsIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgRUNEU0FNZXRob2RzLCB7IEVDRFNBTWV0aG9kVHlwZXMgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7XG4gIEJpdEdvUHJvb2ZTaWduYXR1cmVzLFxuICBDcmVhdGVFY2RzYUJpdEdvS2V5Y2hhaW5QYXJhbXMsXG4gIENyZWF0ZUVjZHNhS2V5Y2hhaW5QYXJhbXMsXG4gIERlY3J5cHRhYmxlTlNoYXJlLFxuICBHZXRCaXRHb0NoYWxsZW5nZXNBcGksXG4gIEtleVNoYXJlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEJhY2t1cEtleVNoYXJlLFxuICBCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSxcbiAgQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbVBhaWxsaWVyTW9kdWx1c0dldHRlckZ1bmN0aW9uLFxuICBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydixcbiAgVHNzVHhSZWNpcGllbnRTb3VyY2UsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5pbXBvcnQgeyBBU2hhcmUsIERTaGFyZSwgRW5jcnlwdGVkTlNoYXJlLCBTZW5kU2hhcmVUeXBlLCBTU2hhcmUsIFdTaGFyZSwgT1NoYXJlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNoYXJlUHJvb2YsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXkgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IHZlcmlmeVdhbGxldFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5pbXBvcnQgeyBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSwgdmVyaWZ5RWNkaFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uL2VjZGgnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0Q2hhbGxlbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQge1xuICBTaGFyZUtleVBvc2l0aW9uLFxuICBUc3NFY2RzYVN0ZXAxUmV0dXJuTWVzc2FnZSxcbiAgVHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2UsXG4gIFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi8uLi90c3MvdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUVjZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuXG5jb25zdCBlbmNyeXB0TlNoYXJlID0gRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmU7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGNsYXNzIEVjZHNhVXRpbHMgZXh0ZW5kcyBCYXNlRWNkc2FVdGlscyB7XG4gIGFzeW5jIGZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJUb0JhY2t1cFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIDIsXG4gICAgICB0aGlyZFBhcnR5QmFja3VwUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICB1c2VyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwS2V5U2hhcmUgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcz8uZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGNvbnN0IHVzZXJQdWJsaWNTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0ueSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLm5TaGFyZXNbMl0uY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwS2V5U2hhcmUpO1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJhc2VDb2luLnVybChgL2tycy9iYWNrdXBrZXlzLyR7a2V5SWR9YCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgICB0bzogJ2JhY2t1cCcsXG4gICAgICAgICAgICBwdWJsaWNTaGFyZTogdXNlclB1YmxpY1NoYXJlLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgICBwcml2YXRlU2hhcmVQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgICAgICB2c3NQcm9vZjogZW5jcnlwdGVkVXNlclRvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXRnb1RvQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGlmICgha2V5UmVzcG9uc2UgfHwgIWtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCBiYWNrdXAga2V5IHZlcmlmaWNhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlSZXNwb25zZS5pZCxcbiAgICAgIGtleVNoYXJlczoga2V5UmVzcG9uc2Uua2V5U2hhcmVzLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGtleVJlc3BvbnNlLmNvbW1vbktleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBhd2FpdCBNUEMua2V5U2hhcmUoMSwgbSwgbik7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEtleVNoYXJlcygpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0QmFja3VwR3BnUHViS2V5KCk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXk6IHByaW1hcnlHcGdLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IHByaW1hcnlHcGdLZXkgPz8gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW5Qcm9taXNlLCBiYWNrdXBLZXljaGFpblByb21pc2VdKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleVNoYXJlcygpOiBQcm9taXNlPEJhY2t1cEtleVNoYXJlPiB7XG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSB7XG4gICAgICB1c2VySGVsZEtleVNoYXJlOiBhd2FpdCBNUEMua2V5U2hhcmUoMiwgbSwgbiksXG4gICAgfTtcbiAgICByZXR1cm4gYmFja3VwS2V5U2hhcmU7XG4gIH1cblxuICBjcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIHBhc3NwaHJhc2UsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIHdlYmF1dGhuSW5mbyxcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoIXBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cbiAgICBhc3NlcnQoYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgMSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mb1xuICAgICk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgcGFzc3BocmFzZSxcbiAgfTogQ3JlYXRlRWNkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBhc3NlcnQoYmFja3VwS2V5U2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgYXNzZXJ0KHBhc3NwaHJhc2UpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYmFja3VwR3BnS2V5IGFzIFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIDIsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2VcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICB9OiBDcmVhdGVFY2RzYUJpdEdvS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgcmVjaXBpZW50SW5kZXggPSAzO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKHVzZXJLZXlTaGFyZSwgcmVjaXBpZW50SW5kZXgsIGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksIHVzZXJHcGdLZXkpO1xuXG4gICAgY29uc3QgYmFja3VwVG9CaXRnb1NoYXJlID0gYXdhaXQgdGhpcy5nZXRCYWNrdXBFbmNyeXB0ZWROU2hhcmUoXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIHJlY2lwaWVudEluZGV4LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgIGJhY2t1cEdwZ0tleSBhcyBTZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+XG4gICAgKTtcblxuICAgIGNvbnN0IGNyZWF0ZUJpdEdvTVBDUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgc291cmNlOiAnYml0Z28nLFxuICAgICAga2V5U2hhcmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiB1c2VyVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgICAgdnNzUHJvb2Y6IHVzZXJUb0JpdGdvU2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IHVzZXJUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiYWNrdXBUb0JpdGdvU2hhcmUubixcbiAgICAgICAgICB2c3NQcm9vZjogYmFja3VwVG9CaXRnb1NoYXJlLnZzc1Byb29mLFxuICAgICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBiYWNrdXBUb0JpdGdvU2hhcmUucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdXNlckdQR1B1YmxpY0tleTogdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IChiYWNrdXBHcGdLZXkgYXMgU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPikucHVibGljS2V5LFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZSxcbiAgICAgIGFsZ29Vc2VkOiAnZWNkc2EnLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoY3JlYXRlQml0R29NUENQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYnVpbGRzIHRoZSByZWxldmFudCBiYWNrdXAgZW5jcnlwdGVkTlNoYXJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlXG4gICAqIGJhY2t1cCBrZXkgaXMgdXNlciBvciB0aGlyZCBwYXJ0eSBnZW5lcmF0ZWRcbiAgICogQHBhcmFtIGJhY2t1cFNoYXJlIGNhbiBlaXRoZXIgaGF2ZSBrZXkgc2hhcmVzIGZyb20gdGhlIHVzZXIgb3IgdGhpcmQgcGFydHlcbiAgICogQHBhcmFtIHJlY2lwaWVudEluZGV4IGluZGV4IG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yIGdwZyBhcm1vciBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSBiYWNrdXBHcGdLZXkgYmFja3VwIGdwZyBrZXlcbiAgICogQHBhcmFtIGlzVGhpcmRQYXJ0eUJhY2t1cCB3aGV0aGVyIHRoZSBiYWNrdXAgaXMgZ2VuZXJhdGVkIGJ5IHRoaXJkIHBhcnR5XG4gICAqL1xuICBhc3luYyBnZXRCYWNrdXBFbmNyeXB0ZWROU2hhcmUoXG4gICAgYmFja3VwU2hhcmU6IEJhY2t1cEtleVNoYXJlLFxuICAgIHJlY2lwaWVudEluZGV4OiBudW1iZXIsXG4gICAgcmVjaXBpZW50R3BnUHVibGljQXJtb3I6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz5cbiAgKTogUHJvbWlzZTxFbmNyeXB0ZWROU2hhcmU+IHtcbiAgICBhc3NlcnQoYmFja3VwU2hhcmUudXNlckhlbGRLZXlTaGFyZSk7XG4gICAgY29uc3QgYmFja3VwVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICBiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICByZWNpcGllbnRHcGdQdWJsaWNBcm1vcixcbiAgICAgIGJhY2t1cEdwZ0tleVxuICAgICk7XG4gICAgcmV0dXJuIGJhY2t1cFRvUmVjaXBpZW50U2hhcmU7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdXNlckxvY2FsQmFja3VwR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IEtleSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mb1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgbGV0IHJlY2lwaWVudDogc3RyaW5nO1xuICAgIGxldCBrZXlTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IG90aGVyU2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCByZWNpcGllbnRHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPjtcbiAgICBsZXQgc2VuZGVyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz47XG4gICAgaWYgKHJlY2lwaWVudEluZGV4ID09PSAxKSB7XG4gICAgICBrZXlTaGFyZSA9IHVzZXJLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIHJlY2lwaWVudCA9ICd1c2VyJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgICBzZW5kZXJHcGdLZXkgPSB1c2VyTG9jYWxCYWNrdXBHcGdLZXk7XG4gICAgfSBlbHNlIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMikge1xuICAgICAga2V5U2hhcmUgPSBiYWNrdXBLZXlTaGFyZTtcbiAgICAgIG90aGVyU2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICByZWNpcGllbnQgPSAnYmFja3VwJztcbiAgICAgIHJlY2lwaWVudEdwZ0tleSA9IHVzZXJMb2NhbEJhY2t1cEdwZ0tleTtcbiAgICAgIHNlbmRlckdwZ0tleSA9IHVzZXJHcGdLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1JlY2lwaWVudFNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gcmVjaXBpZW50XG4gICAgKTtcbiAgICBpZiAoIWJpdEdvVG9SZWNpcGllbnRTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIEJpdEdvIHRvICR7cmVjaXBpZW50fSBrZXkgc2hhcmVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZSA9IGF3YWl0IHRoaXMuZGVjcnlwdFByaXZhdGVTaGFyZShiaXRHb1RvUmVjaXBpZW50U2hhcmUucHJpdmF0ZVNoYXJlLCByZWNpcGllbnRHcGdLZXkpO1xuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1c2VyTG9jYWxCYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXhcbiAgICApO1xuXG4gICAgY29uc3Qgc2VuZGVyVG9SZWNpcGllbnRTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoXG4gICAgICBvdGhlclNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICByZWNpcGllbnRHcGdLZXkucHVibGljS2V5LFxuICAgICAgc2VuZGVyR3BnS2V5XG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICAvLyB1c2VyVG9CYWNrdXAgb3IgYmFja3VwVG9Vc2VyXG4gICAgICAgIG5TaGFyZTogc2VuZGVyVG9SZWNpcGllbnRTaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHNlbmRlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBiaXRnb1RvUmVjaXBpZW50XG4gICAgICAgIG5TaGFyZToge1xuICAgICAgICAgIGk6IHJlY2lwaWVudEluZGV4LFxuICAgICAgICAgIGo6IDMsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBlbmNyeXB0ZWRQcml2YXRlU2hhcmU6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYml0R29Ub1JlY2lwaWVudFNoYXJlLm4hLFxuICAgICAgICAgIHZzc1Byb29mOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUudnNzUHJvb2YsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGJpdEdvVG9SZWNpcGllbnRTaGFyZS5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiByZWNpcGllbnRHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVjaXBpZW50Q29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICBrZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHJlY2lwaWVudENvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6IHJlY2lwaWVudCxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgICAgZW5jcnlwdGVkUHJ2OiB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogcHJ2LFxuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2ViYXV0aG5EZXZpY2VzOlxuICAgICAgICB3ZWJhdXRobkluZm8gJiYgcmVjaXBpZW50SW5kZXggPT09IFNoYXJlS2V5UG9zaXRpb24uVVNFUlxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgICAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHJlY2lwaWVudEluZGV4ID09PSAxXG4gICAgICA/IGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpXG4gICAgICA6IGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAxU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGNoYWxsZW5nZXM6IHtcbiAgICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB9O1xuICAgIHBydjogc3RyaW5nO1xuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IGNoYWxsZW5nZXMsIGRlcml2YXRpb25QYXRoLCBwcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBNUEMua2V5RGVyaXZlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsXG4gICAgICBbdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmVdLFxuICAgICAgZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29JbmRleCA9IFNoYXJlS2V5UG9zaXRpb24uQklUR087XG4gICAgY29uc3QgdXNlckluZGV4ID0gdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhLCBwOiBwYSB9ID0gY2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlO1xuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiLCBwOiBwYiwgbjogbmIgfSA9IGNoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2U7XG4gICAgY29uc3QgdXNlclhTaGFyZSA9IE1QQy5hcHBlbmRDaGFsbGVuZ2Uoc2lnbmluZ0tleS54U2hhcmUsIHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0sIHsgcDogcGEgfSk7XG4gICAgY29uc3QgYml0Z29ZU2hhcmUgPSBNUEMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAge1xuICAgICAgICBpOiB1c2VySW5kZXgsXG4gICAgICAgIGo6IGJpdGdvSW5kZXgsXG4gICAgICAgIG46IG5iLFxuICAgICAgfSxcbiAgICAgIHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiIH0sXG4gICAgICB7IHA6IHBiIH1cbiAgICApO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnblNoYXJlKHVzZXJYU2hhcmUsIGJpdGdvWVNoYXJlKTtcbiAgICBjb25zdCB1ID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnU7XG5cbiAgICBsZXQgY2hhaW5jb2RlID0gdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5jaGFpbmNvZGU7XG4gICAgd2hpbGUgKGNoYWluY29kZS5sZW5ndGggPCA2NCkge1xuICAgICAgY2hhaW5jb2RlID0gJzAnICsgY2hhaW5jb2RlO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXJTaGFyZSA9IGJpcDMyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKHUsICdoZXgnKSwgQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpLnRvQmFzZTU4KCk7XG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgcHJpdmF0ZVNoYXJlUHJvb2YgPSBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnUsICdlY2RzYScpO1xuICAgIGNvbnN0IHZzc1Byb29mID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnY7XG4gICAgY29uc3QgdXNlclB1YmxpY0dwZ0tleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IHB1YmxpY1NoYXJlID0gc2lnbmluZ0tleS5uU2hhcmVzW2JpdGdvSW5kZXhdLnkgKyBzaWduaW5nS2V5Lm5TaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIHJldHVybiB7XG4gICAgICBwcml2YXRlU2hhcmVQcm9vZjogcHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICB2c3NQcm9vZjogdnNzUHJvb2YsXG4gICAgICBwdWJsaWNTaGFyZTogcHVibGljU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZTogZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICB1c2VyUHVibGljR3BnS2V5OiB1c2VyUHVibGljR3BnS2V5LFxuICAgICAga1NoYXJlOiB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIHdTaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZS53U2hhcmUpLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgICAgOiB1c2VyU2lnblNoYXJlLndTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHBhcmFtczoge1xuICAgIGJpdGdvQ2hhbGxlbmdlOiBUeFJlcXVlc3RDaGFsbGVuZ2VSZXNwb25zZTtcbiAgICB3U2hhcmU6IFdTaGFyZTtcbiAgICBhU2hhcmVGcm9tQml0Z286IE9taXQ8QVNoYXJlLCAnaDEnIHwgJ2gyJyB8ICdudGlsZGUnPjtcbiAgICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxUc3NFY2RzYVN0ZXAyUmV0dXJuTWVzc2FnZT4ge1xuICAgIC8vIEFwcGVuZCB0aGUgQml0R28gY2hhbGxlbmdlIHRvIHRoZSBBc2hhcmUgdG8gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IHByb29mc1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlV2l0aE50aWxkZTogQVNoYXJlID0ge1xuICAgICAgLi4ucGFyYW1zLmFTaGFyZUZyb21CaXRnbyxcbiAgICAgIC4uLnBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICBwYXJhbXMud1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJBU2hhcmVXaXRoTnRpbGRlXG4gICAgKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11RFNoYXJlOiB7XG4gICAgICAgIG11U2hhcmU6IHVzZXJHYW1tYUFuZE11U2hhcmVzLm11U2hhcmUsXG4gICAgICAgIGRTaGFyZTogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLmRTaGFyZSxcbiAgICAgICAgaTogdXNlckdhbW1hQW5kTXVTaGFyZXMubXVTaGFyZS5pLFxuICAgICAgfSxcbiAgICAgIG9TaGFyZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgPyB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZS5vU2hhcmUpLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdXNlck9taWNyb25BbmREZWx0YVNoYXJlLm9TaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0T2ZmbGluZVNpZ25lclBhaWxsaWVyTW9kdWx1cyhwYXJhbXM6IHsgcHJ2OiBzdHJpbmcgfSk6IHsgdXNlclBhaWxsaWVyTW9kdWx1czogc3RyaW5nIH0ge1xuICAgIGFzc2VydChwYXJhbXMucHJ2LCAnUGFyYW1zIHRvIGdldCBwYWlsbGllciBtb2R1bHVzIGFyZSBtaXNzaW5nIHBydi4nKTtcbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocGFyYW1zLnBydik7XG4gICAgcmV0dXJuIHsgdXNlclBhaWxsaWVyTW9kdWx1czogdXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUubiB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtTaGFyZShwYXJhbXM6IHtcbiAgICB0c3NQYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2U7XG4gICAgY2hhbGxlbmdlczoge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzO1xuICAgICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIH07XG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlO1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMVJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcHJ2LCByZXF1ZXN0VHlwZSwgY2hhbGxlbmdlcyB9ID0gcGFyYW1zO1xuICAgIGFzc2VydCh0eXBlb2YgdHNzUGFyYW1zLnR4UmVxdWVzdCAhPT0gJ3N0cmluZycsICdJbnZhbGlkIHR4UmVxdWVzdCB0eXBlJyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPSB0c3NQYXJhbXMudHhSZXF1ZXN0O1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCAodHhSZXF1ZXN0IGFzIFR4UmVxdWVzdCkudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICAvLyBUT0RPIEJHLTY3Mjk5IE1lc3NhZ2Ugc2lnbmluZyB3aXRoIGRlcml2YXRpb24gcGF0aFxuICAgICAgZGVyaXZhdGlvblBhdGggPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBydixcbiAgICAgIGNoYWxsZW5nZXM6IGNoYWxsZW5nZXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogZGVyaXZhdGlvblBhdGgsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVNdURlbHRhU2hhcmUocGFyYW1zOiB7XG4gICAgYVNoYXJlRnJvbUJpdGdvOiBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47XG4gICAgYml0Z29DaGFsbGVuZ2U6IFR4UmVxdWVzdENoYWxsZW5nZVJlc3BvbnNlO1xuICAgIGVuY3J5cHRlZFdTaGFyZTogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8VHNzRWNkc2FTdGVwMlJldHVybk1lc3NhZ2U+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWRXU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcGFyYW1zLmVuY3J5cHRlZFdTaGFyZSwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRzc0VjZHNhU3RlcDJTaWduaW5nTWF0ZXJpYWwoe1xuICAgICAgYVNoYXJlRnJvbUJpdGdvOiBwYXJhbXMuYVNoYXJlRnJvbUJpdGdvLFxuICAgICAgYml0Z29DaGFsbGVuZ2U6IHBhcmFtcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogSlNPTi5wYXJzZShkZWNyeXB0ZWRXU2hhcmUpLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPZmZsaW5lU1NoYXJlKHBhcmFtczoge1xuICAgIHRzc1BhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZTtcbiAgICBkU2hhcmVGcm9tQml0Z286IERTaGFyZTtcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGU7XG4gICAgZW5jcnlwdGVkT1NoYXJlOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTU2hhcmU+IHtcbiAgICBjb25zdCB7IHRzc1BhcmFtcywgcmVxdWVzdFR5cGUsIGRTaGFyZUZyb21CaXRnbywgZW5jcnlwdGVkT1NoYXJlLCB3YWxsZXRQYXNzcGhyYXNlIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHR5cGVvZiB0c3NQYXJhbXMudHhSZXF1ZXN0ICE9PSAnc3RyaW5nJywgJ0ludmFsaWQgdHhSZXF1ZXN0IHR5cGUnKTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9IHRzc1BhcmFtcy50eFJlcXVlc3Q7XG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gKHBhcmFtcy50c3NQYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgIH1cbiAgICBsZXQgaGFzaDogSGFzaCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZWNyeXB0ZWRPU2hhcmUgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkT1NoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCB7IGksIFIsIHMsIHkgfSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICBKU09OLnBhcnNlKGRlY3J5cHRlZE9TaGFyZSksXG4gICAgICBkU2hhcmVGcm9tQml0Z28sXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBoYXNoXG4gICAgKTtcbiAgICAvLyByZXR1cm4gb25seSByZXF1aXJlZCBTU2hhcmUgd2l0aG91dCBiaWdpbnRzIGZyb20gVkFTaGFyZVxuICAgIHJldHVybiB7XG4gICAgICBpLFxuICAgICAgUixcbiAgICAgIHMsXG4gICAgICB5LFxuICAgIH07XG4gIH1cbiAgYXN5bmMgc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyOiBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lcktTaGFyZUdlbmVyYXRvcjogQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTXVEZWx0YVNoYXJlR2VuZXJhdG9yOiBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJTU2hhcmVHZW5lcmF0b3I6IEN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb24gPSB0aGlzLndhbGxldC5jb2luU3BlY2lmaWMoKT8ucGVuZGluZ0VjZHNhVHNzSW5pdGlhbGl6YXRpb247XG4gICAgaWYgKHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXYWxsZXQgaXMgbm90IHJlYWR5IGZvciBUU1MgRUNEU0Egc2lnbmluZy4gUGxlYXNlIGNvbnRhY3QgeW91ciBlbnRlcnByaXNlIGFkbWluIHRvIGZpbmlzaCB0aGUgZW50ZXJwcmlzZSBUU1MgaW5pdGlhbGl6YXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhSZXF1ZXN0T2JqOiBUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0IGFzIHN0cmluZywgcGFyYW1zLnJlcUlkKTtcbiAgICBjb25zdCB7IHVzZXJQYWlsbGllck1vZHVsdXMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyUGFpbGxpZXJNb2R1bHVzR2V0dGVyKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmogfSk7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9ID0gYXdhaXQgdGhpcy5nZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgICAgdHhSZXF1ZXN0IGFzIHN0cmluZyxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdXNlclBhaWxsaWVyTW9kdWx1cyxcbiAgICAgIDAsXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGNvbnN0IHN0ZXAxU2lnbmluZ01hdGVyaWFsID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3Ioe1xuICAgICAgdHNzUGFyYW1zOiB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RPYmosXG4gICAgICB9LFxuICAgICAgY2hhbGxlbmdlczogeyBlbnRlcnByaXNlQ2hhbGxlbmdlLCBiaXRnb0NoYWxsZW5nZSB9LFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2Ugb25lIHdpdGggSyBzaGFyZSBzZW5kIHRvIGJpdGdvIGFuZCByZWNlaXZlcyBBIHNoYXJlXG4gICAgY29uc3QgYml0Z29Ub1VzZXJBU2hhcmUgPSAoYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5rU2hhcmUsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5lbmNyeXB0ZWRTaWduZXJPZmZzZXRTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnZzc1Byb29mLFxuICAgICAgc3RlcDFTaWduaW5nTWF0ZXJpYWwucHJpdmF0ZVNoYXJlUHJvb2YsXG4gICAgICBzdGVwMVNpZ25pbmdNYXRlcmlhbC5wdWJsaWNTaGFyZSxcbiAgICAgIHN0ZXAxU2lnbmluZ01hdGVyaWFsLnVzZXJQdWJsaWNHcGdLZXksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApKSBhcyBPbWl0PEFTaGFyZSwgJ250aWxkZScgfCAnaDEnIHwgJ2gyJz47IC8vIFdQL0hTTSBkb2VzIG5vdCByZXR1cm4gdGhlIGluaXRpYWwgY2hhbGxlbmdlXG4gICAgY29uc3Qgc3RlcDJSZXR1cm4gPSBhd2FpdCBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICBiaXRnb0NoYWxsZW5nZTogYml0Z29DaGFsbGVuZ2UsXG4gICAgICBlbmNyeXB0ZWRXU2hhcmU6IHN0ZXAxU2lnbmluZ01hdGVyaWFsLndTaGFyZSBhcyBzdHJpbmcsXG4gICAgfSk7XG4gICAgLy8gc2lnbmluZyBzdGFnZSB0d28gd2l0aCBtdVNoYXJlIGFuZCBkU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgRCBzaGFyZVxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RPYmoudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHN0ZXAyUmV0dXJuLm11RFNoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKSkgYXMgRFNoYXJlO1xuICAgIGNvbnN0IHVzZXJTU2hhcmUgPSBhd2FpdCBleHRlcm5hbFNpZ25lclNTaGFyZUdlbmVyYXRvcih7XG4gICAgICB0c3NQYXJhbXM6IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdE9iaixcbiAgICAgIH0sXG4gICAgICBkU2hhcmVGcm9tQml0Z286IGJpdGdvVG9Vc2VyRFNoYXJlLFxuICAgICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgICAgZW5jcnlwdGVkT1NoYXJlOiBzdGVwMlJldHVybi5vU2hhcmUgYXMgc3RyaW5nLFxuICAgIH0pO1xuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdGhyZWUgd2l0aCBTU2hhcmUgc2VuZCB0byBiaXRnbyBhbmQgcmVjZWl2ZXMgU1NoYXJlXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5TU2hhcmUsXG4gICAgICB1c2VyU1NoYXJlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdE9iai50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ25pbmcga2V5LCB0eFJlcXVlc3RSZXNvbHZlZCBhbmQgdHhSZXF1ZXN0SWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0geyBzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uID0gdGhpcy53YWxsZXQuY29pblNwZWNpZmljKCk/LnBlbmRpbmdFY2RzYVRzc0luaXRpYWxpemF0aW9uO1xuICAgIGlmIChwZW5kaW5nRWNkc2FUc3NJbml0aWFsaXphdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV2FsbGV0IGlzIG5vdCByZWFkeSBmb3IgVFNTIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbiB0byBmaW5pc2ggdGhlIGVudGVycHJpc2UgVFNTIGluaXRpYWxpemF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwYXJhbXMucHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZCA9IG5ldyBCdWZmZXIoJycpO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aCA9ICcnO1xuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgICBpZiAoXG4gICAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgICBwYXJhbXMucmVjaXBpZW50U291cmNlID09PSBUc3NUeFJlY2lwaWVudFNvdXJjZS5FeHBsaWNpdCAmJlxuICAgICAgICAhcGFyYW1zLnR4UGFyYW1zPy5yZWNpcGllbnRzPy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ3JlY2lwaWVudFNvdXJjZSBcImV4cGxpY2l0XCIgcmVxdWlyZXMgdHhQYXJhbXMucmVjaXBpZW50cyB3aXRoIGF0IGxlYXN0IG9uZSByZWNpcGllbnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgSUNQIHRyYW5zYWN0aW9ucywgdGhlIEhTTSBzaWducyB0aGUgc2VyaWFsaXplZFR4SGV4LCB3aGlsZSB0aGUgdXNlciBzaWducyB0aGUgc2lnbmFibGVIZXggc2VwYXJhdGVseS5cbiAgICAgIC8vIFZlcmlmaWNhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGRpcmVjdGx5IG9uIHRoZSBzaWduYWJsZUhleCBhbG9uZS4gSG93ZXZlciwgd2UgY2FuIHBhcnNlIHRoZSBzZXJpYWxpemVkVHhIZXhcbiAgICAgIC8vIHRvIHJlZ2VuZXJhdGUgdGhlIHNpZ25hYmxlSGV4IGFuZCBjb21wYXJlIGl0IGFnYWluc3QgdGhlIHByb3ZpZGVkIHZhbHVlIGZvciB2ZXJpZmljYXRpb24uXG4gICAgICAvLyBJbiBjb250cmFzdCwgZm9yIG90aGVyIGNvaW4gZmFtaWxpZXMsIHZlcmlmaWNhdGlvbiBpcyB0eXBpY2FsbHkgZG9uZSB1c2luZyBqdXN0IHRoZSBzaWduYWJsZUhleC5cbiAgICAgIGlmICh0aGlzLmJhc2VDb2luLmdldENvbmZpZygpLmZhbWlseSA9PT0gJ2ljcCcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsIHR4SW5mbzogdW5zaWduZWRUeC5zaWduYWJsZUhleCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQYXJhbXMgfHwgeyByZWNpcGllbnRzOiBbXSB9LFxuICAgICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zaWduYWJsZUhleCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQYXJhbXMgfHwgeyByZWNpcGllbnRzOiBbXSB9LFxuICAgICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IChwYXJhbXMgYXMgVFNTUGFyYW1zRm9yTWVzc2FnZSkuYnVmZmVyVG9TaWduO1xuICAgICAgLy8gVE9ETyBCRy02NzI5OSBNZXNzYWdlIHNpZ25pbmcgd2l0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICB9XG4gICAgY29uc3QgcGFpbGxpZXJNb2R1bHVzID0gdGhpcy5nZXRPZmZsaW5lU2lnbmVyUGFpbGxpZXJNb2R1bHVzKHsgcHJ2OiBwYXJhbXMucHJ2IH0pO1xuICAgIGNvbnN0IGNoYWxsZW5nZXMgPSBhd2FpdCB0aGlzLmdldEVjZHNhU2lnbmluZ0NoYWxsZW5nZXMoXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHBhaWxsaWVyTW9kdWx1cy51c2VyUGFpbGxpZXJNb2R1bHVzLFxuICAgICAgMCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBzdGVwMVJldHVybiA9IGF3YWl0IHRoaXMuY3JlYXRlVHNzRWNkc2FTdGVwMVNpZ25pbmdNYXRlcmlhbCh7XG4gICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICBjaGFsbGVuZ2VzOiBjaGFsbGVuZ2VzLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IGRlcml2YXRpb25QYXRoLFxuICAgIH0pO1xuXG4gICAgLy8gc2lnbmluZyBzdGFnZSBvbmUgd2l0aCBLIHNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEEgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLktTaGFyZSxcbiAgICAgIHN0ZXAxUmV0dXJuLmtTaGFyZSxcbiAgICAgIHN0ZXAxUmV0dXJuLmVuY3J5cHRlZFNpZ25lck9mZnNldFNoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4udnNzUHJvb2YsXG4gICAgICBzdGVwMVJldHVybi5wcml2YXRlU2hhcmVQcm9vZixcbiAgICAgIHN0ZXAxUmV0dXJuLnB1YmxpY1NoYXJlLFxuICAgICAgc3RlcDFSZXR1cm4udXNlclB1YmxpY0dwZ0tleSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICkpIGFzIE9taXQ8QVNoYXJlLCAnbnRpbGRlJyB8ICdoMScgfCAnaDInPjsgLy8gV1AvSFNNIGRvZXMgbm90IHJldHVybiB0aGUgaW5pdGlhbCBjaGFsbGVuZ2VcblxuICAgIGNvbnN0IHN0ZXAyUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVUc3NFY2RzYVN0ZXAyU2lnbmluZ01hdGVyaWFsKHtcbiAgICAgIGFTaGFyZUZyb21CaXRnbzogYml0Z29Ub1VzZXJBU2hhcmUsXG4gICAgICBiaXRnb0NoYWxsZW5nZTogY2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZSxcbiAgICAgIHdTaGFyZTogc3RlcDFSZXR1cm4ud1NoYXJlIGFzIFdTaGFyZSxcbiAgICB9KTtcblxuICAgIC8vIHNpZ25pbmcgc3RhZ2UgdHdvIHdpdGggbXVTaGFyZSBhbmQgZFNoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIEQgc2hhcmVcbiAgICBjb25zdCBiaXRnb1RvVXNlckRTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLk1VU2hhcmUsXG4gICAgICBzdGVwMlJldHVybi5tdURTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICkpIGFzIERTaGFyZTtcblxuICAgIC8vIElmIG9ubHkgdGhlIGdldEhhc2hGdW5jdGlvbigpIGlzIGRlZmluZWQgZm9yIHRoZSBjb2luIHVzZSBpdCBvdGhlcndpc2VcbiAgICAvLyBwYXNzIHVuZGVmaW5lZCBoYXNoLCBkZWZhdWx0IGhhc2ggd2lsbCBiZSB1c2VkIGluIHRoYXQgY2FzZS5cbiAgICBsZXQgaGFzaDogSGFzaCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJTU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25hdHVyZVNoYXJlKFxuICAgICAgc3RlcDJSZXR1cm4ub1NoYXJlIGFzIE9TaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyRFNoYXJlLFxuICAgICAgc2lnbmFibGVQYXlsb2FkLFxuICAgICAgaGFzaFxuICAgICk7XG5cbiAgICAvLyBzaWduaW5nIHN0YWdlIHRocmVlIHdpdGggU1NoYXJlIHNlbmQgdG8gYml0Z28gYW5kIHJlY2VpdmVzIFNTaGFyZVxuICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuU1NoYXJlLFxuICAgICAgdXNlclNTaGFyZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnRTb3VyY2UgLSBvcHRpb25hbDsgdXNlIFRzc1R4UmVjaXBpZW50U291cmNlLkV4cGxpY2l0IHdpdGggYSBub24tZW1wdHlcbiAgICogICB0eFBhcmFtcy5yZWNpcGllbnRzIGxpc3Qgd2hlbiB5b3Ugd2FudCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgcGFzc2luZyByZWNpcGllbnQgZGV0YWlscyBhdCBjb21waWxlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVHNzU2lnblR4UmVxdWVzdFBhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlUmF3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhdyBtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgZm9yIGVudGVycHJpc2UgYW5kIEJpdEdvIGluIEVDRFNBIHNpZ25pbmdcbiAgICogT25seSByZXR1cm5zIHRoZSBjaGFsbGVuZ2VzIGlmIHRoZXkgYXJlIHZlcmlmaWVkIGJ5IHRoZSB1c2VyJ3MgZW50ZXJwcmlzZSBhZG1pbidzIGVjZGgga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSAgKDAgZm9yIHR4LCAxIGZvciBtZXNzYWdlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFpbGxpZXJNb2R1bHVzIC0gcGFpbGxpZXIgcHVia2V5ICRuJFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgcmVxdWVzdFR5cGVcbiAgICogQHBhcmFtIHtJUmVxdWVzdFRyYWNlcn0gcmVxSWQgLSByZXF1ZXN0IHRyYWNlciByZXF1ZXN0IGlkXG4gICAqL1xuICBhc3luYyBnZXRFY2RzYVNpZ25pbmdDaGFsbGVuZ2VzKFxuICAgIHR4UmVxdWVzdElkOiBzdHJpbmcsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLFxuICAgIHdhbGxldFBhaWxsaWVyTW9kdWx1czogc3RyaW5nLFxuICAgIGluZGV4ID0gMCxcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8e1xuICAgIGVudGVycHJpc2VDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcztcbiAgICBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2U7XG4gIH0+IHtcbiAgICBjb25zdCBlbnRlcnByaXNlSWQgPSB0aGlzLndhbGxldC50b0pTT04oKS5lbnRlcnByaXNlO1xuICAgIGlmICghZW50ZXJwcmlzZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBtdXN0IGJlIGFuIGVudGVycHJpc2Ugd2FsbGV0LicpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBCaXRHbyByYW5nZSBwcm9vZiBhbmQgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3QgY3JlYXRlQml0Z29DaGFsbGVuZ2VSZXNwb25zZSA9IGF3YWl0IGdldFR4UmVxdWVzdENoYWxsZW5nZShcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICBpbmRleC50b1N0cmluZygpLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB3YWxsZXRQYWlsbGllck1vZHVsdXMsXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb1RvRW50ZXJwcmlzZVBhaWxsaWVyQ2hhbGxlbmdlID0geyBwOiBjcmVhdGVCaXRnb0NoYWxsZW5nZVJlc3BvbnNlLnAgfTtcbiAgICBjb25zdCBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5zZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7XG4gICAgICBwOiBhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YuZ2VuZXJhdGVQKGhleFRvQmlnSW50KGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubikpLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETyhCRy03ODc2NCk6IG9uY2UgdGhlIHBhaWxsaWVyIHByb29mcyBhcmUgY29tcGxldGUsIHJlZHVjZSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gb25lIEFQSSBjYWxsXG4gICAgY29uc3Qgd2FsbGV0Q2hhbGxlbmdlcyA9IGF3YWl0IHRoaXMud2FsbGV0LmdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZVZlcmlmaWVyVXNlcklkID0gd2FsbGV0Q2hhbGxlbmdlcy5jcmVhdGVkQnk7XG4gICAgY29uc3QgYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudGVycHJpc2VJZCwgY2hhbGxlbmdlVmVyaWZpZXJVc2VySWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gYWRtaW5TaWduaW5nS2V5UmVzcG9uc2UuZGVyaXZlZFB1YmtleTtcblxuICAgIC8vIFZlcmlmeSBlbnRlcnByaXNlJ3MgY2hhbGxlbmdlIGlzIHNpZ25lZCBieSB0aGUgcmVzcGVjdGl2ZSBhZG1pbnMgZWNkaCBrZXljaGFpblxuICAgIGNvbnN0IGVudGVycHJpc2VSYXdDaGFsbGVuZ2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5udGlsZGUsXG4gICAgICBoMTogd2FsbGV0Q2hhbGxlbmdlcy5lbnRlcnByaXNlQ2hhbGxlbmdlLmgxLFxuICAgICAgaDI6IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS5oMixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2U6IHN0cmluZyA9IHdhbGxldENoYWxsZW5nZXMuZW50ZXJwcmlzZUNoYWxsZW5nZS52ZXJpZmllcnMuYWRtaW5TaWduYXR1cmU7XG4gICAgaWYgKFxuICAgICAgIXZlcmlmeUVjZGhTaWduYXR1cmUoXG4gICAgICAgIEVjZHNhVXRpbHMuZ2V0TWVzc2FnZVRvU2lnbkZyb21DaGFsbGVuZ2UoZW50ZXJwcmlzZVJhd0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluU2lnbmF0dXJlT25FbnRDaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBlbnRlcnByaXNlIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQml0R28gY2hhbGxlbmdlJ3MgWksgcHJvb2ZzIGhhdmUgYmVlbiB2ZXJpZmllZCBieSB0aGUgYWRtaW5cbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZTogVHhSZXF1ZXN0Q2hhbGxlbmdlUmVzcG9uc2UgPSB7XG4gICAgICBudGlsZGU6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgaDE6IHdhbGxldENoYWxsZW5nZXMuYml0Z29DaGFsbGVuZ2UuaDEsXG4gICAgICBoMjogd2FsbGV0Q2hhbGxlbmdlcy5iaXRnb0NoYWxsZW5nZS5oMixcbiAgICAgIHA6IGJpdGdvVG9FbnRlcnByaXNlUGFpbGxpZXJDaGFsbGVuZ2UucCxcbiAgICAgIG46IGNyZWF0ZUJpdGdvQ2hhbGxlbmdlUmVzcG9uc2UubixcbiAgICB9O1xuICAgIGNvbnN0IGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UgPSB3YWxsZXRDaGFsbGVuZ2VzLmJpdGdvQ2hhbGxlbmdlLnZlcmlmaWVycy5hZG1pblNpZ25hdHVyZTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5RWNkaFNpZ25hdHVyZShcbiAgICAgICAgRWNkc2FVdGlscy5nZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShiaXRnb0NoYWxsZW5nZSksXG4gICAgICAgIGFkbWluVmVyaWZpY2F0aW9uU2lnbmF0dXJlRm9yQml0R29DaGFsbGVuZ2UsXG4gICAgICAgIEJ1ZmZlci5mcm9tKHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LCAnaGV4JylcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRtaW4gc2lnbmF0dXJlIGZvciBCaXRHbydzIGNoYWxsZW5nZSBpcyBub3QgdmFsaWQuIFBsZWFzZSBjb250YWN0IHlvdXIgZW50ZXJwcmlzZSBhZG1pbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW50ZXJwcmlzZUNoYWxsZW5nZToge1xuICAgICAgICAuLi5lbnRlcnByaXNlUmF3Q2hhbGxlbmdlLFxuICAgICAgICBwOiBlbnRlcnByaXNlVG9CaXRnb1BhaWxsaWVyQ2hhbGxlbmdlLnAsXG4gICAgICB9LFxuICAgICAgYml0Z29DaGFsbGVuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgdS12YWx1ZSBwcm9vZnMgYW5kIEdQRyBrZXlzIHVzZWQgaW4gZ2VuZXJhdGluZyBhIFRTUyBFQ0RTQSB3YWxsZXQuXG4gICAqIEBwYXJhbSB1c2VyR3BnUHViIFRoZSB1c2VyJ3MgcHVibGljIEdQRyBrZXkgZm9yIGVuY3J5cHRpb24gYmV0d2VlbiB1c2VyL3NlcnZlclxuICAgKiBAcGFyYW0gYmFja3VwR3BnUHViIFRoZSBiYWNrdXAncyBwdWJsaWMgR1BHIGtleSBmb3IgZW5jcnlwdGlvbiBiZXR3ZWVuIGJhY2t1cC9zZXJ2ZXJcbiAgICogQHBhcmFtIGJpdGdvS2V5Y2hhaW4gcHJldmlvdXNseSBjcmVhdGVkIEJpdEdvIGtleWNoYWluOyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlc1xuICAgKiBAcGFyYW0gZGVjcnlwdGVkU2hhcmUgVGhlIGRlY3J5cHRlZCBiaXRnby10by11c2VyL2JhY2t1cCBwcml2YXRlIHNoYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gdmVyaWZpZXJJbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhcnR5IHRvIHZlcmlmeTogMSA9IHVzZXIsIDIgPSBiYWNrdXBcbiAgICovXG4gIGFzeW5jIHZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgdXNlckdwZ1B1Yjogc3RyaW5nLFxuICAgIGJhY2t1cEdwZ1B1Yjogc3RyaW5nLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIGRlY3J5cHRlZFNoYXJlOiBzdHJpbmcsXG4gICAgdmVyaWZpZXJJbmRleDogMSB8IDJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MpO1xuXG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuICAgIGNvbnN0IHVzZXJLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHViIH0pO1xuICAgIGNvbnN0IHVzZXJLZXlJZCA9IHVzZXJLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG4gICAgY29uc3QgYmFja3VwS2V5UHViID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYmFja3VwR3BnUHViIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleUlkID0gYmFja3VwS2V5UHViLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpO1xuXG4gICAgY29uc3Qgd2FsbGV0U2lnbmF0dXJlcyA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleXMoeyBhcm1vcmVkS2V5czogYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzIH0pO1xuICAgIGlmICh3YWxsZXRTaWduYXR1cmVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdhbGxldCBzaWduYXR1cmVzJyk7XG4gICAgfVxuICAgIGlmICh1c2VyS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMF0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmlyc3Qgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCB1c2VyIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cbiAgICBpZiAoYmFja3VwS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMV0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2Vjb25kIHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgYmFja3VwIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICB3YWxsZXRTaWduYXR1cmU6IHdhbGxldFNpZ25hdHVyZXNbMF0sXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJLZXlJZCxcbiAgICAgIGJhY2t1cEtleUlkLFxuICAgICAgYml0Z29QdWI6IGJpdGdvR3BnS2V5LFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICB2ZXJpZmllckluZGV4LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1sxXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBjaGFsbGVuZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgdjEgZWNkaCBrZXkgYXQgYSBkZXJpdmVkIHBhdGhcbiAgICogQHBhcmFtIGNoYWxsZW5nZSBjaGFsbGVuZ2UgdG8gc2lnblxuICAgKiBAcGFyYW0gZWNkaFhwcnYgeHBydiBvZiB0aGUgZWNkaCBrZXlcbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoIHRoZSBkZXJpdmVkIHBhdGggYXQgd2hpY2ggdGhlIGVjZGgga2V5IHdpbGwgc2lnblxuICAgKi9cbiAgc3RhdGljIHNpZ25DaGFsbGVuZ2UoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUsIGVjZGhYcHJ2OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1NpZ24gPSB0aGlzLmdldE1lc3NhZ2VUb1NpZ25Gcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZSk7XG4gICAgcmV0dXJuIHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KG1lc3NhZ2VUb1NpZ24sIGVjZGhYcHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgY2hhbGxlbmdlIHRvIGEgY29tbW9uIG1lc3NhZ2UgZm9ybWF0IHdoaWNoIGNhbiBiZSBzaWduZWQuXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBnZXRNZXNzYWdlVG9TaWduRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNoYWxsZW5nZS5udGlsZGUuY29uY2F0KGNoYWxsZW5nZS5oMSkuY29uY2F0KGNoYWxsZW5nZS5oMik7XG4gIH1cblxuICAvKipcbiAgIFZlcmlmaWVzIFpLIHByb29mcyBvZiBCaXRHbydzIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNc1xuICAgd2hpY2ggYXJlIGZldGNoZWQgZnJvbSB0aGUgV1AgQVBJLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZlcmlmeUJpdEdvQ2hhbGxlbmdlcyhiaXRnb0NoYWxsZW5nZXM6IEdldEJpdEdvQ2hhbGxlbmdlc0FwaSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFZlcmlmeSBpbnN0aXR1dGlvbmFsIGhzbSBjaGFsbGVuZ2UgcHJvb2ZcbiAgICBjb25zdCBpbnN0Q2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5udGlsZGUsXG4gICAgICBoMTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSxcbiAgICAgIGgyOiBiaXRnb0NoYWxsZW5nZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlUHJvb2YsXG4gICAgfSk7XG5cbiAgICAvLyBWZXJpZnkgbml0cm8gaHNtIGNoYWxsZW5nZSBwcm9vZlxuICAgIGNvbnN0IG5pdHJvQ2hhbGxlbmdlVmVyaWZpZWQgPSBhd2FpdCB0aGlzLnZlcmlmeUJpdEdvQ2hhbGxlbmdlKHtcbiAgICAgIG50aWxkZTogYml0Z29DaGFsbGVuZ2VzLmJpdGdvTml0cm9Ic20ubnRpbGRlLFxuICAgICAgaDE6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgxLFxuICAgICAgaDI6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLmgyLFxuICAgICAgbnRpbGRlUHJvb2Y6IGJpdGdvQ2hhbGxlbmdlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RDaGFsbGVuZ2VWZXJpZmllZCAmJiBuaXRyb0NoYWxsZW5nZVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIFpLIHByb29mIGZvciBhIHNpbmdsZSBCaXRHbyBjaGFsbGVuZ2VcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdmVyaWZ5Qml0R29DaGFsbGVuZ2UoYml0Z29DaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoYml0Z29DaGFsbGVuZ2UpO1xuICAgIGNvbnN0IG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnZlcmlmeU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5oMSxcbiAgICAgICAgaDI6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICB9LFxuICAgICAgZGVzZXJpYWxpemVkSW5zdENoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyXG4gICAgKTtcbiAgICBjb25zdCBudGlsZGVQcm9vZkgyV3J0SDFWZXJpZmllZCA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlOdGlsZGVQcm9vZihcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLm50aWxkZSxcbiAgICAgICAgaDE6IGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UuaDIsXG4gICAgICAgIGgyOiBkZXNlcmlhbGl6ZWRJbnN0Q2hhbGxlbmdlLmgxLFxuICAgICAgfSxcbiAgICAgIGRlc2VyaWFsaXplZEluc3RDaGFsbGVuZ2UubnRpbGRlUHJvb2YuaDJXcnRIMVxuICAgICk7XG4gICAgcmV0dXJuIG50aWxkZVByb29mSDFXcnRIMlZlcmlmaWVkICYmIG50aWxkZVByb29mSDJXcnRIMVZlcmlmaWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJpdGdvIGNoYWxsZW5nZXMgZm9yIGJvdGggbml0cm8gYW5kIGluc3RpdHV0aW9uYWwgSFNNcyBmcm9tIFdQIEFQSS5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvOiBCaXRHb0Jhc2UpOiBQcm9taXNlPEdldEJpdEdvQ2hhbGxlbmdlc0FwaT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJpdGdvLmdldChiaXRnby51cmwoJy90c3MvZWNkc2EvY2hhbGxlbmdlcycsIDIpKS5zZW5kKCkucmVzdWx0KCk7XG4gICAgaWYgKFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvTml0cm9Ic20uaDEgfHxcbiAgICAgICFyZXMuYml0Z29OaXRyb0hzbS5oMiB8fFxuICAgICAgIXJlcy5iaXRnb05pdHJvSHNtLm50aWxkZVByb29mIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20ubnRpbGRlIHx8XG4gICAgICAhcmVzLmJpdGdvSW5zdGl0dXRpb25hbEhzbS5oMSB8fFxuICAgICAgIXJlcy5iaXRnb0luc3RpdHV0aW9uYWxIc20uaDIgfHxcbiAgICAgICFyZXMuYml0Z29JbnN0aXR1dGlvbmFsSHNtLm50aWxkZVByb29mXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEJpdEdvIGNoYWxsZW5nZSBwcm9vZiB0byBiZSBwcmVzZW50LiBDb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgQml0R28ncyBwcm9vZnMgZnJvbSBBUEkgYW5kIHNpZ25zIHRoZW0gaWYgdGhlIHByb29mcyBhcmUgdmFsaWQuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRWZXJpZnlBbmRTaWduQml0R29DaGFsbGVuZ2VzKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCaXRHb1Byb29mU2lnbmF0dXJlcz4ge1xuICAgIC8vIEZldGNoIEJpdEdvJ3MgY2hhbGxlbmdlIGFuZCB2ZXJpZnlcbiAgICBjb25zdCBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYXdhaXQgRWNkc2FVdGlscy5nZXRCaXRHb0NoYWxsZW5nZXMoYml0Z28pO1xuICAgIGlmICghKGF3YWl0IEVjZHNhVXRpbHMudmVyaWZ5Qml0R29DaGFsbGVuZ2VzKGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHZlcmlmeSBCaXRHbydzIGNoYWxsZW5nZSBuZWVkZWQgdG8gZW5hYmxlIEVDRFNBIHNpZ25pbmcuIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IEVjZHNhVXRpbHMuc2lnbkJpdGdvQ2hhbGxlbmdlcyhiaXRnbywgZW50ZXJwcmlzZUlkLCB1c2VyUGFzc3dvcmQsIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gQml0Z28ncyBwcm9vZnMsIHZlcmlmaWNhdGlvbiBvZiBwcm9vZnMgaXMgbGVmdCB0byB0aGUgY2FsbGVyXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICogQHBhcmFtIGJpdGdvQ2hhbGxlbmdlc1dpdGhQcm9vZnMgT3B0aW9uYWxseSBwcm92aWRlIEJpdGdvIENoYWxsYWVuZ2UgJiBQcm9vZnMgaW5zdGVhZCBvZiBmZXRjaGluZyBmcm9tIEFQSVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpZ25CaXRnb0NoYWxsZW5nZXMoXG4gICAgYml0Z286IEJpdEdvQmFzZSxcbiAgICBlbnRlcnByaXNlSWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZyxcbiAgICBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzPzogR2V0Qml0R29DaGFsbGVuZ2VzQXBpXG4gICk6IFByb21pc2U8Qml0R29Qcm9vZlNpZ25hdHVyZXM+IHtcbiAgICAvLyBmZXRjaCBjaGFsbGVuZ2UgJiBwcm9vZiBpZiBub25lIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGNoYWxsZW5nZXNXaXRoUHJvb2ZzID0gYml0Z29DaGFsbGVuZ2VzV2l0aFByb29mc1xuICAgICAgPyBiaXRnb0NoYWxsZW5nZXNXaXRoUHJvb2ZzXG4gICAgICA6IGF3YWl0IEVjZHNhVXRpbHMuZ2V0Qml0R29DaGFsbGVuZ2VzKGJpdGdvKTtcblxuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudGVycHJpc2VJZCk7XG5cbiAgICBjb25zdCBzaWduZWRCaXRHb0luc3RDaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb0luc3RpdHV0aW9uYWxIc20sXG4gICAgICBlY2RoS2V5cGFpci54cHJ2LFxuICAgICAgZWNkaEtleXBhaXIuZGVyaXZhdGlvblBhdGhcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEJpdEdvTml0cm9DaGFsbGVuZ2UgPSBFY2RzYVV0aWxzLnNpZ25DaGFsbGVuZ2UoXG4gICAgICBjaGFsbGVuZ2VzV2l0aFByb29mcy5iaXRnb05pdHJvSHNtLFxuICAgICAgZWNkaEtleXBhaXIueHBydixcbiAgICAgIGVjZGhLZXlwYWlyLmRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29JbnN0SHNtQWRtaW5TaWduYXR1cmU6IHNpZ25lZEJpdEdvSW5zdENoYWxsZW5nZSxcbiAgICAgIGJpdGdvTml0cm9Ic21BZG1pblNpZ25hdHVyZTogc2lnbmVkQml0R29OaXRyb0NoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uIHRoZSBlbnRlcnByaXNlLlxuICAgKiBJdCByZWNlaXZlcyB0aGUgZW50ZXJwcmlzZSBjaGFsbGVuZ2UgYW5kIHNpZ25hdHVyZXMgb2YgdmVyaWZpZWQgYml0Z28gcHJvb2ZzXG4gICAqIGFuZCB1cGxvYWRzIHRoZW0gb24gdGhlIGVudGVycHJpc2UuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIGlkIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgLSBlbnRlcnByaXNlIGFkbWluJ3MgbG9naW4gcHdcbiAgICogQHBhcmFtIGJpdGdvSW5zdENoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3MgaW5zdGl0dXRpb25hbCBIU00gY2hhbGxlbmdlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGJpdGdvJ3Mgbml0cm8gSFNNIGNoYWxsZW5nZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIG9wdGlvbmFsbHkgdXNlIHRoZSBjaGFsbGVuZ2UgZm9yIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5pdGlhdGVDaGFsbGVuZ2VzRm9yRW50ZXJwcmlzZShcbiAgICBiaXRnbzogQml0R29CYXNlLFxuICAgIGVudElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlUHJvb2ZTaWduYXR1cmU6IEJ1ZmZlcixcbiAgICBvcGVuU1NMQnl0ZXM6IFVpbnQ4QXJyYXksXG4gICAgY2hhbGxlbmdlPzogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZldGNoIHVzZXIncyBlY2RoIHB1YmxpYyBrZXljaGFpbiBuZWVkZWQgZm9yIHNpZ25pbmcgdGhlIGNoYWxsZW5nZXNcbiAgICBjb25zdCBlY2RoS2V5cGFpciA9IGF3YWl0IGJpdGdvLmdldEVjZGhLZXlwYWlyUHJpdmF0ZSh1c2VyUGFzc3dvcmQsIGVudElkKTtcblxuICAgIC8vIEdlbmVyYXRlIGFuZCBzaWduIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAgY29uc3QgZW50Q2hhbGxlbmdlV2l0aFByb29mID1cbiAgICAgIGNoYWxsZW5nZSA/PyAoYXdhaXQgRWNkc2FSYW5nZVByb29mLmdlbmVyYXRlTnRpbGRlKG9wZW5TU0xCeXRlcywgbWluTW9kdWx1c0JpdExlbmd0aCkpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2VXaXRoUHJvb2YgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMoZW50Q2hhbGxlbmdlV2l0aFByb29mKTtcbiAgICBjb25zdCBzaWduZWRFbnRlcnByaXNlQ2hhbGxlbmdlID0gRWNkc2FVdGlscy5zaWduQ2hhbGxlbmdlKFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIGVjZGhLZXlwYWlyLnhwcnYsXG4gICAgICBlY2RoS2V5cGFpci5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLnVwbG9hZENoYWxsZW5nZXNUb0VudGVycHJpc2UoXG4gICAgICBiaXRnbyxcbiAgICAgIGVudElkLFxuICAgICAgc2VyaWFsaXplZEVudENoYWxsZW5nZVdpdGhQcm9vZixcbiAgICAgIHNpZ25lZEVudGVycHJpc2VDaGFsbGVuZ2UudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29JbnN0Q2hhbGxlbmdlUHJvb2ZTaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgYml0Z29OaXRyb0NoYWxsZW5nZVByb29mU2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyB0aGUgc2lnbmVkIGNoYWxsZW5nZXMgYW5kIHRoZWlyIHByb29mcyBvbiB0aGUgZW50ZXJwcmlzZS5cbiAgICogVGhpcyBpbml0aWF0ZXMgZWNkc2Egc2lnbmluZyBmb3IgdGhlIGVudGVycHJpc2UgdXNlcnMuXG4gICAqIEBwYXJhbSBiaXRnb1xuICAgKiBAcGFyYW0gZW50SWQgLSBlbnRlcnByaXNlIHRvIGVuYWJsZSBlY2RzYSBzaWduaW5nIG9uXG4gICAqIEBwYXJhbSBlbnRDaGFsbGVuZ2UgLSBjbGllbnQgc2lkZSBnZW5lcmF0ZWQgZW50IGNoYWxsZW5nZSB3aXRoIFpLIHByb29mc1xuICAgKiBAcGFyYW0gZW50Q2hhbGxlbmdlU2lnbmF0dXJlIC0gc2lnbmF0dXJlIG9uIGVudGVycHJpc2UgY2hhbGxlbmdlXG4gICAqIEBwYXJhbSBiaXRnb0ludENoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIGluc3RpdHV0aW9uYWwgSFNNIGNoYWxsZW5nZVxuICAgKiBAcGFyYW0gYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSAtIHNpZ25hdHVyZSBvbiBCaXRHbydzIG5pdHJvIEhTTSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyB1cGxvYWRDaGFsbGVuZ2VzVG9FbnRlcnByaXNlKFxuICAgIGJpdGdvOiBCaXRHb0Jhc2UsXG4gICAgZW50SWQ6IHN0cmluZyxcbiAgICBlbnRDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB8IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG4gICAgZW50Q2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmU6IHN0cmluZyxcbiAgICBiaXRnb05pdHJvQ2hhbGxlbmdlU2lnbmF0dXJlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGVudGVycHJpc2U6IHtcbiAgICAgICAgbnRpbGRlOiBlbnRDaGFsbGVuZ2UubnRpbGRlLFxuICAgICAgICBoMTogZW50Q2hhbGxlbmdlLmgxLFxuICAgICAgICBoMjogZW50Q2hhbGxlbmdlLmgyLFxuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogZW50Q2hhbGxlbmdlU2lnbmF0dXJlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJpdGdvSW5zdGl0dXRpb25hbEhzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29JbnRDaGFsbGVuZ2VTaWduYXR1cmUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYml0Z29OaXRyb0hzbToge1xuICAgICAgICB2ZXJpZmllcnM6IHtcbiAgICAgICAgICBhZG1pblNpZ25hdHVyZTogYml0Z29OaXRyb0NoYWxsZW5nZVNpZ25hdHVyZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoJ250aWxkZVByb29mJyBpbiBlbnRDaGFsbGVuZ2UpIHtcbiAgICAgIGJvZHkuZW50ZXJwcmlzZVsnbnRpbGRlUHJvb2YnXSA9IGVudENoYWxsZW5nZS5udGlsZGVQcm9vZjtcbiAgICB9XG4gICAgYXdhaXQgYml0Z29cbiAgICAgIC5wdXQoYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke2VudElkfS90c3Njb25maWcvZWNkc2EvY2hhbGxlbmdlYCwgMikpXG4gICAgICAuc2VuZChib2R5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG59XG4iXX0=
|