@bitgo/sdk-core 38.7.0 → 38.8.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.
@@ -40,9 +40,11 @@ exports.EddsaMPCv2RecoveryFunctions = exports.EddsaMPCv2Utils = void 0;
40
40
  exports.isEddsaMpcV1SigningMaterial = isEddsaMpcV1SigningMaterial;
41
41
  exports.getEddsaMpcV2RecoveryKeySharesFromReducedKey = getEddsaMpcV2RecoveryKeySharesFromReducedKey;
42
42
  exports.signRecoveryEddsaMPCv2 = signRecoveryEddsaMPCv2;
43
+ exports.getEddsaSigningMaterial = getEddsaSigningMaterial;
44
+ exports.signEddsaMpcV2RecoveryTx = signEddsaMpcV2RecoveryTx;
43
45
  const assert_1 = __importDefault(require("assert"));
44
- const pgp = __importStar(require("openpgp"));
45
46
  const sjcl = __importStar(require("@bitgo/sjcl"));
47
+ const pgp = __importStar(require("openpgp"));
46
48
  const io_ts_types_1 = require("io-ts-types");
47
49
  const public_types_1 = require("@bitgo/public-types");
48
50
  const ed25519_1 = require("@noble/curves/ed25519");
@@ -622,6 +624,45 @@ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
622
624
  await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
623
625
  return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
624
626
  }
627
+ // #endregion
628
+ // #region retrofit
629
+ async getMpcV2RetrofitDataFromMpcV1Keys(params) {
630
+ const MPC = await (0, eddsa_1.getInitializedMpcInstance)();
631
+ const userRetrofitData = EddsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key(params.mpcv1UserKeyShare, typesMPCv2_1.MPCv2PartiesEnum.USER, MPC);
632
+ const backupRetrofitData = EddsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key(params.mpcv1BackupKeyShare, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, MPC);
633
+ (0, assert_1.default)(userRetrofitData.expectedPk === backupRetrofitData.expectedPk, 'MPCv1 user and backup keys combine to different aggregate public keys');
634
+ (0, assert_1.default)(userRetrofitData.chainCode === backupRetrofitData.chainCode, 'MPCv1 user and backup keys combine to different chain codes');
635
+ return { userRetrofitData, backupRetrofitData };
636
+ }
637
+ static getMpcV2RetrofitDataFromMpcV1Key(mpcv1PartyKeyShare, mpcv1PartyIndex, mpc) {
638
+ const signingMaterial = JSON.parse(mpcv1PartyKeyShare);
639
+ (0, assert_1.default)(signingMaterial.uShare, 'MPCv1 key material missing uShare');
640
+ (0, assert_1.default)(signingMaterial.bitgoYShare, 'MPCv1 key material missing bitgoYShare');
641
+ let pShare;
642
+ switch (mpcv1PartyIndex) {
643
+ case typesMPCv2_1.MPCv2PartiesEnum.USER:
644
+ (0, assert_1.default)(signingMaterial.backupYShare, 'User MPCv1 key material missing backupYShare');
645
+ pShare = mpc.keyCombine(signingMaterial.uShare, [
646
+ signingMaterial.bitgoYShare,
647
+ signingMaterial.backupYShare,
648
+ ]).pShare;
649
+ break;
650
+ case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
651
+ (0, assert_1.default)(signingMaterial.userYShare, 'Backup MPCv1 key material missing userYShare');
652
+ pShare = mpc.keyCombine(signingMaterial.uShare, [
653
+ signingMaterial.bitgoYShare,
654
+ signingMaterial.userYShare,
655
+ ]).pShare;
656
+ break;
657
+ default:
658
+ throw new Error('Invalid participant index');
659
+ }
660
+ return {
661
+ s_i_0: pShare.u,
662
+ expectedPk: pShare.y,
663
+ chainCode: pShare.chaincode,
664
+ };
665
+ }
625
666
  }
626
667
  exports.EddsaMPCv2Utils = EddsaMPCv2Utils;
627
668
  EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY = 'MPS_DSG_SIGNING_USER_GPG_KEY';
@@ -641,20 +682,25 @@ EddsaMPCv2Utils.MPS_DKG_KEYGEN_ROUND1_STATE = 'MPS_DKG_KEYGEN_ROUND1_STATE';
641
682
  * bitgo.decrypt (supports both v1 SJCL and v2 Argon2id envelopes);
642
683
  * when absent, falls back to sjcl.decrypt (v1 only)
643
684
  */
644
- async function isEddsaMpcV1SigningMaterial(encryptedKeyShare, walletPassphrase, bitgo) {
645
- const prv = bitgo
646
- ? await bitgo.decrypt({ input: encryptedKeyShare, password: walletPassphrase })
647
- : sjcl.decrypt(walletPassphrase, encryptedKeyShare);
685
+ function parseEddsaMpcV1Material(decrypted) {
648
686
  try {
649
- const m = JSON.parse(prv);
650
- return (typeof m?.uShare?.seed === 'string' &&
687
+ const m = JSON.parse(decrypted);
688
+ if (typeof m?.uShare?.seed === 'string' &&
651
689
  typeof m?.bitgoYShare?.u === 'string' &&
652
- (typeof m?.backupYShare?.u === 'string' || typeof m?.userYShare?.u === 'string'));
690
+ (typeof m?.backupYShare?.u === 'string' || typeof m?.userYShare?.u === 'string')) {
691
+ return decrypted;
692
+ }
653
693
  }
654
694
  catch {
655
- // JSON parse error indicates MPCv2 CBOR format, not JSON.
656
- return false;
695
+ // Not JSON MPCv2 CBOR
657
696
  }
697
+ return null;
698
+ }
699
+ async function isEddsaMpcV1SigningMaterial(encryptedKeyShare, walletPassphrase, bitgo) {
700
+ const decrypted = bitgo
701
+ ? await bitgo.decrypt({ input: encryptedKeyShare, password: walletPassphrase })
702
+ : sjcl.decrypt(walletPassphrase, encryptedKeyShare);
703
+ return parseEddsaMpcV1Material(decrypted) !== null;
658
704
  }
659
705
  /**
660
706
  * Get EdDSA MPCv2 recovery key shares from encrypted reduced user and backup keys.
@@ -730,9 +776,44 @@ async function signRecoveryEddsaMPCv2(message, derivationPath, userKeyShare, bac
730
776
  }
731
777
  return signature;
732
778
  }
779
+ /**
780
+ * Detects MPCv1 vs MPCv2 keycard format and returns typed signing material.
781
+ * For v1: decrypts once and returns the plaintext as userPrv.
782
+ * For v2: returns the encrypted key as-is for use with signEddsaMpcV2RecoveryTx.
783
+ * When bitgo is omitted, falls back to sjcl (v1 only).
784
+ */
785
+ async function getEddsaSigningMaterial(userKey, walletPassphrase, bitgo) {
786
+ const normalized = userKey.replace(/\s/g, '');
787
+ let decrypted;
788
+ try {
789
+ decrypted = bitgo
790
+ ? await bitgo.decrypt({ input: normalized, password: walletPassphrase })
791
+ : sjcl.decrypt(walletPassphrase, normalized);
792
+ }
793
+ catch (e) {
794
+ throw new Error(`Error decrypting user keychain: ${e instanceof Error ? e.message : String(e)}`);
795
+ }
796
+ const userPrv = parseEddsaMpcV1Material(decrypted);
797
+ return userPrv !== null ? { version: 'v1', userPrv } : { version: 'v2', encryptedUserKey: normalized };
798
+ }
799
+ /**
800
+ * Full MPCv2 recovery signing flow: decrypt key shares → validate commonKeyChain → MPS DSG.
801
+ * Returns raw 64-byte Ed25519 signature Buffer.
802
+ * Caller is responsible for any coin-specific envelope
803
+ * (e.g. 0x00 Substrate prefix, SUI flag+pubkey wrapper, or raw for NEAR/ADA/TON).
804
+ */
805
+ async function signEddsaMpcV2RecoveryTx(params) {
806
+ const { userKeyShare, backupKeyShare, commonKeyChain } = await getEddsaMpcV2RecoveryKeySharesFromReducedKey(params.userKey, params.backupKey, params.walletPassphrase, params.bitgo);
807
+ if (commonKeyChain.toLowerCase() !== params.bitgoKey.toLowerCase()) {
808
+ throw new Error('EdDSA MPCv2 recovery: commonKeyChain from keycard does not match bitgoKey');
809
+ }
810
+ return signRecoveryEddsaMPCv2(params.message, params.derivationPath, userKeyShare, backupKeyShare, commonKeyChain);
811
+ }
733
812
  exports.EddsaMPCv2RecoveryFunctions = {
734
813
  isEddsaMpcV1SigningMaterial,
735
814
  getEddsaMpcV2RecoveryKeySharesFromReducedKey,
736
815
  signRecoveryEddsaMPCv2,
816
+ getEddsaSigningMaterial,
817
+ signEddsaMpcV2RecoveryTx,
737
818
  };
738
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyakNBLGtFQW9CQztBQWNELG9HQTZDQztBQWVELHdEQWdDQztBQXpyQ0Qsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUMvQixrREFBb0M7QUFDcEMsNkNBQTZDO0FBQzdDLHNEQVM2QjtBQUU3QixtREFBZ0Q7QUFDaEQsb0RBQTJGO0FBRzNGLDREQUFxRztBQUNyRyxnREFBZ0g7QUFDaEgseUNBQStDO0FBQy9DLDhEQU11QztBQUN2QyxvREFBcUU7QUFDckUscURBQXdEO0FBQ3hELG9EQUF1RDtBQUN2RCw0Q0Fhc0I7QUFHdEIsaUNBQXdDO0FBQ3hDLHNEQUE2RDtBQUM3RCxxRUFBNkY7QUFHN0YsTUFBYSxlQUFnQixTQUFRLHFCQUFjO0lBTWpELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsZUFBZSxDQUFDLE1BUXJCO1FBQ0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLHNCQUFRLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFD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QUNULFlBQVksRUFDWixjQUFjLEVBQ2QsT0FBTyxFQUNQLGNBQWMsQ0FDZixDQUFXLENBQUM7SUFFYiwwRUFBMEU7SUFDMUUsdURBQXVEO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxpQ0FBeUIsR0FBRSxDQUFDO0lBQzlDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0UsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV4RSxNQUFNLFFBQVEsR0FBRyxpQkFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3BILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVZLFFBQUEsMkJBQTJCLEdBQUc7SUFDekMsMkJBQTJCO0lBQzNCLDRDQUE0QztJQUM1QyxzQkFBc0I7Q0FDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQge1xuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdCxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlLFxuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdCxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlLFxuICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG4gIE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgRWRkc2FNUEN2MktleUdlbkNhbGxiYWNrcyB9IGZyb20gJy4uLy4uLy4uL3dhbGxldC9pV2FsbGV0cyc7XG5pbXBvcnQgeyBlZDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbmltcG9ydCB7IEVkZHNhTVBTRGtnLCBFZGRzYU1QU0RzZywgTVBTQ29tbXMsIE1QU1R5cGVzLCBNUFNVdGlsIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlLCBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZywgaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkgfSBmcm9tICcuLi8uLi8uLi90c3MvYml0Z29QdWJLZXlzJztcbmltcG9ydCB7IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUsIGdldFR4UmVxdWVzdCwgc2VuZFNpZ25hdHVyZVNoYXJlVjIsIHNlbmRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uLy4uL2NvZGVjcyc7XG5pbXBvcnQge1xuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUsXG4gIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRPbmUsXG4gIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28sXG59IGZyb20gJy4uLy4uLy4uL3Rzcy9lZGRzYS9lZGRzYU1QQ3YyJztcbmltcG9ydCB7IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UgfSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2EnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuLi9lY2RzYS90eXBlc01QQ3YyJztcbmltcG9ydCB7XG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgU2lnbmF0dXJlU2hhcmVUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG4gIGlzVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCYXNlRWRkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSBmcm9tICcuLi9yZWNpcGllbnRVdGlscyc7XG5pbXBvcnQgeyBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuLCBLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlIH0gZnJvbSAnLi9lZGRzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbmltcG9ydCB7IEVkZHNhTVBDdjJSZWNvdmVyeUtleVNoYXJlcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRWRkc2FNUEN2MlV0aWxzIGV4dGVuZHMgQmFzZUVkZHNhVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ01QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEUgPSAnTVBTX0RLR19LRVlHRU5fUk9VTkQxX1NUQVRFJztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm87XG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbjtcbiAgICAvLyBXYWxsZXQgU2FmZXMgdjEgKEBleHBlcmltZW50YWwpOiB0YWdzIHRoZSByZXN1bHRpbmcgdXNlci9iYWNrdXAvYml0Z28gcm9vdCBrZXlzIHdpdGggdGhpcyBzYWZlLlxuICAgIHNhZmVJZD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHVzZXJLZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJLZXlQYWlyLnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgdXNlckdwZ1B1YmxpY0tleSA9IHVzZXJLZXlQYWlyLnB1YmxpY0tleTtcbiAgICBjb25zdCBbdXNlclBrLCB1c2VyU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKHVzZXJHcGdLZXkpO1xuXG4gICAgY29uc3QgYmFja3VwS2V5UGFpciA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IGJhY2t1cEtleVBhaXIucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCBiYWNrdXBHcGdQdWJsaWNLZXkgPSBiYWNrdXBLZXlQYWlyLnB1YmxpY0tleTtcbiAgICBjb25zdCBbYmFja3VwUGssIGJhY2t1cFNrXSA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5S2V5UGFpcihiYWNrdXBHcGdLZXkpO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBFZERTQSBNUEN2MiBwdWJsaWMga2V5IChlZDI1NTE5KS4gVXNpbmcgdGhlIGRlZmF1bHQgbXBjdjJQdWJsaWNLZXkgKHNlY3AyNTZrMSlcbiAgICAvLyBoZXJlIHdvdWxkIGNhdXNlIGEgV0FTTSBcIkludmFsaWQgSW5wdXRcIiBlcnJvciwgc28gd2UgcmVxdWlyZSB0aGUgZGVkaWNhdGVkIGVkZHNhTXBjdjJQdWJsaWNLZXkuXG4gICAgY29uc3QgeyBlZGRzYU1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBlZGRzYU1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5O1xuICAgIGFzc2VydChiaXRnb1B1YmxpY0dwZ0tleSwgJ0ZhaWxlZCB0byBnZXQgQml0R28gRWREU0EgTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgPSBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvRWRkc2FNcGN2MlB1YktleShiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgfSk7XG4gICAgY29uc3QgYml0Z29QayA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5UHVibGljS2V5KGJpdGdvS2V5T2JqKTtcblxuICAgIC8vIENyZWF0ZSBES0cgc2Vzc2lvbnMgZm9yIHVzZXIgKHBhcnR5IDApIGFuZCBiYWNrdXAgKHBhcnR5IDEpXG4gICAgY29uc3QgdXNlckRrZyA9IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBEa2cgPSBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGF3YWl0IHVzZXJEa2cuaW5pdERrZyh1c2VyU2ssIFtiYWNrdXBQaywgYml0Z29Qa10pO1xuICAgIGF3YWl0IGJhY2t1cERrZy5pbml0RGtnKGJhY2t1cFNrLCBbdXNlclBrLCBiaXRnb1BrXSk7XG5cbiAgICBjb25zdCB1c2VyTXNnMSA9IHVzZXJEa2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gICAgY29uc3QgYmFja3VwTXNnMSA9IGJhY2t1cERrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIGNvbnN0IHVzZXJTaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCksIHVzZXJHcGdLZXkpO1xuICAgIGNvbnN0IGJhY2t1cFNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShiYWNrdXBNc2cxLnBheWxvYWQpLCBiYWNrdXBHcGdLZXkpO1xuXG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB7XG4gICAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgICAgdXNlck1zZzE6IHVzZXJTaWduZWRNc2cxLFxuICAgICAgICBiYWNrdXBNc2cxOiBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgfSxcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgMlxuICAgIGNvbnN0IGJpdGdvUmF3TXNnMUJ5dGVzID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShiaXRnb01zZzEsIGJpdGdvS2V5T2JqKTtcbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYml0Z29SYXdNc2cxQnl0ZXMpLFxuICAgIH07XG5cbiAgICBjb25zdCByb3VuZDFNZXNzYWdlczogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMgPSBbdXNlck1zZzEsIGJhY2t1cE1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV07XG5cbiAgICBjb25zdCB1c2VyUm91bmQyTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDFNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwUm91bmQyTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdVc2VyIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kMk1zZ3MubGVuZ3RoID09PSAxLCAnQmFja3VwIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG5cbiAgICBjb25zdCB1c2VyTXNnMiA9IHVzZXJSb3VuZDJNc2dzWzBdO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBiYWNrdXBSb3VuZDJNc2dzWzBdO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzIgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzIucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgYml0Z29Nc2cyLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKHBhcmFtcy5lbnRlcnByaXNlLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjogdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBNc2cyOiBiYWNrdXBTaWduZWRNc2cyLFxuICAgIH0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCByb3VuZCAyIHNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgYml0Z29SYXdNc2cyQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMiwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzJCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMk1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMiwgYmFja3VwTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXTtcblxuICAgIGNvbnN0IHVzZXJGaW5hbE1zZ3MgPSB1c2VyRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuICAgIGNvbnN0IGJhY2t1cEZpbmFsTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMk1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIHVzZXInKTtcbiAgICBhc3NlcnQoYmFja3VwRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIGJhY2t1cCcpO1xuXG4gICAgY29uc3QgdXNlckNvbW1vbktleWNoYWluID0gdXNlckRrZy5nZXRDb21tb25LZXljaGFpbigpO1xuICAgIGNvbnN0IGJhY2t1cENvbW1vbktleWNoYWluID0gYmFja3VwRGtnLmdldENvbW1vbktleWNoYWluKCk7XG5cbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdVc2VyIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICAnQmFja3VwIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZFVzZXJLZXljaGFpbihcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgICBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGJhY2t1cFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbih1c2VyQ29tbW9uS2V5Y2hhaW4sIHBhcmFtcy5zYWZlSWQpO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdXNlcktleWNoYWluUHJvbWlzZSxcbiAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgIF0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXM6IHtcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgY2FsbGJhY2tzOiBFZGRzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlLCBjYWxsYmFja3MgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgZWRkc2FNcGN2MlB1YmxpY0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MoZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBlZGRzYU1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5O1xuICAgIGFzc2VydChiaXRnb1B1YmxpY0dwZ0tleSwgJ0ZhaWxlZCB0byBnZXQgQml0R28gRWREU0EgTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgPSBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvRWRkc2FNcGN2MlB1YktleShiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQpLCAnSW52YWxpZCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIC8vIFJvdW5kIDA6IGJvdGggcGFydGllcyBnZW5lcmF0ZSBHUEcga2V5c1xuICAgIGNvbnN0IHsgdXNlckdwZ1B1YmxpY0tleSwgYmFja3VwR3BnUHVibGljS2V5LCB1c2VyU3RhdGUsIGJhY2t1cFN0YXRlIH0gPSBhd2FpdCBjYWxsYmFja3MuaW5pdGlhbGl6ZUNhbGxiYWNrKHtcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG5cbiAgICAvLyBSb3VuZCAxOiBib3RoIHBhcnRpZXMgcnVuIERLRyByb3VuZCAxXG4gICAgY29uc3Qge1xuICAgICAgdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjEsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjEsXG4gICAgfSA9IGF3YWl0IGNhbGxiYWNrcy5yb3VuZDFDYWxsYmFjayh7XG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkLFxuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJTdGF0ZSxcbiAgICAgIGJhY2t1cFN0YXRlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShlbnRlcnByaXNlLCB7XG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlck1zZzE6IHVzZXJTaWduZWRNc2cxLFxuICAgICAgYmFja3VwTXNnMTogYmFja3VwU2lnbmVkTXNnMSxcbiAgICB9KTtcblxuICAgIC8vIFJvdW5kIDI6IGJvdGggcGFydGllcyBydW4gREtHIHJvdW5kIDJcbiAgICBjb25zdCB7XG4gICAgICB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMixcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMixcbiAgICB9ID0gYXdhaXQgY2FsbGJhY2tzLnJvdW5kMkNhbGxiYWNrKHtcbiAgICAgIGJpdGdvTXNnMSxcbiAgICAgIHVzZXJTaWduZWRNc2cxLFxuICAgICAgYmFja3VwU2lnbmVkTXNnMSxcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIxLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIxLFxuICAgIH0pO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIGJpdGdvTXNnMixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMihlbnRlcnByaXNlLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjogdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBNc2cyOiBiYWNrdXBTaWduZWRNc2cyLFxuICAgIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIHJvdW5kIDIgc2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICAvLyBGaW5hbGl6ZTogYm90aCBwYXJ0aWVzIHZlcmlmeSBhbmQgZGVyaXZlIHRoZSBjb21tb24ga2V5Y2hhaW5cbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluIH0gPSBhd2FpdCBjYWxsYmFja3MuZmluYWxpemVDYWxsYmFjayh7XG4gICAgICBiaXRnb01zZzIsXG4gICAgICBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjIsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjIsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbW1vbktleWNoYWluLCBiaXRnb0NvbW1vbktleWNoYWluLCAnQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAga2V5Y2hhaW5zLmFkZCh7IHNvdXJjZTogJ3VzZXInLCBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLCBjb21tb25LZXljaGFpbiwgaXNNUEN2MjogdHJ1ZSB9KSxcbiAgICAgIGtleWNoYWlucy5hZGQoeyBzb3VyY2U6ICdiYWNrdXAnLCBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLCBjb21tb25LZXljaGFpbiwgaXNNUEN2MjogdHJ1ZSB9KSxcbiAgICAgIHRoaXMuYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbiksXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH07XG4gIH1cblxuICAvLyAjcmVnaW9uIGtleWNoYWluIHV0aWxzXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgcGFydGljaXBhbnRJbmRleDogTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVkdWNlZEVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBwcml2YXRlTWF0ZXJpYWxCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAocGFydGljaXBhbnRJbmRleCkge1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBzb3VyY2UgPSBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAndXNlcicgOiAnYmFja3VwJztcbiAgICAgICAgYXNzZXJ0KHByaXZhdGVNYXRlcmlhbCwgYFByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocmVkdWNlZFByaXZhdGVNYXRlcmlhbCwgYFJlZHVjZWQgcHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChwYXNzcGhyYXNlLCBgUGFzc3BocmFzZSBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIHByaXZhdGVNYXRlcmlhbEJhc2U2NCA9IHByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwdWJsaWNcbiAgICAgICAgLy8ga2V5KSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAvLyBvbiB0aGUga2V5IGNhcmQgUVIgY29kZSBhbmQgcmVwcmVzZW50cyBhIHNlY29uZCBjb3B5IG9mIGtleSBtYXRlcmlhbFxuICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgLy8gVGhlIGJyb3dzZXIgZGVhbHMgd2l0aCBhIEJ1ZmZlciBhcyBVaW50OEFycmF5LCB0aGVyZWZvcmUgaW4gdGhlIGJyb3dzZXIgLnRvU3RyaW5nKCdiYXNlNjQnKSBqdXN0IGNyZWF0ZXMgYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIHRoZSBhcnJheSB2YWx1ZXMuXG4gICAgICAgICAgaW5wdXQ6IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpKSkpLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQklUR086XG4gICAgICAgIHNvdXJjZSA9ICdiaXRnbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgICBzYWZlSWQsXG4gICAgfTtcblxuICAgIGlmICh3ZWJhdXRobkluZm8gJiYgcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIHByaXZhdGVNYXRlcmlhbEJhc2U2NCkge1xuICAgICAgLy8gU2VuZCB0aGUgcGFzc2tleSBhcyBgd2ViYXV0aG5JbmZvYDsgdGhlIGRlcHJlY2F0ZWQgYHdlYmF1dGhuRGV2aWNlc2AgYXJyYXkgaXMgaWdub3JlZCBieSBQT1NUIC9rZXkuXG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgdG8gYXR0YWNoIGEgd2ViYXV0aG4gZGV2aWNlIHRvIHRoZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICBrZXljaGFpblBhcmFtcy53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgIHByZlNhbHQ6IHdlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBlbnRlcnByaXNlSWQ6IGVudGVycHJpc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHsgLi4uKGF3YWl0IGtleWNoYWlucy5hZGQoa2V5Y2hhaW5QYXJhbXMpKSwgcmVkdWNlZEVuY3J5cHRlZFBydiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRVc2VyS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyxcbiAgICBzYWZlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgc2FmZUlkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgc2FmZUlkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nLCBzYWZlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNhZmVJZFxuICAgICk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdCxcbiAgICBzYWZlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSwgc2FmZUlkKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm48RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSwgcGF5bG9hZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIDMtcm91bmQgRWREU0EgTVBDdjIgKE1QUykgb25saW5lIHNpZ25pbmcgb3JjaGVzdHJhdGlvbi5cbiAgICpcbiAgICogUHJvdG9jb2wgb3ZlcnZpZXc6XG4gICAqICAgV0FTTSBSb3VuZCAwICDihpIgZ2V0Rmlyc3RNZXNzYWdlKCkgICAgICAocHJvZHVjZXMgdXNlck1zZzEpXG4gICAqICAgQVBJICBSb3VuZCAxICDihpIgc2VuZCB1c2VyTXNnMSAvIHJlY3YgYml0Z29Nc2cxXG4gICAqICAgV0FTTSBSb3VuZCAxICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvTXNnMV0pICAocHJvZHVjZXMgdXNlck1zZzIpXG4gICAqICAgQVBJICBSb3VuZCAyICDihpIgc2VuZCB1c2VyTXNnMiAvIHJlY3YgYml0Z29Nc2cyXG4gICAqICAgV0FTTSBSb3VuZCAyICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvTXNnMl0pICAocHJvZHVjZXMgdXNlck1zZzMpXG4gICAqICAgQVBJICBSb3VuZCAzICDihpIgc2VuZCB1c2VyTXNnMyAoV1AgZmluYWxpc2VzOyBubyBCaXRHbyBtc2cgcmV0dXJuZWQgdG8gY2xpZW50KVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHR4T3JNZXNzYWdlVG9TaWduO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcbiAgICBsZXQgYnVmZmVyQ29udGVudDtcbiAgICAvLyBPbmUgZnJlc2ggZWQyNTUxOSBHUEcga2V5IHBhaXIgcGVyIHNpZ25pbmcgc2Vzc2lvbiwgcmV1c2VkIGFjcm9zcyBhbGwgc2lnbmluZyByb3VuZHMuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcodHJ1ZSwgcGFyYW1zLnJlcUlkLCB0eFJlcXVlc3QuZW50ZXJwcmlzZUlkLCB0cnVlKTtcbiAgICBhc3NlcnQoYml0Z29HcGdQdWJLZXksICdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHMhWzBdO1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBzaWduYWJsZUhleCBpbiB1bnNpZ25lZFR4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCA/PyB0eE9yTWVzc2FnZVRvU2lnbiB9LFxuICAgICAgICB0eFBhcmFtczogcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgcGFyYW1zLnR4UGFyYW1zLCB0aGlzLmJhc2VDb2luLmdldENoYWluKCkpLFxuICAgICAgICB3YWxsZXQ6IHRoaXMud2FsbGV0LFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QubWVzc2FnZXMgJiYgdHhSZXF1ZXN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLm1lc3NhZ2VFbmNvZGVkO1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBtZXNzYWdlRW5jb2RlZCBpbiBtZXNzYWdlc1swXScpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB0eFJlcXVlc3QubWVzc2FnZXNbMF0uZGVyaXZhdGlvblBhdGggfHwgJ20vMCc7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlcXVlc3QgdHlwZScpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgcGFydHlJZCA9IHBhcmFtcy5tcGN2MlBhcnR5SWQgPz8gTVBDdjJQYXJ0aWVzRW51bS5VU0VSO1xuICAgIGNvbnN0IHNpZ25lclNoYXJlVHlwZSA9IHBhcnR5SWQgPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSIDogU2lnbmF0dXJlU2hhcmVUeXBlLkJBQ0tVUDtcbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhwYXJ0eUlkKTtcbiAgICBhd2FpdCB1c2VyRHNnLmluaXREc2codXNlcktleVNoYXJlLCBidWZmZXJDb250ZW50LCBkZXJpdmF0aW9uUGF0aCwgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyk7XG4gICAgY29uc3QgdXNlck1zZzEgPSB1c2VyRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gICAgLy8g4pSA4pSAIEFQSSBSb3VuZCAxIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyTXNnMSwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGV0IGxhdGVzdFR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhc3NlcnQobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMScpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzMSA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZE9uZSA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzMSwgc2lnbmVyU2hhcmVUeXBlLCAncm91bmQxT3V0cHV0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRPbmUuc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMSA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRPbmUocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLCBiaXRnb0dwZ1B1YktleSk7XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAxIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IFt1c2VyTXNnMl0gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cxLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzFdKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdXQVNNIHJvdW5kIDEgcHJvZHVjZWQgbm8gbWVzc2FnZScpO1xuXG4gICAgLy8g4pSA4pSAIEFQSSBSb3VuZCAyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUd28gPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKHVzZXJNc2cyLCB1c2VyR3BnUHJ2S2V5LCBwYXJ0eUlkKTtcbiAgICBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFR3b10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhc3NlcnQobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMicpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kVHdvID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZSh0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMk91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kVHdvLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLnR5cGUgIT09ICdyb3VuZDJPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzIgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3bywgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzNdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2czLCAnV0FTTSByb3VuZCAyIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBObyBCaXRHbyByZXNwb25zZSB0byB2ZXJpZnk7IFdQIGZpbmFsaXNlcyB0aGUgc2lnbmluZyBzZXJ2ZXItc2lkZVxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJNc2czLCB1c2VyR3BnUHJ2S2V5LCBwYXJ0eUlkKTtcbiAgICBjb25zdCByb3VuZDNUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChyb3VuZDNUeFJlcXVlc3Q/LnR4UmVxdWVzdElkID09PSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMycpO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZXh0ZXJuYWwgc2lnbmVyXG5cbiAgLy8gI3JlZ2lvbiBLZXlHZW5Sb3VuZDFTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lS2V5R2VuUm91bmQxU2hhcmUocGFyYW1zOiB7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBiaXRnb0dwZ1B1YktleTogc3RyaW5nO1xuICAgIGNvdW50ZXJQYXJ0eUdwZ1B1YktleTogc3RyaW5nO1xuICAgIHBhcnR5SWQ/OiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgfCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDtcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25lZE1zZzE6IE1QU1R5cGVzLk1QU1NpZ25lZE1lc3NhZ2U7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBiaXRnb0dwZ1B1YktleSwgY291bnRlclBhcnR5R3BnUHViS2V5IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGFydHlJZCA9IHBhcmFtcy5wYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEdwZ1BydktleSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCBncGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBkZWNyeXB0ZWRHcGdQcnZLZXkgfSk7XG5cbiAgICBjb25zdCBbLCBvd25Ta10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIoZ3BnUHJ2S2V5KTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkoYml0Z29HcGdQdWJLZXkpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZ1B1YktleSB9KTtcbiAgICBjb25zdCBiaXRnb1BrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYml0Z29LZXlPYmopO1xuXG4gICAgY29uc3QgY291bnRlclBhcnR5S2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBjb3VudGVyUGFydHlHcGdQdWJLZXkgfSk7XG4gICAgY29uc3QgY291bnRlclBhcnR5UGsgPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOVB1YmxpY0tleShjb3VudGVyUGFydHlLZXlPYmopO1xuXG4gICAgY29uc3QgZGtnID0gbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBwYXJ0eUlkKTtcbiAgICBhd2FpdCBka2cuaW5pdERrZyhvd25TaywgW2NvdW50ZXJQYXJ0eVBrLCBiaXRnb1BrXSk7XG5cbiAgICBjb25zdCBtc2cxID0gZGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuICAgIGNvbnN0IHNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShtc2cxLnBheWxvYWQpLCBncGdQcnZLZXkpO1xuXG4gICAgY29uc3Qgc2Vzc2lvblBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBka2dTZXNzaW9uOiBka2cuZ2V0U2Vzc2lvbigpLFxuICAgICAgb3duTXNnUGF5bG9hZDogQnVmZmVyLmZyb20obXNnMS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBvd25Nc2dGcm9tOiBtc2cxLmZyb20sXG4gICAgfSk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEV9OiR7cGFydHlJZH1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduZWRNc2cxLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSB9KTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKSwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcblxuICAgIGNvbnN0IHVzZVYyID0gZW5jcnlwdGVkUHJ2ICE9PSB1bmRlZmluZWQgJiYgaXNWMkVudmVsb3BlKGVuY3J5cHRlZFBydik7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kMlNoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDJTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDI6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aChcbiAgICAgIHR4UmVxdWVzdCxcbiAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtzaWduYWJsZUhleH06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlVjIgPSBpc1YyRW52ZWxvcGUoZW5jcnlwdGVkUm91bmQxU2Vzc2lvbik7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHRyYW5zYWN0aW9ucykgJiYgdHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMSwgJ3R4UmVxdWVzdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMSB0eFJlcXVlc3QnKTtcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZE9uZSA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzLCBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdLZXkpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGRzZ1Nlc3Npb24sIHVzZXJNc2dQYXlsb2FkIH0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJvdW5kMVNlc3Npb24pIGFzIHtcbiAgICAgIGRzZ1Nlc3Npb246IHN0cmluZztcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5yZXN0b3JlU2Vzc2lvbihkc2dTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyTXNnMTogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHVzZXJNc2dQYXlsb2FkLCAnYmFzZTY0JykpLFxuICAgIH07XG5cbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnRFNHIGhhbmRsZUluY29taW5nTWVzc2FnZXMgcHJvZHVjZWQgbm8gcm91bmQtMiBvdXRwdXQnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQyID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSk7XG4gICAgY29uc3Qgc2Vzc2lvblBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTZXNzaW9uOiB1c2VyRHNnLmdldFNlc3Npb24oKSxcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfSk7XG5cbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICBzZXNzaW9uUGF5bG9hZCxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQzU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdQcnZLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodHJhbnNhY3Rpb25zKSAmJiB0cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAndHhSZXF1ZXN0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSB0cmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kVHdvID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZShzaWduYXR1cmVTaGFyZXMsIFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLCAncm91bmQyT3V0cHV0Jyk7XG5cbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDJTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzI6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTMgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgc2lnbkVkZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUgPSBSZXF1ZXN0VHlwZS50eFxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gICAgLy8gVE9ETyhXUC0yMTc2KTogQWRkIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgIGFzc2VydChcbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICdPbmx5IHRyYW5zYWN0aW9uIHNpZ25pbmcgaXMgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIsIGdvdDogJyArIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCByZXFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKFxuICAgICAgdHJ1ZSxcbiAgICAgIHJlcUlkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQuZW50ZXJwcmlzZUlkLFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICBpZiAoIWJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICAvLyByb3VuZCAxXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9ID1cbiAgICAgIGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3IoeyB0eFJlcXVlc3Q6IHR4UmVxdWVzdFJlc29sdmVkIH0pO1xuICAgIGNvbnN0IHJvdW5kMVR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDJcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQxVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDJUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQyXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcyxcbiAgICAgICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDNcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQyVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCwgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCByZXFJZCk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuXG4vKipcbiAqIERldGVjdCB3aGV0aGVyIGFuIGVuY3J5cHRlZCBrZXljYXJkIGNvbnRhaW5zIE1QQ3YxIHNpZ25pbmcgbWF0ZXJpYWwuXG4gKlxuICogRGVjcnlwdHMgdGhlIGtleWNhcmQgYW5kIGNoZWNrcyBmb3IgdGhlIEpTT04gc2hhcGUgcHJvZHVjZWQgYnkgdGhlIE1QQ3YxIFRTU1xuICoga2V5LWdlbmVyYXRpb24gZmxvdyAodVNoYXJlLnNlZWQgKyBiaXRnb1lTaGFyZS51ICsgYmFja3VwWVNoYXJlLnUgLyB1c2VyWVNoYXJlLnUpLlxuICogUmV0dXJucyBmYWxzZSBmb3IgTVBDdjIgQ0JPUiBrZXljYXJkcywgd3JvbmcgcGFzc3dvcmRzLCBvciBhbnkgZGVjcnlwdGlvbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0gZW5jcnlwdGVkS2V5U2hhcmUgZW5jcnlwdGVkIHVzZXIgb3IgYmFja3VwIGtleWNhcmRcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHBhc3NwaHJhc2UgdXNlZCB0byBlbmNyeXB0IHRoZSBrZXljYXJkXG4gKiBAcGFyYW0gYml0Z28gb3B0aW9uYWwgQml0R29CYXNlIGluc3RhbmNlOyB3aGVuIHByb3ZpZGVkLCBkZWNyeXB0cyB2aWFcbiAqICAgYml0Z28uZGVjcnlwdCAoc3VwcG9ydHMgYm90aCB2MSBTSkNMIGFuZCB2MiBBcmdvbjJpZCBlbnZlbG9wZXMpO1xuICogICB3aGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBzamNsLmRlY3J5cHQgKHYxIG9ubHkpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwoXG4gIGVuY3J5cHRlZEtleVNoYXJlOiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwcnYgPSBiaXRnb1xuICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXlTaGFyZSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXlTaGFyZSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgbT8udVNoYXJlPy5zZWVkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIG0/LmJpdGdvWVNoYXJlPy51ID09PSAnc3RyaW5nJyAmJlxuICAgICAgKHR5cGVvZiBtPy5iYWNrdXBZU2hhcmU/LnUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtPy51c2VyWVNoYXJlPy51ID09PSAnc3RyaW5nJylcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBKU09OIHBhcnNlIGVycm9yIGluZGljYXRlcyBNUEN2MiBDQk9SIGZvcm1hdCwgbm90IEpTT04uXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSBlbmNyeXB0ZWQgcmVkdWNlZCB1c2VyIGFuZCBiYWNrdXAga2V5cy5cbiAqXG4gKiBUaGUgZW5jcnlwdGVkIGlucHV0cyBhcmUgdGhlIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YCB2YWx1ZXMgc3RvcmVkIG9uIEVkRFNBIE1QQ3YyXG4gKiBrZXkgY2FyZHMuIFRoZXkgZGVjcnlwdCB0byBDQk9SLWVuY29kZWQgcmVkdWNlZCBzaGFyZXMgdGhhdCBjb250YWluIHRoZSBvcGFxdWVcbiAqIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBwbHVzIHRoZSBjb21tb24gcHVibGljIGtleWNoYWluIG1hdGVyaWFsLlxuICpcbiAqIEBwYXJhbSBlbmNyeXB0ZWRVc2VyS2V5IGVuY3J5cHRlZCBFZERTQSBNUEN2MiByZWR1Y2VkIHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkQmFja3VwS2V5IGVuY3J5cHRlZCBFZERTQSBNUEN2MiByZWR1Y2VkIGJhY2t1cCBrZXlcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHBhc3N3b3JkIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5c1xuICogQHJldHVybnMgRWREU0EgTVBDdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBhbmQgY29tbW9uIGtleWNoYWluXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFZGRzYU1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShcbiAgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8RWRkc2FNUEN2MlJlY292ZXJ5S2V5U2hhcmVzPiB7XG4gIGNvbnN0IGRlY29kZUtleSA9IGFzeW5jIChlbmNyeXB0ZWRLZXk6IHN0cmluZyk6IFByb21pc2U8TVBTVHlwZXMuRWRkc2FSZWR1Y2VkS2V5U2hhcmU+ID0+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWQgPSBiaXRnb1xuICAgICAgPyBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZEtleSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgIDogc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZEtleSk7XG4gICAgbGV0IHJlZHVjZWQ6IE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlO1xuICAgIHRyeSB7XG4gICAgICByZWR1Y2VkID0gTVBTVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShCdWZmZXIuZnJvbShkZWNyeXB0ZWQsICdiYXNlNjQnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeTogdW5hYmxlIHRvIGRlY29kZSByZWR1Y2VkIGtleSBzaGFyZSBmcm9tIGtleWNhcmQgbWF0ZXJpYWwuIFRoZSBlbmNyeXB0ZWQga2V5IG1heSBiZSBjb3JydXB0ZWQsIG1hbGZvcm1lZCwgb3Igbm90IGFuIEVkRFNBIE1QQ3YyIHJlZHVjZWQga2V5LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVkdWNlZC5rZXlTaGFyZT8ubGVuZ3RoIHx8ICFyZWR1Y2VkLnB1Yj8ubGVuZ3RoIHx8ICFyZWR1Y2VkLnJvb3RDaGFpbkNvZGU/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHJlZHVjZWQga2V5IHNoYXJlIGlzIG1pc3Npbmcga2V5U2hhcmUsIHB1Yiwgb3Igcm9vdENoYWluQ29kZS4gVGhpcyBrZXljYXJkIG1heSBiZSBwdWJsaWMtb25seSBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIHJlY292ZXJ5LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZWR1Y2VkO1xuICB9O1xuXG4gIGNvbnN0IFt1c2VyUmVkdWNlZCwgYmFja3VwUmVkdWNlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbZGVjb2RlS2V5KGVuY3J5cHRlZFVzZXJLZXkpLCBkZWNvZGVLZXkoZW5jcnlwdGVkQmFja3VwS2V5KV0pO1xuXG4gIGNvbnN0IHVzZXJQdWIgPSBCdWZmZXIuZnJvbSh1c2VyUmVkdWNlZC5wdWIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgYmFja3VwUHViID0gQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5wdWIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgaWYgKHVzZXJQdWIgIT09IGJhY2t1cFB1Yikge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHVzZXIgYW5kIGJhY2t1cCBwdWIga2V5cyBkbyBub3QgbWF0Y2gnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbSh1c2VyUmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGJhY2t1cENoYWluQ29kZSA9IEJ1ZmZlci5mcm9tKGJhY2t1cFJlZHVjZWQucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpO1xuICBpZiAodXNlckNoYWluQ29kZSAhPT0gYmFja3VwQ2hhaW5Db2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogdXNlciBhbmQgYmFja3VwIHJvb3RDaGFpbkNvZGVzIGRvIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5U2hhcmU6IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLmtleVNoYXJlKSxcbiAgICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5rZXlTaGFyZSksXG4gICAgY29tbW9uS2V5Q2hhaW46IHVzZXJQdWIgKyB1c2VyQ2hhaW5Db2RlLFxuICB9O1xufVxuXG4vKipcbiAqIFNpZ24gYSBtZXNzYWdlIGZvciByZWNvdmVyeSB1c2luZyBFZERTQSBNUEN2MiAoTVBTKSB3aXRoIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzLlxuICpcbiAqIFJ1bnMgdGhlIE1QUyBEU0cgcHJvdG9jb2wgbG9jYWxseSB0byByb3VuZCAzLCB0aGVuIHZlcmlmaWVzIHRoZSByZXN1bHRpbmdcbiAqIEVkMjU1MTkgc2lnbmF0dXJlIGFnYWluc3QgdGhlIHB1YmxpYyBrZXkgZGVyaXZlZCBmcm9tIHRoZSBjb21tb24ga2V5Y2hhaW4uXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgcmF3IGJ5dGVzIHRvIHNpZ25cbiAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLCBlLmcuIGBcIm0vMFwiYFxuICogQHBhcmFtIHVzZXJLZXlTaGFyZSBvcGFxdWUgTVBTIHNpZ25pbmcga2V5LXNoYXJlIGJ5dGVzIGZvciB0aGUgdXNlciBwYXJ0eVxuICogQHBhcmFtIGJhY2t1cEtleVNoYXJlIG9wYXF1ZSBNUFMgc2lnbmluZyBrZXktc2hhcmUgYnl0ZXMgZm9yIHRoZSBiYWNrdXAgcGFydHlcbiAqIEBwYXJhbSBjb21tb25LZXlDaGFpbiAxMjgtaGV4LWNoYXIgc3RyaW5nOiAzMi1ieXRlIHB1YiArIDMyLWJ5dGUgcm9vdENoYWluQ29kZVxuICogQHJldHVybnMgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSBCdWZmZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25SZWNvdmVyeUVkZHNhTVBDdjIoXG4gIG1lc3NhZ2U6IEJ1ZmZlcixcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgdXNlcktleVNoYXJlOiBCdWZmZXIsXG4gIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIsXG4gIGNvbW1vbktleUNoYWluOiBzdHJpbmdcbik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gIGNvbnN0IGJhY2t1cERzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuXG4gIGNvbnN0IHNpZ25hdHVyZSA9IChhd2FpdCBNUFNVdGlsLmV4ZWN1dGVUaWxsUm91bmQoXG4gICAgMyxcbiAgICB1c2VyRHNnLFxuICAgIGJhY2t1cERzZyxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgbWVzc2FnZSxcbiAgICBkZXJpdmF0aW9uUGF0aFxuICApKSBhcyBCdWZmZXI7XG5cbiAgLy8gVXNlIEVkZHNhLmRlcml2ZVVuaGFyZGVuZWQgKEJJUDMyLUVkMjU1MTkpLCB3aGljaCBtYXRjaGVzIHdoYXQgRFNHIHVzZXNcbiAgLy8gaW50ZXJuYWxseSBmb3IgcGF0aCBkZXJpdmF0aW9uIHNpbmNlIHdhc20tbXBzIDEuOS4wLlxuICBjb25zdCBtcGMgPSBhd2FpdCBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gIGNvbnN0IGRlcml2ZWRLZXljaGFpbiA9IG1wYy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleUNoYWluLCBkZXJpdmF0aW9uUGF0aCk7XG4gIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZEtleWNoYWluLnNsaWNlKDAsIDY0KSwgJ2hleCcpO1xuXG4gIGNvbnN0IHZlcmlmaWVkID0gZWQyNTUxOS52ZXJpZnkobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSksIG5ldyBVaW50OEFycmF5KHB1YmxpY0tleUJ5dGVzKSk7XG4gIGlmICghdmVyaWZpZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkJyk7XG4gIH1cblxuICByZXR1cm4gc2lnbmF0dXJlO1xufVxuXG5leHBvcnQgY29uc3QgRWRkc2FNUEN2MlJlY292ZXJ5RnVuY3Rpb25zID0ge1xuICBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwsXG4gIGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5LFxuICBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyLFxufTtcbiJdfQ==
819
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFncENBLGtFQVNDO0FBY0Qsb0dBNkNDO0FBZUQsd0RBZ0NDO0FBZUQsMERBZ0JDO0FBUUQsNERBbUJDO0FBN3pDRCxvREFBNEI7QUFDNUIsa0RBQW9DO0FBQ3BDLDZDQUErQjtBQUMvQiw2Q0FBNkM7QUFDN0Msc0RBUzZCO0FBRTdCLG1EQUFnRDtBQUNoRCxvREFBMkY7QUFHM0YsNERBQXFHO0FBQ3JHLGdEQUFnSDtBQUNoSCx5Q0FBK0M7QUFDL0MsOERBTXVDO0FBQ3ZDLG9EQUFxRTtBQUNyRSxxREFBd0Q7QUFDeEQsb0RBQXVEO0FBQ3ZELDRDQWFzQjtBQUd0QixpQ0FBd0M7QUFDeEMsc0RBQTZEO0FBQzdELHFFQUE2RjtBQUk3RixNQUFhLGVBQWdCLFNBQVEscUJBQWM7SUFNakQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFRckI7UUFDQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRSxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUNuRCxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRiwrRkFBK0Y7UUFDL0Ysa0dBQWtHO1FBQ2xHLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekcsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUM7UUFDbEYsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFDNUUsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzRCxJQUFJLElBQUEsOENBQStCLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLElBQUEsc0NBQXVCLEVBQUMsd0JBQXdCLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVwRSw4REFBOEQ7UUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRSxrQkFBa0I7UUFDbEIsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRS9DLE1BQU0sY0FBYyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sc0JBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU1RyxJQUFBLGdCQUFNLEVBQUMsNEJBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9FLElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFFbkYsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FDakUsTUFBTSxDQUFDLFVBQVUsRUFDakI7WUFDRSxnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBQ2xCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFVBQVUsRUFBRSxnQkFBZ0I7U0FDN0IsRUFDRCxNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7UUFDRixhQUFhO1FBRWIsa0JBQWtCO1FBQ2xCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxzQkFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRixNQUFNLHFCQUFxQixHQUFpQztZQUMxRCxJQUFJLEVBQUUsNkJBQWdCLENBQUMsS0FBSztZQUM1QixPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUM7U0FDM0MsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFrQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVwRyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFMUUsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLHlEQUF5RCxDQUFDLENBQUM7UUFDL0YsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUVuRyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxzQkFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxzQkFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTVHLE1BQU0sRUFDSixTQUFTLEVBQUUsZUFBZSxFQUMxQixvQkFBb0IsRUFDcEIsU0FBUyxHQUNWLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUN4RCxTQUFTO1lBQ1QsUUFBUSxFQUFFLGNBQWM7WUFDeEIsVUFBVSxFQUFFLGdCQUFnQjtTQUM3QixDQUFDLENBQUM7UUFDSCxhQUFhO1FBRWIsNEJBQTRCO1FBQzVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUV6RixNQUFNLGlCQUFpQixHQUFHLE1BQU0sc0JBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEYsTUFBTSxxQkFBcUIsR0FBaUM7WUFDMUQsSUFBSSxFQUFFLDZCQUFnQixDQUFDLEtBQUs7WUFDNUIsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDO1NBQzNDLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBa0MsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFcEcsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RSxJQUFBLGdCQUFNLEVBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUseURBQXlELENBQUMsQ0FBQztRQUM5RixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUVsRyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFM0QsZ0JBQU0sQ0FBQyxLQUFLLENBQ1Ysa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQiw2REFBNkQsQ0FDOUQsQ0FBQztRQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNWLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsK0RBQStELENBQ2hFLENBQUM7UUFFRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sNEJBQTRCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFcEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUM5QyxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsOEJBQThCLEVBQ3JDLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sQ0FBQyxpQkFBaUIsRUFDeEIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ2xELG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsNEJBQTRCLEVBQzVCLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyw4QkFBOEIsRUFDckMsTUFBTSxDQUFDLGlCQUFpQixFQUN4QixNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7UUFDRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEYsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3RFLG1CQUFtQjtZQUNuQixxQkFBcUI7WUFDckIsb0JBQW9CO1NBQ3JCLENBQUMsQ0FBQztRQUNILGFBQWE7UUFFYixPQUFPO1lBQ0wsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsaUNBQWlDLENBQUMsTUFHdkM7UUFDQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV6QyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUM7UUFDbEYsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFDNUUsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzRCxJQUFJLElBQUEsOENBQStCLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLElBQUEsc0NBQXVCLEVBQUMsd0JBQXdCLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztZQUMxRyxVQUFVO1lBQ1YsaUJBQWlCLEVBQUUsd0JBQXdCO1NBQzVDLENBQUMsQ0FBQztRQUVILElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUVuRix3Q0FBd0M7UUFDeEMsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsV0FBVyxFQUFFLGlCQUFpQixHQUMvQixHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNqQyxpQkFBaUIsRUFBRSx3QkFBd0I7WUFDM0MsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixTQUFTO1lBQ1QsV0FBVztTQUNaLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQzlFLGdCQUFnQjtZQUNoQixrQkFBa0I7WUFDbEIsUUFBUSxFQUFFLGNBQWM7WUFDeEIsVUFBVSxFQUFFLGdCQUFnQjtTQUM3QixDQUFDLENBQUM7UUFFSCx3Q0FBd0M7UUFDeEMsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsV0FBVyxFQUFFLGlCQUFpQixHQUMvQixHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNqQyxTQUFTO1lBQ1QsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixTQUFTLEVBQUUsZUFBZTtZQUMxQixXQUFXLEVBQUUsaUJBQWlCO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sRUFDSixTQUFTLEVBQUUsZUFBZSxFQUMxQixvQkFBb0IsRUFBRSxtQkFBbUIsRUFDekMsU0FBUyxHQUNWLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQ2pELFNBQVM7WUFDVCxRQUFRLEVBQUUsY0FBYztZQUN4QixVQUFVLEVBQUUsZ0JBQWdCO1NBQzdCLENBQUMsQ0FBQztRQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUUvRiwrREFBK0Q7UUFDL0QsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQzFELFNBQVM7WUFDVCxtQkFBbUI7WUFDbkIsU0FBUyxFQUFFLGVBQWU7WUFDMUIsV0FBVyxFQUFFLGlCQUFpQjtTQUMvQixDQUFDLENBQUM7UUFDSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUV6RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN0RSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBZ0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzNGLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFnQixFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztTQUN0QyxDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLEtBQUssQ0FBQyx5QkFBeUIsQ0FDN0IsZ0JBQThDLEVBQzlDLGNBQXNCLEVBQ3RCLGVBQXdCLEVBQ3hCLHNCQUErQixFQUMvQixVQUFtQixFQUNuQiw4QkFBdUMsRUFDdkMsWUFBd0MsRUFDeEMsaUJBQXFDLEVBQ3JDLFVBQW1CLEVBQ25CLE1BQWU7UUFFZixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLFlBQVksR0FBdUIsU0FBUyxDQUFDO1FBQ2pELElBQUksbUJBQW1CLEdBQXVCLFNBQVMsQ0FBQztRQUN4RCxJQUFJLHFCQUFxQixHQUF1QixTQUFTLENBQUM7UUFFMUQsUUFBUSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzNCLEtBQUssNkJBQWdCLENBQUMsTUFBTTtnQkFDMUIsTUFBTSxHQUFHLGdCQUFnQixLQUFLLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hFLElBQUEsZ0JBQU0sRUFBQyxlQUFlLEVBQUUsb0NBQW9DLE1BQU0sV0FBVyxDQUFDLENBQUM7Z0JBQy9FLElBQUEsZ0JBQU0sRUFBQyxzQkFBc0IsRUFBRSw0Q0FBNEMsTUFBTSxXQUFXLENBQUMsQ0FBQztnQkFDOUYsSUFBQSxnQkFBTSxFQUFDLFVBQVUsRUFBRSw4QkFBOEIsTUFBTSxXQUFXLENBQUMsQ0FBQztnQkFDcEUscUJBQXFCLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0QsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQ3RDLEtBQUssRUFBRSxxQkFBcUI7b0JBQzVCLFFBQVEsRUFBRSxVQUFVO29CQUNwQixpQkFBaUI7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCwrRUFBK0U7Z0JBQy9FLCtFQUErRTtnQkFDL0UsdUVBQXVFO2dCQUN2RSx5Q0FBeUM7Z0JBQ3pDLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQzdDLHFGQUFxRjtvQkFDckYseUpBQXlKO29CQUN6SixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRyxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsaUJBQWlCO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsTUFBTTtZQUNSLEtBQUssNkJBQWdCLENBQUMsS0FBSztnQkFDekIsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFDakIsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQXVCO1lBQ3pDLE1BQU07WUFDTixPQUFPLEVBQUUsS0FBZ0I7WUFDekIsY0FBYztZQUNkLFlBQVk7WUFDWiw4QkFBOEI7WUFDOUIsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNO1NBQ1AsQ0FBQztRQUVGLElBQUksWUFBWSxJQUFJLGdCQUFnQixLQUFLLDZCQUFnQixDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hGLHNHQUFzRztZQUN0RyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLHlFQUF5RSxDQUFDLENBQUM7WUFDOUYsY0FBYyxDQUFDLFlBQVksR0FBRztnQkFDNUIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87Z0JBQzdCLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUNyQyxLQUFLLEVBQUUscUJBQXFCO29CQUM1QixRQUFRLEVBQUUsWUFBWSxDQUFDLFVBQVU7b0JBQ2pDLGlCQUFpQjtpQkFDbEIsQ0FBQztnQkFDRixZQUFZLEVBQUUsVUFBVTthQUN6QixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUMzQixjQUFzQixFQUN0QixlQUF1QixFQUN2QixzQkFBOEIsRUFDOUIsVUFBa0IsRUFDbEIsOEJBQXVDLEVBQ3ZDLFlBQXdDLEVBQ3hDLGlCQUFxQyxFQUNyQyxVQUFtQixFQUNuQixNQUFlO1FBRWYsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLDZCQUFnQixDQUFDLElBQUksRUFDckIsY0FBYyxFQUNkLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLGNBQXNCLEVBQ3RCLGVBQXVCLEVBQ3ZCLHNCQUE4QixFQUM5QixVQUFrQixFQUNsQiw4QkFBdUMsRUFDdkMsaUJBQXFDLEVBQ3JDLE1BQWU7UUFFZixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FDbkMsNkJBQWdCLENBQUMsTUFBTSxFQUN2QixjQUFjLEVBQ2QsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsOEJBQThCLEVBQzlCLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFzQixFQUFFLE1BQWU7UUFDcEUsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLDZCQUFnQixDQUFDLEtBQUssRUFDdEIsY0FBYyxFQUNkLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFDRCxhQUFhO0lBRWIsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixVQUFrQixFQUNsQixPQUFzQyxFQUN0QyxNQUFlO1FBRWYsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBQSxrREFBeUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxRQUFnRSxFQUNoRSxPQUFzQztRQUV0QyxPQUFPLFFBQVEsQ0FBQyxtQ0FBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixVQUFrQixFQUNsQixPQUFzQztRQUV0QyxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFBLGtEQUF5QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVELEtBQUssQ0FBQywrQkFBK0IsQ0FDbkMsUUFBZ0UsRUFDaEUsT0FBc0M7UUFFdEMsT0FBTyxRQUFRLENBQUMsbUNBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGFBQWE7SUFFYiwwQkFBMEI7SUFFMUI7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUF3QjtRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLHVCQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFrQztRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLHVCQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUMzQixNQUFxRCxFQUNyRCxXQUF3QjtRQUV4QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdkQsTUFBTSxTQUFTLEdBQ2IsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVE7WUFDbEMsQ0FBQyxDQUFDLE1BQU0sSUFBQSxxQkFBWSxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbEYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFFdkIsSUFBSSxpQkFBaUIsQ0FBQztRQUN0QixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGFBQWEsQ0FBQztRQUNsQix3RkFBd0Y7UUFDeEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN0RixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pILElBQUEsZ0JBQU0sRUFBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUUxRCxJQUFJLFdBQVcsS0FBSyx1QkFBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNwRyxNQUFNLFVBQVUsR0FDZCxTQUFTLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEcsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztZQUMvRCxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQztZQUMzQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsZUFBZSxJQUFJLGlCQUFpQixFQUFFO2dCQUN0RSxRQUFRLEVBQUUsSUFBQSx5Q0FBd0IsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4RixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTthQUN2QyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztZQUNwRyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUN6RCxJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUNuRSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDO1lBQy9ELGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsT0FBTyxLQUFLLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsOEJBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw4QkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDaEgsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsNkJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0YsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTNDLDZFQUE2RTtRQUM3RSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBQSxzQ0FBeUIsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9GLElBQUksZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDOUMsSUFBSSxDQUFDLEtBQUssRUFDVixTQUFTLENBQUMsUUFBUSxFQUNsQixTQUFTLENBQUMsV0FBVyxFQUNyQixDQUFDLG9CQUFvQixDQUFDLEVBQ3RCLFdBQVcsRUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixVQUFVLENBQUMsU0FBUyxFQUNwQixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFFM0csTUFBTSxnQkFBZ0IsR0FDcEIsV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRTtZQUM1QixDQUFDLENBQUMsZUFBZSxDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1lBQ2xELENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUVuRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsK0JBQXNCLEVBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JHLE1BQU0saUNBQWlDLEdBQUcsSUFBQSx3QkFBZSxFQUN2RCxtREFBb0MsRUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDcEMsNERBQTRELENBQzdELENBQUM7UUFFRixJQUFJLGlDQUFpQyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLGlDQUFpQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWpILDZFQUE2RTtRQUM3RSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFckQsNkVBQTZFO1FBQzdFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakcsZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDMUMsSUFBSSxDQUFDLEtBQUssRUFDVixTQUFTLENBQUMsUUFBUSxFQUNsQixTQUFTLENBQUMsV0FBVyxFQUNyQixDQUFDLHNCQUFzQixDQUFDLEVBQ3hCLFdBQVcsRUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixVQUFVLENBQUMsU0FBUyxFQUNwQixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFFM0csTUFBTSx3QkFBd0IsR0FDNUIsV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRTtZQUM1QixDQUFDLENBQUMsZUFBZSxDQUFDLFlBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1lBQ2xELENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUVuRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsK0JBQXNCLEVBQUMsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzdHLE1BQU0saUNBQWlDLEdBQUcsSUFBQSx3QkFBZSxFQUN2RCxtREFBb0MsRUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDcEMsNERBQTRELENBQzdELENBQUM7UUFFRixJQUFJLGlDQUFpQyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLGlDQUFpQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWpILDZFQUE2RTtRQUM3RSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFckQsNkVBQTZFO1FBQzdFLG9FQUFvRTtRQUNwRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBQSx3Q0FBMkIsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDaEQsSUFBSSxDQUFDLEtBQUssRUFDVixTQUFTLENBQUMsUUFBUSxFQUNsQixTQUFTLENBQUMsV0FBVyxFQUNyQixDQUFDLG9CQUFvQixDQUFDLEVBQ3RCLFdBQVcsRUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixVQUFVLENBQUMsU0FBUyxFQUNwQixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxTQUFTLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFFekcsT0FBTyxJQUFBLHNCQUFhLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsYUFBYTtJQUViLDBCQUEwQjtJQUUxQiw0QkFBNEI7SUFDNUIsS0FBSyxDQUFDLDhCQUE4QixDQUFDLE1BTXBDO1FBSUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNuRyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLDZCQUFnQixDQUFDLElBQUksQ0FBQztRQUV4RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNuSCxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRSxJQUFJLElBQUEsOENBQStCLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLElBQUEsc0NBQXVCLEVBQUMsY0FBYyxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLGNBQWMsR0FBRyxNQUFNLHNCQUFRLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVsRixNQUFNLEdBQUcsR0FBRyxJQUFJLHlCQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXBELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLHNCQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFN0YsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUM1QixhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMzRCxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxjQUFjO1lBQ3JCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsS0FBSyxFQUFFLEdBQUcsZUFBZSxDQUFDLDJCQUEyQixJQUFJLE9BQU8sRUFBRTtZQUNsRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsYUFBYTtJQUViLHNCQUFzQjtJQUN0QixLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFLOUI7UUFNQyxNQUFNLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDbEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQzFFLFNBQVMsRUFDVCwwQ0FBMEMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBRWpELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdEYsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFLGNBQWMsRUFBRSw2QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUEsc0NBQXlCLEVBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDaEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUUzQyxNQUFNLEtBQUssR0FBRyxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUEsd0JBQVksRUFBQyxZQUFZLENBQUMsQ0FBQztRQUN2RSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDO2dCQUNILE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUNsRCxjQUFjLEVBQ2QsR0FBRyxlQUFlLENBQUMsNEJBQTRCLElBQUksS0FBSyxFQUFFLENBQzNELENBQUM7Z0JBQ0YsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQ2xELFVBQVUsQ0FBQyxVQUFVLEVBQ3JCLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRSxDQUMzRCxDQUFDO2dCQUNGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztZQUNqRyxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxjQUFjO1lBQ3JCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsS0FBSyxFQUFFLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRTtZQUNqRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUUsVUFBVSxDQUFDLFVBQVU7WUFDNUIsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQixLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsNEJBQTRCLElBQUksS0FBSyxFQUFFO1lBQ2pFLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO0lBQ2pHLENBQUM7SUFDRCxhQUFhO0lBRWIsc0JBQXNCO0lBQ3RCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxNQU05QjtRQUlDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFbEgsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQzFFLFNBQVMsRUFDVCwwQ0FBMEMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBRWpELE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQVksRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQ3RFLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxlQUFlLENBQUMsNEJBQTRCLENBQzdDLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBQzVDLElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDaEgsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUN4RCxJQUFBLGdCQUFNLEVBQUMsZUFBZSxFQUFFLCtDQUErQyxDQUFDLENBQUM7UUFFekUsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLCtCQUFzQixFQUFDLGVBQWUsRUFBRSw4QkFBa0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDNUcsTUFBTSxpQ0FBaUMsR0FBRyxJQUFBLHdCQUFlLEVBQ3ZELG1EQUFvQyxFQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUNwQyw0REFBNEQsQ0FDN0QsQ0FBQztRQUVGLElBQUksaUNBQWlDLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUEsc0NBQXlCLEVBQUMsaUNBQWlDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFaEcsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsUUFBUSxFQUFFLGdCQUFnQjtTQUMzQixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBR3ZFLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFXLENBQUMsR0FBRyxDQUFDLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBaUM7WUFDN0MsSUFBSSxFQUFFLDZCQUFnQixDQUFDLElBQUk7WUFDM0IsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQy9ELENBQUM7UUFFRixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLHVEQUF1RCxDQUFDLENBQUM7UUFFMUUsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUEsc0NBQXlCLEVBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDaEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDakUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQztnQkFDSCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEQsY0FBYyxFQUNkLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRSxDQUMzRCxDQUFDO2dCQUNGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1lBQzFELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdEQsS0FBSyxFQUFFLGNBQWM7WUFDckIsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQixLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsNEJBQTRCLElBQUksS0FBSyxFQUFFO1lBQ2pFLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUNELGFBQWE7SUFFYixzQkFBc0I7SUFDdEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BTTlCO1FBR0MsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVsSCxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FDMUUsU0FBUyxFQUNULDBDQUEwQyxDQUMzQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxXQUFXLElBQUksY0FBYyxFQUFFLENBQUM7UUFFakQsTUFBTSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FDdEUsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLGVBQWUsQ0FBQyw0QkFBNEIsQ0FDN0MsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7UUFDNUMsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztRQUNoSCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ3hELElBQUEsZ0JBQU0sRUFBQyxlQUFlLEVBQUUsK0NBQStDLENBQUMsQ0FBQztRQUV6RSxNQUFNLGtCQUFrQixHQUFHLElBQUEsK0JBQXNCLEVBQUMsZUFBZSxFQUFFLDhCQUFrQixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU1RyxNQUFNLGlDQUFpQyxHQUFHLElBQUEsd0JBQWUsRUFDdkQsbURBQW9DLEVBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3BDLDREQUE0RCxDQUM3RCxDQUFDO1FBRUYsSUFBSSxpQ0FBaUMsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBQSxzQ0FBeUIsRUFBQyxpQ0FBaUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxlQUFlLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVoRyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdEQsS0FBSyxFQUFFLHNCQUFzQjtZQUM3QixRQUFRLEVBQUUsZ0JBQWdCO1NBQzNCLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FHdkUsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFpQztZQUM3QyxJQUFJLEVBQUUsNkJBQWdCLENBQUMsSUFBSTtZQUMzQixPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLElBQUEsZ0JBQU0sRUFBQyxRQUFRLEVBQUUsdURBQXVELENBQUMsQ0FBQztRQUUxRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBQSx3Q0FBMkIsRUFBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELGFBQWE7SUFFYixrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLG9DQUFvQyxDQUN4QyxNQUF1QyxFQUN2Qyw4Q0FBK0YsRUFDL0YsOENBQStGLEVBQy9GLDhDQUErRixFQUMvRixjQUEyQix1QkFBVyxDQUFDLEVBQUU7UUFFekMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFcEMsaURBQWlEO1FBQ2pELElBQUEsZ0JBQU0sRUFDSixXQUFXLEtBQUssdUJBQVcsQ0FBQyxFQUFFLEVBQzlCLGtFQUFrRSxHQUFHLFdBQVcsQ0FDakYsQ0FBQztRQUVGLElBQUksaUJBQTRCLENBQUM7UUFDakMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxpQkFBaUIsR0FBRyxNQUFNLElBQUEscUJBQVksRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pGLENBQUM7YUFBTSxDQUFDO1lBQ04saUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUMvRCxJQUFJLEVBQ0osS0FBSyxFQUNMLGlCQUFpQixDQUFDLFlBQVksRUFDOUIsSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELFVBQVU7UUFDVixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLEdBQzNGLE1BQU0sOENBQThDLENBQUMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDaEQsSUFBSSxDQUFDLEtBQUssRUFDVixpQkFBaUIsQ0FBQyxRQUFRLEVBQzFCLGlCQUFpQixDQUFDLFdBQVcsRUFDN0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUN0QixXQUFXLEVBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFDL0IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQ2pDLEtBQUssQ0FDTixDQUFDO1FBRUYsVUFBVTtRQUNWLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sOENBQThDLENBQUM7WUFDNUcsU0FBUyxFQUFFLGVBQWU7WUFDMUIsc0JBQXNCO1lBQ3RCLHNCQUFzQjtZQUN0QixpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFBLDZCQUFvQixFQUNoRCxJQUFJLENBQUMsS0FBSyxFQUNWLGlCQUFpQixDQUFDLFFBQVEsRUFDMUIsaUJBQWlCLENBQUMsV0FBVyxFQUM3QixDQUFDLG9CQUFvQixDQUFDLEVBQ3RCLFdBQVcsRUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFDakMsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQ0osZUFBZSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFDL0UsK0NBQStDLENBQ2hELENBQUM7UUFFRixVQUFVO1FBQ1YsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsTUFBTSw4Q0FBOEMsQ0FBQztZQUNwRixTQUFTLEVBQUUsZUFBZTtZQUMxQixzQkFBc0I7WUFDdEIsc0JBQXNCO1lBQ3RCLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRTtTQUM3QyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUEsNkJBQW9CLEVBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQ1YsaUJBQWlCLENBQUMsUUFBUSxFQUMxQixpQkFBaUIsQ0FBQyxXQUFXLEVBQzdCLENBQUMsb0JBQW9CLENBQUMsRUFDdEIsV0FBVyxFQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQy9CLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxLQUFLLENBQ04sQ0FBQztRQUVGLE9BQU8sSUFBQSxzQkFBYSxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUNELGFBQWE7SUFFYixtQkFBbUI7SUFFbkIsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLE1BQWtFO1FBSXhHLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxpQ0FBeUIsR0FBRSxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLGdDQUFnQyxDQUN2RSxNQUFNLENBQUMsaUJBQWlCLEVBQ3hCLDZCQUFnQixDQUFDLElBQUksRUFDckIsR0FBRyxDQUNKLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FDekUsTUFBTSxDQUFDLG1CQUFtQixFQUMxQiw2QkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLEdBQUcsQ0FDSixDQUFDO1FBRUYsSUFBQSxnQkFBTSxFQUNKLGdCQUFnQixDQUFDLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVLEVBQzdELHVFQUF1RSxDQUN4RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUNKLGdCQUFnQixDQUFDLFNBQVMsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTLEVBQzNELDZEQUE2RCxDQUM5RCxDQUFDO1FBRUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FDN0Msa0JBQTBCLEVBQzFCLGVBQWdFLEVBQ2hFLEdBQTBEO1FBRTFELE1BQU0sZUFBZSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDeEUsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUNwRSxJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRTlFLElBQUksTUFBTSxDQUFDO1FBQ1gsUUFBUSxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLDZCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUMsWUFBWSxFQUFFLDhDQUE4QyxDQUFDLENBQUM7Z0JBQ3JGLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7b0JBQzlDLGVBQWUsQ0FBQyxXQUFXO29CQUMzQixlQUFlLENBQUMsWUFBWTtpQkFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDVixNQUFNO1lBQ1IsS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNO2dCQUMxQixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFO29CQUM5QyxlQUFlLENBQUMsV0FBVztvQkFDM0IsZUFBZSxDQUFDLFVBQVU7aUJBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ1YsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNmLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztJQUNKLENBQUM7O0FBeGpDSCwwQ0EyakNDO0FBMWpDeUIsNENBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFDOUQsNENBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFDOUQsNENBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFDOUQsMkNBQTJCLEdBQUcsNkJBQTZCLENBQUM7QUF5akN0Rjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFNBQWlCO0lBQ2hELElBQUksQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFDRSxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxLQUFLLFFBQVE7WUFDbkMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBSyxRQUFRO1lBQ3JDLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsRUFDaEYsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asd0JBQXdCO0lBQzFCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFTSxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLGlCQUF5QixFQUN6QixnQkFBd0IsRUFDeEIsS0FBaUI7SUFFakIsTUFBTSxTQUFTLEdBQUcsS0FBSztRQUNyQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQy9FLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdEQsT0FBTyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0ksS0FBSyxVQUFVLDRDQUE0QyxDQUNoRSxnQkFBd0IsRUFDeEIsa0JBQTBCLEVBQzFCLGdCQUF5QixFQUN6QixLQUFpQjtJQUVqQixNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsWUFBb0IsRUFBMEMsRUFBRTtRQUN2RixNQUFNLFNBQVMsR0FBRyxLQUFLO1lBQ3JCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksT0FBc0MsQ0FBQztRQUMzQyxJQUFJLENBQUM7WUFDSCxPQUFPLEdBQUcsc0JBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLElBQUksS0FBSyxDQUNiLG1LQUFtSyxDQUNwSyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4RixNQUFNLElBQUksS0FBSyxDQUNiLHNKQUFzSixDQUN2SixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJILE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0UsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pGLElBQUksYUFBYSxLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTztRQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDL0MsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUNuRCxjQUFjLEVBQUUsT0FBTyxHQUFHLGFBQWE7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE9BQWUsRUFDZixjQUFzQixFQUN0QixZQUFvQixFQUNwQixjQUFzQixFQUN0QixjQUFzQjtJQUV0QixNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFXLENBQUMsR0FBRyxDQUFDLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsNkJBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLHFCQUFPLENBQUMsZ0JBQWdCLENBQy9DLENBQUMsRUFDRCxPQUFPLEVBQ1AsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsT0FBTyxFQUNQLGNBQWMsQ0FDZixDQUFXLENBQUM7SUFFYiwwRUFBMEU7SUFDMUUsdURBQXVEO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxpQ0FBeUIsR0FBRSxDQUFDO0lBQzlDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0UsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV4RSxNQUFNLFFBQVEsR0FBRyxpQkFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3BILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVNEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxPQUFlLEVBQ2YsZ0JBQXdCLEVBQ3hCLEtBQWlCO0lBRWpCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLElBQUksU0FBaUIsQ0FBQztJQUN0QixJQUFJLENBQUM7UUFDSCxTQUFTLEdBQUcsS0FBSztZQUNmLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsT0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsd0JBQXdCLENBQUMsTUFROUM7SUFDQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLDRDQUE0QyxDQUN6RyxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxTQUFTLEVBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ0YsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNySCxDQUFDO0FBRVksUUFBQSwyQkFBMkIsR0FBRztJQUN6QywyQkFBMkI7SUFDM0IsNENBQTRDO0lBQzVDLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0NBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5DYWxsYmFja3MgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQvaVdhbGxldHMnO1xuaW1wb3J0IHsgZWQyNTUxOSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOSc7XG5pbXBvcnQgeyBFZGRzYU1QU0RrZywgRWRkc2FNUFNEc2csIE1QU0NvbW1zLCBNUFNUeXBlcywgTVBTVXRpbCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSwgV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCB7IGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcsIGlzQml0Z29FZGRzYU1wY3YyUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2JpdGdvUHViS2V5cyc7XG5pbXBvcnQgeyBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlLCBnZXRUeFJlcXVlc3QsIHNlbmRTaWduYXR1cmVTaGFyZVYyLCBzZW5kVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi8uLi9jb2RlY3MnO1xuaW1wb3J0IHtcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlLFxuICB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lLFxuICB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvLFxufSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2FNUEN2Mic7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VkZHNhL2VkZHNhJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi4vZWNkc2EvdHlwZXNNUEN2Mic7XG5pbXBvcnQge1xuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBSZXF1ZXN0VHlwZSxcbiAgU2lnbmF0dXJlU2hhcmVSZWNvcmQsXG4gIFNpZ25hdHVyZVNoYXJlVHlwZSxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHhSZXF1ZXN0LFxuICBpc1YyRW52ZWxvcGUsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBFbmNyeXB0aW9uVmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgQmFzZUVkZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gZnJvbSAnLi4vcmVjaXBpZW50VXRpbHMnO1xuaW1wb3J0IHsgRWRkc2FNUEN2MktleUdlblNlbmRGbiwgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSB9IGZyb20gJy4vZWRkc2FNUEN2MktleUdlblNlbmRlcic7XG5pbXBvcnQgeyBFZGRzYU1QQ3YyUmVjb3ZlcnlLZXlTaGFyZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNpZ25pbmdNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5cbmV4cG9ydCBjbGFzcyBFZGRzYU1QQ3YyVXRpbHMgZXh0ZW5kcyBCYXNlRWRkc2FVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVkgPSAnTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19ES0dfS0VZR0VOX1JPVU5EMV9TVEFURSA9ICdNUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEUnO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uO1xuICAgIC8vIFdhbGxldCBTYWZlcyB2MSAoQGV4cGVyaW1lbnRhbCk6IHRhZ3MgdGhlIHJlc3VsdGluZyB1c2VyL2JhY2t1cC9iaXRnbyByb290IGtleXMgd2l0aCB0aGlzIHNhZmUuXG4gICAgc2FmZUlkPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgdXNlcktleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlcktleVBhaXIucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCB1c2VyR3BnUHVibGljS2V5ID0gdXNlcktleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFt1c2VyUGssIHVzZXJTa10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIodXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYmFja3VwS2V5UGFpci5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IGJhY2t1cEdwZ1B1YmxpY0tleSA9IGJhY2t1cEtleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFtiYWNrdXBQaywgYmFja3VwU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGJhY2t1cEdwZ0tleSk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIEVkRFNBIE1QQ3YyIHB1YmxpYyBrZXkgKGVkMjU1MTkpLiBVc2luZyB0aGUgZGVmYXVsdCBtcGN2MlB1YmxpY0tleSAoc2VjcDI1NmsxKVxuICAgIC8vIGhlcmUgd291bGQgY2F1c2UgYSBXQVNNIFwiSW52YWxpZCBJbnB1dFwiIGVycm9yLCBzbyB3ZSByZXF1aXJlIHRoZSBkZWRpY2F0ZWQgZWRkc2FNcGN2MlB1YmxpY0tleS5cbiAgICBjb25zdCB7IGVkZHNhTXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KGJpdGdvUHVibGljR3BnS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCA9IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXlPYmogPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCB9KTtcbiAgICBjb25zdCBiaXRnb1BrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYml0Z29LZXlPYmopO1xuXG4gICAgLy8gQ3JlYXRlIERLRyBzZXNzaW9ucyBmb3IgdXNlciAocGFydHkgMCkgYW5kIGJhY2t1cCAocGFydHkgMSlcbiAgICBjb25zdCB1c2VyRGtnID0gbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGNvbnN0IGJhY2t1cERrZyA9IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gICAgYXdhaXQgdXNlckRrZy5pbml0RGtnKHVzZXJTaywgW2JhY2t1cFBrLCBiaXRnb1BrXSk7XG4gICAgYXdhaXQgYmFja3VwRGtnLmluaXREa2coYmFja3VwU2ssIFt1c2VyUGssIGJpdGdvUGtdKTtcblxuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gYmFja3VwRGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMS5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzEucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHtcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgICB1c2VyTXNnMTogdXNlclNpZ25lZE1zZzEsXG4gICAgICAgIGJhY2t1cE1zZzE6IGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgICB9LFxuICAgICAgcGFyYW1zLnNhZmVJZFxuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29SYXdNc2cxQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMSwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMTogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzFCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMSwgYmFja3VwTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJNc2dzID0gdXNlckRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDJNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQxTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJSb3VuZDJNc2dzLmxlbmd0aCA9PT0gMSwgJ1VzZXIgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdCYWNrdXAgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcblxuICAgIGNvbnN0IHVzZXJNc2cyID0gdXNlclJvdW5kMk1zZ3NbMF07XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IGJhY2t1cFJvdW5kMk1zZ3NbMF07XG5cbiAgICBjb25zdCB1c2VyU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cyLnBheWxvYWQpLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBiYWNrdXBTaWduZWRNc2cyID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYmFja3VwTXNnMi5wYXlsb2FkKSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICBiaXRnb01zZzIsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cE1zZzI6IGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBrZXljaGFpbiBjcmVhdGlvblxuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIHJvdW5kIDIgc2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBiaXRnb1Jhd01zZzJCeXRlcyA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoYml0Z29Nc2cyLCBiaXRnb0tleU9iaik7XG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJpdGdvUmF3TXNnMkJ5dGVzKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXM6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzID0gW3VzZXJNc2cyLCBiYWNrdXBNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdO1xuXG4gICAgY29uc3QgdXNlckZpbmFsTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDJNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwRmluYWxNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgdXNlcicpO1xuICAgIGFzc2VydChiYWNrdXBGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgYmFja3VwJyk7XG5cbiAgICBjb25zdCB1c2VyQ29tbW9uS2V5Y2hhaW4gPSB1c2VyRGtnLmdldENvbW1vbktleWNoYWluKCk7XG4gICAgY29uc3QgYmFja3VwQ29tbW9uS2V5Y2hhaW4gPSBiYWNrdXBEa2cuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcblxuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgJ1VzZXIgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgYmFja3VwQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdCYWNrdXAgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgcGFyYW1zLnNhZmVJZFxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgIGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgYmFja3VwUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCaXRnb0tleWNoYWluKHVzZXJDb21tb25LZXljaGFpbiwgcGFyYW1zLnNhZmVJZCk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHBhcmFtczoge1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBjYWxsYmFja3M6IEVkZHNhTVBDdjJLZXlHZW5DYWxsYmFja3M7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBlZGRzYU1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhlbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KGJpdGdvUHVibGljR3BnS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCA9IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCksICdJbnZhbGlkIEJpdEdvIEVkRFNBIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgLy8gUm91bmQgMDogYm90aCBwYXJ0aWVzIGdlbmVyYXRlIEdQRyBrZXlzXG4gICAgY29uc3QgeyB1c2VyR3BnUHVibGljS2V5LCBiYWNrdXBHcGdQdWJsaWNLZXksIHVzZXJTdGF0ZSwgYmFja3VwU3RhdGUgfSA9IGF3YWl0IGNhbGxiYWNrcy5pbml0aWFsaXplQ2FsbGJhY2soe1xuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcblxuICAgIC8vIFJvdW5kIDE6IGJvdGggcGFydGllcyBydW4gREtHIHJvdW5kIDFcbiAgICBjb25zdCB7XG4gICAgICB1c2VyU2lnbmVkTXNnMSxcbiAgICAgIGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMSxcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMSxcbiAgICB9ID0gYXdhaXQgY2FsbGJhY2tzLnJvdW5kMUNhbGxiYWNrKHtcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQsXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlclN0YXRlLFxuICAgICAgYmFja3VwU3RhdGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKGVudGVycHJpc2UsIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBNc2cxOiBiYWNrdXBTaWduZWRNc2cxLFxuICAgIH0pO1xuXG4gICAgLy8gUm91bmQgMjogYm90aCBwYXJ0aWVzIHJ1biBES0cgcm91bmQgMlxuICAgIGNvbnN0IHtcbiAgICAgIHVzZXJTaWduZWRNc2cyLFxuICAgICAgYmFja3VwU2lnbmVkTXNnMixcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIyLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIyLFxuICAgIH0gPSBhd2FpdCBjYWxsYmFja3Mucm91bmQyQ2FsbGJhY2soe1xuICAgICAgYml0Z29Nc2cxLFxuICAgICAgdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjEsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjEsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgYml0Z29Nc2cyLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKGVudGVycHJpc2UsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cE1zZzI6IGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgcm91bmQgMiBzZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIC8vIEZpbmFsaXplOiBib3RoIHBhcnRpZXMgdmVyaWZ5IGFuZCBkZXJpdmUgdGhlIGNvbW1vbiBrZXljaGFpblxuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4gfSA9IGF3YWl0IGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrKHtcbiAgICAgIGJpdGdvTXNnMixcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMixcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMixcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tbW9uS2V5Y2hhaW4sIGJpdGdvQ29tbW9uS2V5Y2hhaW4sICdDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBrZXljaGFpbnMuYWRkKHsgc291cmNlOiAndXNlcicsIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsIGNvbW1vbktleWNoYWluLCBpc01QQ3YyOiB0cnVlIH0pLFxuICAgICAga2V5Y2hhaW5zLmFkZCh7IHNvdXJjZTogJ2JhY2t1cCcsIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsIGNvbW1vbktleWNoYWluLCBpc01QQ3YyOiB0cnVlIH0pLFxuICAgICAgdGhpcy5hZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluKSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmcsXG4gICAgc2FmZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByaXZhdGVNYXRlcmlhbEJhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChwYXJ0aWNpcGFudEluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIHNvdXJjZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/ICd1c2VyJyA6ICdiYWNrdXAnO1xuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0ID0gcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRW5jcnlwdHMgdGhlIENCT1ItZW5jb2RlZCBSZWR1Y2VkS2V5U2hhcmUgKHdoaWNoIGNvbnRhaW5zIHRoZSBwYXJ0eSdzIHB1YmxpY1xuICAgICAgICAvLyBrZXkpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2Yga2V5IG1hdGVyaWFsXG4gICAgICAgIC8vIGJleW9uZCB0aGUgc2VydmVyLXN0b3JlZCBlbmNyeXB0ZWRQcnYuXG4gICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIC8vIEJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgY2FuIG5vdCBiZSB1c2VkIGhlcmUgYXMgaXQgZG9lcyBub3Qgd29yayBvbiB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICBpbnB1dDogYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgICAgc291cmNlID0gJ2JpdGdvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICAgIHNhZmVJZCxcbiAgICB9O1xuXG4gICAgaWYgKHdlYmF1dGhuSW5mbyAmJiBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0KSB7XG4gICAgICAvLyBTZW5kIHRoZSBwYXNza2V5IGFzIGB3ZWJhdXRobkluZm9gOyB0aGUgZGVwcmVjYXRlZCBgd2ViYXV0aG5EZXZpY2VzYCBhcnJheSBpcyBpZ25vcmVkIGJ5IFBPU1QgL2tleS5cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCB0byBhdHRhY2ggYSB3ZWJhdXRobiBkZXZpY2UgdG8gdGhlIHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIGtleWNoYWluUGFyYW1zLndlYmF1dGhuSW5mbyA9IHtcbiAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgIHBhc3N3b3JkOiB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSksXG4gICAgICAgIGVudGVycHJpc2VJZDogZW50ZXJwcmlzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICByZXR1cm4geyAuLi4oYXdhaXQga2V5Y2hhaW5zLmFkZChrZXljaGFpblBhcmFtcykpLCByZWR1Y2VkRW5jcnlwdGVkUHJ2IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFVzZXJLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBzYWZlSWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCYWNrdXBLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgc2FmZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzYWZlSWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcsIHNhZmVJZD86IHN0cmluZyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgc2FmZUlkXG4gICAgKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0LFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlLCBzYWZlSWQpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm48RWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjEnXSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMihcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSksIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWRkc2FNUEN2MktleUdlblNlbmRGbjxFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+LFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMiddLCBwYXlsb2FkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHNpZ24gdHggcmVxdWVzdFxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHBhcmFtczogVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGwgMy1yb3VuZCBFZERTQSBNUEN2MiAoTVBTKSBvbmxpbmUgc2lnbmluZyBvcmNoZXN0cmF0aW9uLlxuICAgKlxuICAgKiBQcm90b2NvbCBvdmVydmlldzpcbiAgICogICBXQVNNIFJvdW5kIDAgIOKGkiBnZXRGaXJzdE1lc3NhZ2UoKSAgICAgIChwcm9kdWNlcyB1c2VyTXNnMSlcbiAgICogICBBUEkgIFJvdW5kIDEgIOKGkiBzZW5kIHVzZXJNc2cxIC8gcmVjdiBiaXRnb01zZzFcbiAgICogICBXQVNNIFJvdW5kIDEgIOKGkiBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29Nc2cxXSkgIChwcm9kdWNlcyB1c2VyTXNnMilcbiAgICogICBBUEkgIFJvdW5kIDIgIOKGkiBzZW5kIHVzZXJNc2cyIC8gcmVjdiBiaXRnb01zZzJcbiAgICogICBXQVNNIFJvdW5kIDIgIOKGkiBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29Nc2cyXSkgIChwcm9kdWNlcyB1c2VyTXNnMylcbiAgICogICBBUEkgIFJvdW5kIDMgIOKGkiBzZW5kIHVzZXJNc2czIChXUCBmaW5hbGlzZXM7IG5vIEJpdEdvIG1zZyByZXR1cm5lZCB0byBjbGllbnQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25SZXF1ZXN0QmFzZShcbiAgICBwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYgfCBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGVcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwYXJhbXMucHJ2LCAnYmFzZTY0Jyk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9XG4gICAgICB0eXBlb2YgcGFyYW1zLnR4UmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgcGFyYW1zLnR4UmVxdWVzdCwgcGFyYW1zLnJlcUlkKVxuICAgICAgICA6IHBhcmFtcy50eFJlcXVlc3Q7XG5cbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIC8vIE9uZSBmcmVzaCBlZDI1NTE5IEdQRyBrZXkgcGFpciBwZXIgc2lnbmluZyBzZXNzaW9uLCByZXVzZWQgYWNyb3NzIGFsbCBzaWduaW5nIHJvdW5kcy5cbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyh0cnVlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdC5lbnRlcnByaXNlSWQsIHRydWUpO1xuICAgIGFzc2VydChiaXRnb0dwZ1B1YktleSwgJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IHR4UmVxdWVzdC51bnNpZ25lZFR4cywgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4cyFbMF07XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHVuc2lnbmVkVHguc2lnbmFibGVIZXg7XG4gICAgICBhc3NlcnQodHhPck1lc3NhZ2VUb1NpZ24sICdNaXNzaW5nIHNpZ25hYmxlSGV4IGluIHVuc2lnbmVkVHgnKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4ID8/IHR4T3JNZXNzYWdlVG9TaWduIH0sXG4gICAgICAgIHR4UGFyYW1zOiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCBwYXJhbXMudHhQYXJhbXMsIHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKSksXG4gICAgICAgIHdhbGxldDogdGhpcy53YWxsZXQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZSgpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUubWVzc2FnZSkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC5tZXNzYWdlcyAmJiB0eFJlcXVlc3QubWVzc2FnZXMubGVuZ3RoID4gMCwgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHR4UmVxdWVzdCcpO1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB0eFJlcXVlc3QubWVzc2FnZXNbMF0ubWVzc2FnZUVuY29kZWQ7XG4gICAgICBhc3NlcnQodHhPck1lc3NhZ2VUb1NpZ24sICdNaXNzaW5nIG1lc3NhZ2VFbmNvZGVkIGluIG1lc3NhZ2VzWzBdJyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJztcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBwYXJ0eUlkID0gcGFyYW1zLm1wY3YyUGFydHlJZCA/PyBNUEN2MlBhcnRpZXNFbnVtLlVTRVI7XG4gICAgY29uc3Qgc2lnbmVyU2hhcmVUeXBlID0gcGFydHlJZCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIgOiBTaWduYXR1cmVTaGFyZVR5cGUuQkFDS1VQO1xuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKHBhcnR5SWQpO1xuICAgIGF3YWl0IHVzZXJEc2cuaW5pdERzZyh1c2VyS2V5U2hhcmUsIGJ1ZmZlckNvbnRlbnQsIGRlcml2YXRpb25QYXRoLCBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHVzZXJEc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKHVzZXJNc2cxLCB1c2VyR3BnUHJ2S2V5LCBwYXJ0eUlkKTtcbiAgICBsZXQgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IG9iamVjdCBhZnRlciByb3VuZCAxJyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMxID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kT25lID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZShzaWduYXR1cmVTaGFyZXMxLCBzaWduZXJTaGFyZVR5cGUsICdyb3VuZDFPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZE9uZS5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsIGJpdGdvR3BnUHViS2V5KTtcblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgW3VzZXJNc2cyXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV0pO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1dBU00gcm91bmQgMSBwcm9kdWNlZCBubyBtZXNzYWdlJyk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZFR3byA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28odXNlck1zZzIsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGxhdGVzdFR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kVHdvXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IG9iamVjdCBhZnRlciByb3VuZCAyJyk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRUd28gPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlcywgc2lnbmVyU2hhcmVUeXBlLCAncm91bmQyT3V0cHV0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRUd28uc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMiA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28ocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLCBiaXRnb0dwZ1B1YktleSk7XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IFt1c2VyTXNnM10gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdKTtcbiAgICBhc3NlcnQodXNlck1zZzMsICdXQVNNIHJvdW5kIDIgcHJvZHVjZWQgbm8gbWVzc2FnZScpO1xuXG4gICAgLy8g4pSA4pSAIEFQSSBSb3VuZCAzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIE5vIEJpdEdvIHJlc3BvbnNlIHRvIHZlcmlmeTsgV1AgZmluYWxpc2VzIHRoZSBzaWduaW5nIHNlcnZlci1zaWRlXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDMgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUodXNlck1zZzMsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGNvbnN0IHJvdW5kM1R4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KHJvdW5kM1R4UmVxdWVzdD8udHhSZXF1ZXN0SWQgPT09IHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgJ0ludmFsaWQgdHhSZXF1ZXN0IG9iamVjdCBhZnRlciByb3VuZCAzJyk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3Qud2FsbGV0SWQsIHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBleHRlcm5hbCBzaWduZXJcblxuICAvLyAjcmVnaW9uIEtleUdlblJvdW5kMVNoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVLZXlHZW5Sb3VuZDFTaGFyZShwYXJhbXM6IHtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGJpdGdvR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgY291bnRlclBhcnR5R3BnUHViS2V5OiBzdHJpbmc7XG4gICAgcGFydHlJZD86IE1QQ3YyUGFydGllc0VudW0uVVNFUiB8IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmVkTXNnMTogTVBTVHlwZXMuTVBTU2lnbmVkTWVzc2FnZTtcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGJpdGdvR3BnUHViS2V5LCBjb3VudGVyUGFydHlHcGdQdWJLZXkgfSA9IHBhcmFtcztcbiAgICBjb25zdCBwYXJ0eUlkID0gcGFyYW1zLnBhcnR5SWQgPz8gTVBDdjJQYXJ0aWVzRW51bS5VU0VSO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIGNvbnN0IGdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IGRlY3J5cHRlZEdwZ1BydktleSB9KTtcblxuICAgIGNvbnN0IFssIG93blNrXSA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5S2V5UGFpcihncGdQcnZLZXkpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvRWRkc2FNcGN2MlB1YktleShiaXRnb0dwZ1B1YktleSksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXlPYmogPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvR3BnUHViS2V5IH0pO1xuICAgIGNvbnN0IGJpdGdvUGsgPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOVB1YmxpY0tleShiaXRnb0tleU9iaik7XG5cbiAgICBjb25zdCBjb3VudGVyUGFydHlLZXlPYmogPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGNvdW50ZXJQYXJ0eUdwZ1B1YktleSB9KTtcbiAgICBjb25zdCBjb3VudGVyUGFydHlQayA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5UHVibGljS2V5KGNvdW50ZXJQYXJ0eUtleU9iaik7XG5cbiAgICBjb25zdCBka2cgPSBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIHBhcnR5SWQpO1xuICAgIGF3YWl0IGRrZy5pbml0RGtnKG93blNrLCBbY291bnRlclBhcnR5UGssIGJpdGdvUGtdKTtcblxuICAgIGNvbnN0IG1zZzEgPSBka2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gICAgY29uc3Qgc2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKG1zZzEucGF5bG9hZCksIGdwZ1BydktleSk7XG5cbiAgICBjb25zdCBzZXNzaW9uUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRrZ1Nlc3Npb246IGRrZy5nZXRTZXNzaW9uKCksXG4gICAgICBvd25Nc2dQYXlsb2FkOiBCdWZmZXIuZnJvbShtc2cxLnBheWxvYWQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIG93bk1zZ0Zyb206IG1zZzEuZnJvbSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25QYXlsb2FkLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19ES0dfS0VZR0VOX1JPVU5EMV9TVEFURX06JHtwYXJ0eUlkfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25lZE1zZzEsIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDFTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQxU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFBydj86IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQxOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICB1c2VyR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgcHJ2LCB3YWxsZXRQYXNzcGhyYXNlLCB0eFJlcXVlc3QsIGVuY3J5cHRlZFBydiB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnUHJ2S2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlckdwZ0tleS5wcml2YXRlS2V5IH0pO1xuXG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhd2FpdCB1c2VyRHNnLmluaXREc2codXNlcktleVNoYXJlLCBCdWZmZXIuZnJvbShzaWduYWJsZUhleCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aCwgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyk7XG4gICAgY29uc3QgdXNlck1zZzEgPSB1c2VyRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyTXNnMSwgdXNlckdwZ1BydktleSk7XG4gICAgY29uc3Qgc2Vzc2lvblBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTZXNzaW9uOiB1c2VyRHNnLmdldFNlc3Npb24oKSxcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlckdwZ1B1YktleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuXG4gICAgY29uc3QgdXNlVjIgPSBlbmNyeXB0ZWRQcnYgIT09IHVuZGVmaW5lZCAmJiBpc1YyRW52ZWxvcGUoZW5jcnlwdGVkUHJ2KTtcbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICBzZXNzaW9uUGF5bG9hZCxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICAgIGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25QYXlsb2FkLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQyU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMlNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMjogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VWMiA9IGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uKTtcblxuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdQcnZLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodHJhbnNhY3Rpb25zKSAmJiB0cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAndHhSZXF1ZXN0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSB0cmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAxIHR4UmVxdWVzdCcpO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kT25lID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZShzaWduYXR1cmVTaGFyZXMsIFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLCAncm91bmQxT3V0cHV0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRPbmUuc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMSA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRPbmUocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLCBiaXRnb0dwZ0tleSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlQWRhdGEoYWRhdGEsIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZHNnU2Vzc2lvbiwgdXNlck1zZ1BheWxvYWQgfSA9IEpTT04ucGFyc2UoZGVjcnlwdGVkUm91bmQxU2Vzc2lvbikgYXMge1xuICAgICAgZHNnU2Vzc2lvbjogc3RyaW5nO1xuICAgICAgdXNlck1zZ1BheWxvYWQ6IHN0cmluZztcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhd2FpdCB1c2VyRHNnLnJlc3RvcmVTZXNzaW9uKGRzZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHVzZXJNc2cxOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXNlck1zZ1BheWxvYWQsICdiYXNlNjQnKSksXG4gICAgfTtcblxuICAgIGNvbnN0IFt1c2VyTXNnMl0gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cxLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzFdKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdEU0cgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyBwcm9kdWNlZCBubyByb3VuZC0yIG91dHB1dCcpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDIgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKHVzZXJNc2cyLCB1c2VyR3BnUHJ2S2V5KTtcbiAgICBjb25zdCBzZXNzaW9uUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1Nlc3Npb246IHVzZXJEc2cuZ2V0U2Vzc2lvbigpLFxuICAgICAgdXNlck1zZ1BheWxvYWQ6IEJ1ZmZlci5mcm9tKHVzZXJNc2cyLnBheWxvYWQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9KTtcblxuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25QYXlsb2FkLFxuICAgICAgICAgIGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25QYXlsb2FkLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDNTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQzU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQzOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aChcbiAgICAgIHR4UmVxdWVzdCxcbiAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtzaWduYWJsZUhleH06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRUd28gPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDJPdXRwdXQnKTtcblxuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kVHdvLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLnR5cGUgIT09ICdyb3VuZDJPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzIgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3bywgYml0Z29HcGdLZXkpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGRzZ1Nlc3Npb24sIHVzZXJNc2dQYXlsb2FkIH0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJvdW5kMlNlc3Npb24pIGFzIHtcbiAgICAgIGRzZ1Nlc3Npb246IHN0cmluZztcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5yZXN0b3JlU2Vzc2lvbihkc2dTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHVzZXJNc2dQYXlsb2FkLCAnYmFzZTY0JykpLFxuICAgIH07XG5cbiAgICBjb25zdCBbdXNlck1zZzNdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2czLCAnRFNHIGhhbmRsZUluY29taW5nTWVzc2FnZXMgcHJvZHVjZWQgbm8gcm91bmQtMyBvdXRwdXQnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJNc2czLCB1c2VyR3BnUHJ2S2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBzaWduRWRkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgICAvLyBUT0RPKFdQLTIxNzYpOiBBZGQgc3VwcG9ydCBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAgYXNzZXJ0KFxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4LFxuICAgICAgJ09ubHkgdHJhbnNhY3Rpb24gc2lnbmluZyBpcyBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciwgZ290OiAnICsgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoXG4gICAgICB0cnVlLFxuICAgICAgcmVxSWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC5lbnRlcnByaXNlSWQsXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGlmICghYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuICAgIH1cblxuICAgIC8vIHJvdW5kIDFcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDFUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMlR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDJdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzLFxuICAgICAgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCdcbiAgICApO1xuXG4gICAgLy8gcm91bmQgM1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDJUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLCB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHJlcUlkKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiByZXRyb2ZpdFxuXG4gIGFzeW5jIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyhwYXJhbXM6IHsgbXBjdjFVc2VyS2V5U2hhcmU6IHN0cmluZzsgbXBjdjFCYWNrdXBLZXlTaGFyZTogc3RyaW5nIH0pOiBQcm9taXNlPHtcbiAgICB1c2VyUmV0cm9maXREYXRhOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YTtcbiAgICBiYWNrdXBSZXRyb2ZpdERhdGE6IE1QU1R5cGVzLkVkZHNhUmV0cm9maXREYXRhO1xuICB9PiB7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHVzZXJSZXRyb2ZpdERhdGEgPSBFZGRzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoXG4gICAgICBwYXJhbXMubXBjdjFVc2VyS2V5U2hhcmUsXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBNUENcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cFJldHJvZml0RGF0YSA9IEVkZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShcbiAgICAgIHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlLFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBNUENcbiAgICApO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgdXNlclJldHJvZml0RGF0YS5leHBlY3RlZFBrID09PSBiYWNrdXBSZXRyb2ZpdERhdGEuZXhwZWN0ZWRQayxcbiAgICAgICdNUEN2MSB1c2VyIGFuZCBiYWNrdXAga2V5cyBjb21iaW5lIHRvIGRpZmZlcmVudCBhZ2dyZWdhdGUgcHVibGljIGtleXMnXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICB1c2VyUmV0cm9maXREYXRhLmNoYWluQ29kZSA9PT0gYmFja3VwUmV0cm9maXREYXRhLmNoYWluQ29kZSxcbiAgICAgICdNUEN2MSB1c2VyIGFuZCBiYWNrdXAga2V5cyBjb21iaW5lIHRvIGRpZmZlcmVudCBjaGFpbiBjb2RlcydcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgdXNlclJldHJvZml0RGF0YSwgYmFja3VwUmV0cm9maXREYXRhIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHN0cmluZyxcbiAgICBtcGN2MVBhcnR5SW5kZXg6IE1QQ3YyUGFydGllc0VudW0uVVNFUiB8IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgIG1wYzogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlPj5cbiAgKTogTVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShtcGN2MVBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCAnTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgdVNoYXJlJyk7XG4gICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSwgJ01QQ3YxIGtleSBtYXRlcmlhbCBtaXNzaW5nIGJpdGdvWVNoYXJlJyk7XG5cbiAgICBsZXQgcFNoYXJlO1xuICAgIHN3aXRjaCAobXBjdjFQYXJ0eUluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBtaXNzaW5nIGJhY2t1cFlTaGFyZScpO1xuICAgICAgICBwU2hhcmUgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUsXG4gICAgICAgIF0pLnBTaGFyZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLnVzZXJZU2hhcmUsICdCYWNrdXAgTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgdXNlcllTaGFyZScpO1xuICAgICAgICBwU2hhcmUgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC51c2VyWVNoYXJlLFxuICAgICAgICBdKS5wU2hhcmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNfaV8wOiBwU2hhcmUudSxcbiAgICAgIGV4cGVjdGVkUGs6IHBTaGFyZS55LFxuICAgICAgY2hhaW5Db2RlOiBwU2hhcmUuY2hhaW5jb2RlLFxuICAgIH07XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG59XG5cbi8qKlxuICogRGV0ZWN0IHdoZXRoZXIgYW4gZW5jcnlwdGVkIGtleWNhcmQgY29udGFpbnMgTVBDdjEgc2lnbmluZyBtYXRlcmlhbC5cbiAqXG4gKiBEZWNyeXB0cyB0aGUga2V5Y2FyZCBhbmQgY2hlY2tzIGZvciB0aGUgSlNPTiBzaGFwZSBwcm9kdWNlZCBieSB0aGUgTVBDdjEgVFNTXG4gKiBrZXktZ2VuZXJhdGlvbiBmbG93ICh1U2hhcmUuc2VlZCArIGJpdGdvWVNoYXJlLnUgKyBiYWNrdXBZU2hhcmUudSAvIHVzZXJZU2hhcmUudSkuXG4gKiBSZXR1cm5zIGZhbHNlIGZvciBNUEN2MiBDQk9SIGtleWNhcmRzLCB3cm9uZyBwYXNzd29yZHMsIG9yIGFueSBkZWNyeXB0aW9uIGVycm9yLlxuICpcbiAqIEBwYXJhbSBlbmNyeXB0ZWRLZXlTaGFyZSBlbmNyeXB0ZWQgdXNlciBvciBiYWNrdXAga2V5Y2FyZFxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdGhlIGtleWNhcmRcbiAqIEBwYXJhbSBiaXRnbyBvcHRpb25hbCBCaXRHb0Jhc2UgaW5zdGFuY2U7IHdoZW4gcHJvdmlkZWQsIGRlY3J5cHRzIHZpYVxuICogICBiaXRnby5kZWNyeXB0IChzdXBwb3J0cyBib3RoIHYxIFNKQ0wgYW5kIHYyIEFyZ29uMmlkIGVudmVsb3Blcyk7XG4gKiAgIHdoZW4gYWJzZW50LCBmYWxscyBiYWNrIHRvIHNqY2wuZGVjcnlwdCAodjEgb25seSlcbiAqL1xuZnVuY3Rpb24gcGFyc2VFZGRzYU1wY1YxTWF0ZXJpYWwoZGVjcnlwdGVkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtID0gSlNPTi5wYXJzZShkZWNyeXB0ZWQpO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBtPy51U2hhcmU/LnNlZWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgbT8uYml0Z29ZU2hhcmU/LnUgPT09ICdzdHJpbmcnICYmXG4gICAgICAodHlwZW9mIG0/LmJhY2t1cFlTaGFyZT8udSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG0/LnVzZXJZU2hhcmU/LnUgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vdCBKU09OIOKGkiBNUEN2MiBDQk9SXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwoXG4gIGVuY3J5cHRlZEtleVNoYXJlOiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWNyeXB0ZWQgPSBiaXRnb1xuICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXlTaGFyZSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXlTaGFyZSk7XG4gIHJldHVybiBwYXJzZUVkZHNhTXBjVjFNYXRlcmlhbChkZWNyeXB0ZWQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIEdldCBFZERTQSBNUEN2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gZW5jcnlwdGVkIHJlZHVjZWQgdXNlciBhbmQgYmFja3VwIGtleXMuXG4gKlxuICogVGhlIGVuY3J5cHRlZCBpbnB1dHMgYXJlIHRoZSBgcmVkdWNlZEVuY3J5cHRlZFBydmAgdmFsdWVzIHN0b3JlZCBvbiBFZERTQSBNUEN2MlxuICoga2V5IGNhcmRzLiBUaGV5IGRlY3J5cHQgdG8gQ0JPUi1lbmNvZGVkIHJlZHVjZWQgc2hhcmVzIHRoYXQgY29udGFpbiB0aGUgb3BhcXVlXG4gKiBNUFMgc2lnbmluZyBrZXktc2hhcmUgYnl0ZXMgcGx1cyB0aGUgY29tbW9uIHB1YmxpYyBrZXljaGFpbiBtYXRlcmlhbC5cbiAqXG4gKiBAcGFyYW0gZW5jcnlwdGVkVXNlcktleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEJhY2t1cEtleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleXNcbiAqIEByZXR1cm5zIEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgYW5kIGNvbW1vbiBrZXljaGFpblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gIGVuY3J5cHRlZFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkQmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPEVkZHNhTVBDdjJSZWNvdmVyeUtleVNoYXJlcz4ge1xuICBjb25zdCBkZWNvZGVLZXkgPSBhc3luYyAoZW5jcnlwdGVkS2V5OiBzdHJpbmcpOiBQcm9taXNlPE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlPiA9PiB7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXksIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pXG4gICAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXkpO1xuICAgIGxldCByZWR1Y2VkOiBNUFNUeXBlcy5FZGRzYVJlZHVjZWRLZXlTaGFyZTtcbiAgICB0cnkge1xuICAgICAgcmVkdWNlZCA9IE1QU1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUoQnVmZmVyLmZyb20oZGVjcnlwdGVkLCAnYmFzZTY0JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHVuYWJsZSB0byBkZWNvZGUgcmVkdWNlZCBrZXkgc2hhcmUgZnJvbSBrZXljYXJkIG1hdGVyaWFsLiBUaGUgZW5jcnlwdGVkIGtleSBtYXkgYmUgY29ycnVwdGVkLCBtYWxmb3JtZWQsIG9yIG5vdCBhbiBFZERTQSBNUEN2MiByZWR1Y2VkIGtleS4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlZHVjZWQua2V5U2hhcmU/Lmxlbmd0aCB8fCAhcmVkdWNlZC5wdWI/Lmxlbmd0aCB8fCAhcmVkdWNlZC5yb290Q2hhaW5Db2RlPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiByZWR1Y2VkIGtleSBzaGFyZSBpcyBtaXNzaW5nIGtleVNoYXJlLCBwdWIsIG9yIHJvb3RDaGFpbkNvZGUuIFRoaXMga2V5Y2FyZCBtYXkgYmUgcHVibGljLW9ubHkgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciByZWNvdmVyeS4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlZDtcbiAgfTtcblxuICBjb25zdCBbdXNlclJlZHVjZWQsIGJhY2t1cFJlZHVjZWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RlY29kZUtleShlbmNyeXB0ZWRVc2VyS2V5KSwgZGVjb2RlS2V5KGVuY3J5cHRlZEJhY2t1cEtleSldKTtcblxuICBjb25zdCB1c2VyUHViID0gQnVmZmVyLmZyb20odXNlclJlZHVjZWQucHViKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGJhY2t1cFB1YiA9IEJ1ZmZlci5mcm9tKGJhY2t1cFJlZHVjZWQucHViKS50b1N0cmluZygnaGV4Jyk7XG4gIGlmICh1c2VyUHViICE9PSBiYWNrdXBQdWIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1c2VyIGFuZCBiYWNrdXAgcHViIGtleXMgZG8gbm90IG1hdGNoJyk7XG4gIH1cblxuICBjb25zdCB1c2VyQ2hhaW5Db2RlID0gQnVmZmVyLmZyb20odXNlclJlZHVjZWQucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBiYWNrdXBDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgaWYgKHVzZXJDaGFpbkNvZGUgIT09IGJhY2t1cENoYWluQ29kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHVzZXIgYW5kIGJhY2t1cCByb290Q2hhaW5Db2RlcyBkbyBub3QgbWF0Y2gnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdXNlcktleVNoYXJlOiBCdWZmZXIuZnJvbSh1c2VyUmVkdWNlZC5rZXlTaGFyZSksXG4gICAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlci5mcm9tKGJhY2t1cFJlZHVjZWQua2V5U2hhcmUpLFxuICAgIGNvbW1vbktleUNoYWluOiB1c2VyUHViICsgdXNlckNoYWluQ29kZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaWduIGEgbWVzc2FnZSBmb3IgcmVjb3ZlcnkgdXNpbmcgRWREU0EgTVBDdjIgKE1QUykgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqXG4gKiBSdW5zIHRoZSBNUFMgRFNHIHByb3RvY29sIGxvY2FsbHkgdG8gcm91bmQgMywgdGhlbiB2ZXJpZmllcyB0aGUgcmVzdWx0aW5nXG4gKiBFZDI1NTE5IHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBwdWJsaWMga2V5IGRlcml2ZWQgZnJvbSB0aGUgY29tbW9uIGtleWNoYWluLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHJhdyBieXRlcyB0byBzaWduXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggQklQLTMyLXN0eWxlIGRlcml2YXRpb24gcGF0aCwgZS5nLiBgXCJtLzBcImBcbiAqIEBwYXJhbSB1c2VyS2V5U2hhcmUgb3BhcXVlIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBmb3IgdGhlIHVzZXIgcGFydHlcbiAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSBvcGFxdWUgTVBTIHNpZ25pbmcga2V5LXNoYXJlIGJ5dGVzIGZvciB0aGUgYmFja3VwIHBhcnR5XG4gKiBAcGFyYW0gY29tbW9uS2V5Q2hhaW4gMTI4LWhleC1jaGFyIHN0cmluZzogMzItYnl0ZSBwdWIgKyAzMi1ieXRlIHJvb3RDaGFpbkNvZGVcbiAqIEByZXR1cm5zIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyKFxuICBtZXNzYWdlOiBCdWZmZXIsXG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyLFxuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyLFxuICBjb21tb25LZXlDaGFpbjogc3RyaW5nXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICBjb25zdCBzaWduYXR1cmUgPSAoYXdhaXQgTVBTVXRpbC5leGVjdXRlVGlsbFJvdW5kKFxuICAgIDMsXG4gICAgdXNlckRzZyxcbiAgICBiYWNrdXBEc2csXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIG1lc3NhZ2UsXG4gICAgZGVyaXZhdGlvblBhdGhcbiAgKSkgYXMgQnVmZmVyO1xuXG4gIC8vIFVzZSBFZGRzYS5kZXJpdmVVbmhhcmRlbmVkIChCSVAzMi1FZDI1NTE5KSwgd2hpY2ggbWF0Y2hlcyB3aGF0IERTRyB1c2VzXG4gIC8vIGludGVybmFsbHkgZm9yIHBhdGggZGVyaXZhdGlvbiBzaW5jZSB3YXNtLW1wcyAxLjkuMC5cbiAgY29uc3QgbXBjID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICBjb25zdCBkZXJpdmVkS2V5Y2hhaW4gPSBtcGMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXlDaGFpbiwgZGVyaXZhdGlvblBhdGgpO1xuICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGRlcml2ZWRLZXljaGFpbi5zbGljZSgwLCA2NCksICdoZXgnKTtcblxuICBjb25zdCB2ZXJpZmllZCA9IGVkMjU1MTkudmVyaWZ5KG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpLCBuZXcgVWludDhBcnJheShwdWJsaWNLZXlCeXRlcykpO1xuICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIHJlcHJlc2VudGluZyBFZERTQSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIGZyb20gYSBrZXljYXJkLlxuICogdjE6IE1QQ3YxIEpTT04ga2V5Y2FyZCDigJQgdXNlclBydiBpcyB0aGUgZGVjcnlwdGVkIHBsYWludGV4dC5cbiAqIHYyOiBNUEN2MiBDQk9SIGtleWNhcmQg4oCUIGVuY3J5cHRlZFVzZXJLZXkgaXMgcmV0dXJuZWQgYXMtaXMgZm9yIE1QUyBEU0cuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZHNhU2lnbmluZ01hdGVyaWFsID0geyB2ZXJzaW9uOiAndjEnOyB1c2VyUHJ2OiBzdHJpbmcgfSB8IHsgdmVyc2lvbjogJ3YyJzsgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nIH07XG5cbi8qKlxuICogRGV0ZWN0cyBNUEN2MSB2cyBNUEN2MiBrZXljYXJkIGZvcm1hdCBhbmQgcmV0dXJucyB0eXBlZCBzaWduaW5nIG1hdGVyaWFsLlxuICogRm9yIHYxOiBkZWNyeXB0cyBvbmNlIGFuZCByZXR1cm5zIHRoZSBwbGFpbnRleHQgYXMgdXNlclBydi5cbiAqIEZvciB2MjogcmV0dXJucyB0aGUgZW5jcnlwdGVkIGtleSBhcy1pcyBmb3IgdXNlIHdpdGggc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LlxuICogV2hlbiBiaXRnbyBpcyBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHNqY2wgKHYxIG9ubHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwoXG4gIHVzZXJLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICBjb25zdCBub3JtYWxpemVkID0gdXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICBsZXQgZGVjcnlwdGVkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBub3JtYWxpemVkLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgICAgOiBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgbm9ybWFsaXplZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCk7XG4gIH1cbiAgY29uc3QgdXNlclBydiA9IHBhcnNlRWRkc2FNcGNWMU1hdGVyaWFsKGRlY3J5cHRlZCk7XG4gIHJldHVybiB1c2VyUHJ2ICE9PSBudWxsID8geyB2ZXJzaW9uOiAndjEnLCB1c2VyUHJ2IH0gOiB7IHZlcnNpb246ICd2MicsIGVuY3J5cHRlZFVzZXJLZXk6IG5vcm1hbGl6ZWQgfTtcbn1cblxuLyoqXG4gKiBGdWxsIE1QQ3YyIHJlY292ZXJ5IHNpZ25pbmcgZmxvdzogZGVjcnlwdCBrZXkgc2hhcmVzIOKGkiB2YWxpZGF0ZSBjb21tb25LZXlDaGFpbiDihpIgTVBTIERTRy5cbiAqIFJldHVybnMgcmF3IDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyLlxuICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbnkgY29pbi1zcGVjaWZpYyBlbnZlbG9wZVxuICogKGUuZy4gMHgwMCBTdWJzdHJhdGUgcHJlZml4LCBTVUkgZmxhZytwdWJrZXkgd3JhcHBlciwgb3IgcmF3IGZvciBORUFSL0FEQS9UT04pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4KHBhcmFtczoge1xuICBtZXNzYWdlOiBCdWZmZXI7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgYml0Z28/OiBCaXRHb0Jhc2U7XG59KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgeyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9ID0gYXdhaXQgZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gICAgcGFyYW1zLnVzZXJLZXksXG4gICAgcGFyYW1zLmJhY2t1cEtleSxcbiAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICBwYXJhbXMuYml0Z29cbiAgKTtcbiAgaWYgKGNvbW1vbktleUNoYWluLnRvTG93ZXJDYXNlKCkgIT09IHBhcmFtcy5iaXRnb0tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogY29tbW9uS2V5Q2hhaW4gZnJvbSBrZXljYXJkIGRvZXMgbm90IG1hdGNoIGJpdGdvS2V5Jyk7XG4gIH1cbiAgcmV0dXJuIHNpZ25SZWNvdmVyeUVkZHNhTVBDdjIocGFyYW1zLm1lc3NhZ2UsIHBhcmFtcy5kZXJpdmF0aW9uUGF0aCwgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4pO1xufVxuXG5leHBvcnQgY29uc3QgRWRkc2FNUEN2MlJlY292ZXJ5RnVuY3Rpb25zID0ge1xuICBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwsXG4gIGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5LFxuICBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyLFxuICBnZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LFxufTtcbiJdfQ==