@bitgo-beta/sdk-coin-ton 1.0.1-beta.1919 → 1.0.1-beta.1920

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../src/ton.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,QAAQ,EACR,SAAS,EAOT,OAAO,EACP,YAAY,EACZ,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EAExB,kBAAkB,EAClB,KAAK,EAIL,WAAW,EAEX,MAAM,EACN,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAMzE,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACI,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;IAI5B,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B,2BAA2B,IAAI,OAAO;IAItC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAelE,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsErE,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBlE,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8BtF,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAYvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUxC,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,kBAAkB;IACZ,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS/D,kBAAkB;IACZ,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA8BtF,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,OAAO,CAAC,UAAU;IAIlB;;;OAGG;YACW,uBAAuB;YAIvB,eAAe;YAQf,oBAAoB;IAmC5B,OAAO,CACX,MAAM,EAAE,kBAAkB,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,GACnF,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;IA+L/B;;;;;;;;OAQG;IACG,mCAAmC,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmD3F,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,uBAAuB;CAM5E"}
1
+ {"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../src/ton.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,QAAQ,EACR,SAAS,EAOT,OAAO,EACP,YAAY,EACZ,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EAExB,kBAAkB,EAClB,KAAK,EAIL,WAAW,EAEX,MAAM,EACN,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAMzE,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACI,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;IAI5B,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B,2BAA2B,IAAI,OAAO;IAItC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAelE,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsErE,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBlE,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8BtF,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAYvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUxC,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,kBAAkB;IACZ,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS/D,kBAAkB;IACZ,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA8BtF,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,OAAO,CAAC,UAAU;IAIlB;;;OAGG;YACW,uBAAuB;YAIvB,eAAe;YAQf,oBAAoB;IAmC5B,OAAO,CACX,MAAM,EAAE,kBAAkB,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,GACnF,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;IA+L/B;;;;;;;;OAQG;IACG,mCAAmC,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmE3F,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,uBAAuB;CAM5E"}
@@ -43,6 +43,7 @@ const _ = __importStar(require("lodash"));
43
43
  const tonweb_1 = __importDefault(require("tonweb"));
44
44
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
45
45
  const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
46
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
46
47
  const statics_1 = require("@bitgo-beta/statics");
47
48
  const keyPair_1 = require("./lib/keyPair");
48
49
  const lib_1 = require("./lib");
@@ -474,19 +475,15 @@ class Ton extends sdk_core_1.BaseCoin {
474
475
  for (let i = 0; i < req.length; i++) {
475
476
  const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
476
477
  const transaction = req[i].txRequest.transactions[0].unsignedTx;
477
- if (!req[i].ovc || !req[i].ovc[0].eddsaSignature) {
478
+ const ovc = req[i].ovc?.[0];
479
+ const mpcv2SignatureHex = ovc?.eddsaMpcv2Signature;
480
+ if (!ovc || (!mpcv2SignatureHex && !ovc.eddsaSignature)) {
478
481
  throw new Error('Missing signature(s)');
479
482
  }
480
- const signature = req[i].ovc[0].eddsaSignature;
481
483
  if (!transaction.signableHex) {
482
484
  throw new Error('Missing signable hex');
483
485
  }
484
486
  const messageBuffer = Buffer.from(transaction.signableHex, 'hex');
485
- const result = MPC.verify(messageBuffer, signature);
486
- if (!result) {
487
- throw new Error('Invalid signature');
488
- }
489
- const signatureHex = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
490
487
  const txBuilder = this.getBuilder().from(transaction.serializedTx);
491
488
  if (!transaction.coinSpecific?.commonKeychain) {
492
489
  throw new Error('Missing common keychain');
@@ -498,6 +495,27 @@ class Ton extends sdk_core_1.BaseCoin {
498
495
  const derivationPath = transaction.derivationPath;
499
496
  const accountId = MPC.deriveUnhardened(commonKeychain, derivationPath).slice(0, 64);
500
497
  const tonKeyPair = new keyPair_1.KeyPair({ pub: accountId });
498
+ let signatureHex;
499
+ if (mpcv2SignatureHex) {
500
+ // MPCv2 (OVC 5-pass): raw 64-byte Ed25519 signature. Verify against the
501
+ // same derived public key the transaction is signed under, then embed as-is.
502
+ const signature = Buffer.from(mpcv2SignatureHex, 'hex');
503
+ const isValid = tweetnacl_1.default.sign.detached.verify(messageBuffer, signature, Buffer.from(accountId, 'hex'));
504
+ if (!isValid) {
505
+ throw new Error('Invalid signature');
506
+ }
507
+ signatureHex = signature;
508
+ }
509
+ else {
510
+ const result = MPC.verify(messageBuffer, ovc.eddsaSignature);
511
+ if (!result) {
512
+ throw new Error('Invalid signature');
513
+ }
514
+ signatureHex = Buffer.concat([
515
+ Buffer.from(ovc.eddsaSignature.R, 'hex'),
516
+ Buffer.from(ovc.eddsaSignature.sigma, 'hex'),
517
+ ]);
518
+ }
501
519
  // add combined signature from ovc
502
520
  txBuilder.addSignature({ pub: tonKeyPair.getKeys().pub }, signatureHex);
503
521
  const signedTransaction = await txBuilder.build();
@@ -521,4 +539,4 @@ class Ton extends sdk_core_1.BaseCoin {
521
539
  }
522
540
  }
523
541
  exports.Ton = Ton;
524
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLDBDQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsbURBZ0M4QjtBQUM5Qix5REFBa0Y7QUFDbEYsaURBQXlFO0FBQ3pFLDJDQUFzRDtBQUN0RCwrQkFBb0g7QUFDcEgseUVBQXNIO0FBQ3RILHVDQUE2QztBQVE3QyxNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUUvQixZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sU0FBUztRQUNkLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLHdCQUFhLENBQUMsR0FBRyxDQUFDO0lBQzNCLENBQUM7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LFlBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDcEUsYUFBYSxHQUFHLFdBQVcsQ0FBQyxZQUFhLENBQUMsYUFBdUIsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUEyQjtRQUN6RSxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUEsa0NBQW9CLEVBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUF0a0JELGtCQXNrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgVG9uV2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5LFxuICBFRERTQU1ldGhvZHMsXG4gIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsIGFzIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgTVBDUmVjb3ZlcnlPcHRpb25zLFxuICBNUENUeCxcbiAgT3ZjSW5wdXQsXG4gIE92Y091dHB1dCxcbiAgRW52aXJvbm1lbnRzLFxuICBNUENTd2VlcFR4cyxcbiAgUHVibGljS2V5LFxuICBNUENUeHMsXG4gIE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zLFxuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgZXh0cmFjdENvbW1vbktleWNoYWluLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIFRvbktleVBhaXIgfSBmcm9tICcuL2xpYi9rZXlQYWlyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFV0aWxzLCBUcmFuc2ZlckJ1aWxkZXIsIFRva2VuVHJhbnNmZXJCdWlsZGVyLCBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBleHBsYWluVG9uVHJhbnNhY3Rpb24sIGdldFNpZ25hYmxlUGF5bG9hZFdhc20sIHRvQm91bmNlYWJsZUFkZHJlc3NXYXNtIH0gZnJvbSAnLi9saWIvZXhwbGFpblRyYW5zYWN0aW9uV2FzbSc7XG5pbXBvcnQgeyBnZXRGZWVFc3RpbWF0ZSB9IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb25QYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgZnJvbUFkZHJlc3NCb3VuY2VhYmxlPzogYm9vbGVhbjtcbiAgdG9BZGRyZXNzQm91bmNlYWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBUb24gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBUb24oYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3IgYmV0d2VlbiB0aGUgY29pbidzIGJhc2UgdW5pdCBhbmQgaXRzIHNtYWxsZXN0IHN1YmRpdmlzb25cbiAgICovXG4gIHB1YmxpYyBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDFlOTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAndG9uJztcbiAgfVxuXG4gIHB1YmxpYyBnZXRGYW1pbHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3Rvbic7XG4gIH1cblxuICBwdWJsaWMgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0dyYW0nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWRkc2EnO1xuICB9XG5cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IG1lbW9JZD86IHN0cmluZyB9IHtcbiAgICBjb25zdCBhZGRyZXNzQ29tcG9uZW50cyA9IGFkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG5cbiAgICBpZiAoYWRkcmVzc0NvbXBvbmVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogYWRkcmVzc0NvbXBvbmVudHNbMF0sXG4gICAgICAgIG1lbW9JZDogYWRkcmVzc0NvbXBvbmVudHNbMV0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzQ29tcG9uZW50c1swXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQsIHR4UGFyYW1zOiB0eFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHJhd1R4ID0gdHhQcmVidWlsZC50eEhleDtcbiAgICBpZiAoIXJhd1R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXRDaGFpbigpID09PSAndHRvbicpIHtcbiAgICAgIGNvbnN0IHRvQm91bmNlYWJsZSA9IChhZGRyZXNzOiBzdHJpbmcpID0+IHRvQm91bmNlYWJsZUFkZHJlc3NXYXNtKHRoaXMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcykuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcbiAgICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRSZWNpcGllbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdHhQYXJhbXMucmVjaXBpZW50cy5tYXAoYXN5bmMgKHJlY2lwaWVudCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF3YWl0IHRvQm91bmNlYWJsZShyZWNpcGllbnQuYWRkcmVzcyksXG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChyZWNpcGllbnQuYW1vdW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZXhwbGFpbmVkVHgub3V0cHV0cy5tYXAoYXN5bmMgKG91dHB1dCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF3YWl0IHRvQm91bmNlYWJsZShvdXRwdXQuYWRkcmVzcyksXG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChvdXRwdXQuYW1vdW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFfLmlzRXF1YWwoZmlsdGVyZWRPdXRwdXRzLCBmaWx0ZXJlZFJlY2lwaWVudHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHR4UGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgICAgICB0b3RhbEFtb3VudCA9IHRvdGFsQW1vdW50LnBsdXMocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b3RhbEFtb3VudC5pc0VxdWFsVG8oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHggdG90YWwgYW1vdW50IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdG90YWwgYW1vdW50IGZpZWxkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcigpLmZyb20oQnVmZmVyLmZyb20ocmF3VHgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhyZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbmV3IFRvbldlYi5BZGRyZXNzKGRlc3RpbmF0aW9uLmFkZHJlc3MpLnRvU3RyaW5nKHRydWUsIHRydWUsIHRydWUpLFxuICAgICAgICAgIGFtb3VudDogQmlnSW50KHJlY2lwaWVudC5hbW91bnQpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZE91dHB1dHMgPSBleHBsYWluZWRUeC5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbmV3IFRvbldlYi5BZGRyZXNzKG91dHB1dC5hZGRyZXNzKS50b1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICBhbW91bnQ6IEJpZ0ludChvdXRwdXQuYW1vdW50KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFfLmlzRXF1YWwoZmlsdGVyZWRPdXRwdXRzLCBmaWx0ZXJlZFJlY2lwaWVudHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHggb3V0cHV0cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgIH1cbiAgICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudHMgb2YgdHhQYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgICB0b3RhbEFtb3VudCA9IHRvdGFsQW1vdW50LnBsdXMocmVjaXBpZW50cy5hbW91bnQpO1xuICAgICAgfVxuICAgICAgaWYgKCF0b3RhbEFtb3VudC5pc0VxdWFsVG8oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHRvdGFsIGFtb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHRvdGFsIGFtb3VudCBmaWVsZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBrZXljaGFpbnMsIGFkZHJlc3M6IG5ld0FkZHJlc3MsIGluZGV4IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MobmV3QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7bmV3QWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbYWRkcmVzcywgbWVtb0lkXSA9IG5ld0FkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG5cbiAgICAvLyBUT04gc3VwcG9ydHMgbWVtb0lkIGZvciBhZGRyZXNzIHRhZ2dpbmcgLSB2ZXJpZnkgaXQgbWF0Y2hlcyB0aGUgaW5kZXhcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICByZXR1cm4gbWVtb0lkID09PSBgJHtpbmRleH1gO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyk7XG5cbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gJ20vJyArIGluZGV4O1xuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSBhd2FpdCBVdGlscy5kZWZhdWx0LmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgcmV0dXJuIGFkZHJlc3MgPT09IGV4cGVjdGVkQWRkcmVzcztcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBUb25QYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IGZhY3RvcnkuZnJvbShCdWZmZXIuZnJvbShwYXJhbXMudHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMudG9BZGRyZXNzQm91bmNlYWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIudG9BZGRyZXNzQm91bmNlYWJsZShwYXJhbXMudG9BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRyYW5zYWN0aW9uQnVpbGRlci5mcm9tQWRkcmVzc0JvdW5jZWFibGUocGFyYW1zLmZyb21BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSByZWJ1aWx0VHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogcGFyc2VkVHJhbnNhY3Rpb24uc2VuZGVyLFxuICAgICAgICAgIGFtb3VudDogcGFyc2VkVHJhbnNhY3Rpb24uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHBhcnNlZFRyYW5zYWN0aW9uLmRlc3RpbmF0aW9uLFxuICAgICAgICAgIGFtb3VudDogcGFyc2VkVHJhbnNhY3Rpb24uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBUb25LZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBUb25LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZGRyZXNzQmFzZTY0ID0gYWRkcmVzcy5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGFkZHJlc3NCYXNlNjQuc3BsaXQoJz9tZW1vSWQ9JylbMF0sICdiYXNlNjQnKTtcbiAgICAgIHJldHVybiBidWYubGVuZ3RoID09PSAzNjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyBnZXRTaWduYWJsZVBheWxvYWQoc2VyaWFsaXplZFR4OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICh0aGlzLmdldENoYWluKCkgPT09ICd0dG9uJykge1xuICAgICAgcmV0dXJuIGdldFNpZ25hYmxlUGF5bG9hZFdhc20oc2VyaWFsaXplZFR4KTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCBmYWN0b3J5LmZyb20oc2VyaWFsaXplZFR4KS5idWlsZCgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBpZiAodGhpcy5nZXRDaGFpbigpID09PSAndHRvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHR4QmFzZTY0ID0gQnVmZmVyLmZyb20ocGFyYW1zLnR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZXhwbGFpblRvblRyYW5zYWN0aW9uKHsgdHhCYXNlNjQsIHRvQWRkcmVzc0JvdW5jZWFibGU6IHBhcmFtcy50b0FkZHJlc3NCb3VuY2VhYmxlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IGZhY3RvcnkuZnJvbShCdWZmZXIuZnJvbShwYXJhbXMudHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuXG4gICAgICBjb25zdCB7IHRvQWRkcmVzc0JvdW5jZWFibGUsIGZyb21BZGRyZXNzQm91bmNlYWJsZSB9ID0gcGFyYW1zO1xuXG4gICAgICBpZiAodHlwZW9mIHRvQWRkcmVzc0JvdW5jZWFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIudG9BZGRyZXNzQm91bmNlYWJsZSh0b0FkZHJlc3NCb3VuY2VhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmcm9tQWRkcmVzc0JvdW5jZWFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKGZyb21BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zYWN0aW9uQnVpbGRlci5idWlsZCgpO1xuICAgICAgcmV0dXJuIHJlYnVpbHRUcmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS50b25Ob2RlVXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY3JpbWluYXRlZCB1bmlvbiBjYXJyeWluZyBrZXljYXJkIHZlcnNpb24gYW5kIGRlY3J5cHRlZCBWMSB1c2VyIGtleSAodG8gYXZvaWQgcmUtZGVjcnlwdGlvbikuXG4gICAqIFYxIGtleWNhcmRzIGFyZSBKU09OOyBWMiBrZXljYXJkcyBhcmUgQ0JPUi1lbmNvZGVkIHJlZHVjZWQga2V5IHNoYXJlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleTogc3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcpOiBQcm9taXNlPEVkZHNhU2lnbmluZ01hdGVyaWFsPiB7XG4gICAgcmV0dXJuIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWNyeXB0S2V5Y2hhaW4oZW5jcnlwdGVkS2V5OiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB7IGVuY3J5cHRlZFBydjogZW5jcnlwdGVkS2V5IH0sIHBhc3NwaHJhc2UpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgJHtsYWJlbH0ga2V5Y2hhaW46IGludmFsaWQgcGFzc3dvcmQgb3IgY29ycnVwdGVkIGtleWApO1xuICAgIH1cbiAgICByZXR1cm4gcHJ2O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRSZWNvdmVyeVNpZ25hdHVyZShcbiAgICBzaWduaW5nTWF0ZXJpYWw6IEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHNlbmRlckFkZHI6IHN0cmluZyxcbiAgICB1bnNpZ25lZFRyYW5zYWN0aW9uOiBhbnksXG4gICAgY3VyclBhdGg6IHN0cmluZyxcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEtleTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2lnbmluZ01hdGVyaWFsLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCh7XG4gICAgICAgIG1lc3NhZ2U6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLFxuICAgICAgICB1c2VyS2V5OiBzaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgZGVyaXZhdGlvblBhdGg6IGN1cnJQYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyQWRkciB9IGFzIFB1YmxpY0tleSwgc2lnbmF0dXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2Uoc2lnbmluZ01hdGVyaWFsLnVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcbiAgICAgIGNvbnN0IGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuZGVjcnlwdEtleWNoYWluKGJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSwgJ2JhY2t1cCcpO1xuICAgICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlSGV4ID0gYXdhaXQgRUREU0FNZXRob2RzLmdldFRTU1NpZ25hdHVyZShcbiAgICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBjdXJyUGF0aCxcbiAgICAgICAgdW5zaWduZWRUcmFuc2FjdGlvblxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlckFkZHIgfSBhcyBQdWJsaWNLZXksIHNpZ25hdHVyZUhleCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVjb3ZlcihcbiAgICBwYXJhbXM6IE1QQ1JlY292ZXJ5T3B0aW9ucyAmIHsgamV0dG9uTWFzdGVyPzogc3RyaW5nOyBzZW5kZXJKZXR0b25BZGRyZXNzPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUENUeCB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYXBpS2V5Jyk7XG4gICAgfVxuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy51c2VyS2V5ICYmICFwYXJhbXMuYmFja3VwS2V5ICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcblxuICAgIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHRvbndlYiA9IG5ldyBUb25XZWIobmV3IFRvbldlYi5IdHRwUHJvdmlkZXIodGhpcy5nZXRQdWJsaWNOb2RlVXJsKCksIHsgYXBpS2V5OiBwYXJhbXMuYXBpS2V5IH0pKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgY29uc3QgaW5kZXggPSBwYXJhbXMuaW5kZXggfHwgMDtcbiAgICBjb25zdCBjdXJyUGF0aCA9IHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpICsgYC8ke2luZGV4fWAgOiBgbS8ke2luZGV4fWA7XG4gICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGN1cnJQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkciA9IGF3YWl0IFV0aWxzLmRlZmF1bHQuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoYWNjb3VudElkKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdG9ud2ViLmdldEJhbGFuY2Uoc2VuZGVyQWRkcik7XG5cbiAgICBjb25zdCBqZXR0b25CYWxhbmNlczogeyBtaW50ZXJBZGRyZXNzPzogc3RyaW5nOyB3YWxsZXRBZGRyZXNzOiBzdHJpbmc7IGJhbGFuY2U6IHN0cmluZyB9W10gPSBbXTtcbiAgICBpZiAocGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpldHRvbldhbGxldERhdGEgPSBhd2FpdCB0b253ZWIucHJvdmlkZXIuY2FsbChwYXJhbXMuc2VuZGVySmV0dG9uQWRkcmVzcywgJ2dldF93YWxsZXRfZGF0YScpO1xuICAgICAgICBjb25zdCBqZXR0b25CYWxhbmNlID0gamV0dG9uV2FsbGV0RGF0YS5zdGFja1swXVsxXTtcbiAgICAgICAgaWYgKGpldHRvbkJhbGFuY2UgJiYgbmV3IEJpZ051bWJlcihqZXR0b25CYWxhbmNlKS5ndCgwKSkge1xuICAgICAgICAgIGpldHRvbkJhbGFuY2VzLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0QWRkcmVzczogcGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3MsXG4gICAgICAgICAgICBiYWxhbmNlOiBqZXR0b25CYWxhbmNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHF1ZXJ5IGpldHRvbiBiYWxhbmNlIGZvciBhZGRyZXNzICR7cGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3N9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBXYWxsZXRDbGFzcyA9IHRvbndlYi53YWxsZXQuYWxsWyd2NFIyJ107XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldENsYXNzKHRvbndlYi5wcm92aWRlciwge1xuICAgICAgcHVibGljS2V5OiB0b253ZWIudXRpbHMuaGV4VG9CeXRlcyhhY2NvdW50SWQpLFxuICAgICAgd2M6IDAsXG4gICAgfSk7XG4gICAgY29uc3Qgc2Vxbm9SZXN1bHQgPSBhd2FpdCB3YWxsZXQubWV0aG9kcy5zZXFubygpLmNhbGwoKTtcbiAgICBjb25zdCBzZXFubzogbnVtYmVyID0gc2Vxbm9SZXN1bHQgIT09IG51bGwgJiYgc2Vxbm9SZXN1bHQgIT09IHVuZGVmaW5lZCA/IHNlcW5vUmVzdWx0IDogMDtcblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBjb25zdCBleHBpcmVBdCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDFlMykgKyA2MCAqIDYwICogMjQgKiA3O1xuXG4gICAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGxldCB1bnNpZ25lZFRyYW5zYWN0aW9uOiBhbnk7XG4gICAgbGV0IGZlZUVzdGltYXRlOiBudW1iZXI7XG4gICAgbGV0IHRyYW5zYWN0aW9uVHlwZTogJ3RvbicgfCAnamV0dG9uJztcblxuICAgIGlmICgocGFyYW1zLmpldHRvbk1hc3RlciB8fCBwYXJhbXMuc2VuZGVySmV0dG9uQWRkcmVzcykgJiYgamV0dG9uQmFsYW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgamV0dG9uSW5mbyA9IGpldHRvbkJhbGFuY2VzWzBdO1xuICAgICAgY29uc3QgdG9uQW1vdW50ID0gJzUwMDAwMDAwJztcbiAgICAgIGNvbnN0IGZvcndhcmRUb25BbW91bnQgPSAnMSc7XG5cbiAgICAgIGNvbnN0IHRvdGFsUmVxdWlyZWRUb24gPSBuZXcgQmlnTnVtYmVyKHRvbkFtb3VudCkucGx1cyhuZXcgQmlnTnVtYmVyKGZvcndhcmRUb25BbW91bnQpKTtcbiAgICAgIGlmIChuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLmx0KHRvdGFsUmVxdWlyZWRUb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5zdWZmaWNpZW50IFRPTiBiYWxhbmNlIGZvciBqZXR0b24gdHJhbnNmZXIuIFJlcXVpcmVkOiAke3RvdGFsUmVxdWlyZWRUb24udG9TdHJpbmcoKX0gbmFub1RPTiwgQXZhaWxhYmxlOiAke2JhbGFuY2V9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcilcbiAgICAgICAgLnNlcXVlbmNlTnVtYmVyKHNlcW5vKVxuICAgICAgICAucHVibGljS2V5KGFjY291bnRJZClcbiAgICAgICAgLmV4cGlyZVRpbWUoZXhwaXJlQXQpO1xuXG4gICAgICAodHhCdWlsZGVyIGFzIFRva2VuVHJhbnNmZXJCdWlsZGVyKS5yZWNpcGllbnQoXG4gICAgICAgIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBqZXR0b25JbmZvLndhbGxldEFkZHJlc3MsXG4gICAgICAgIHRvbkFtb3VudCxcbiAgICAgICAgamV0dG9uSW5mby5iYWxhbmNlLFxuICAgICAgICBmb3J3YXJkVG9uQW1vdW50XG4gICAgICApO1xuXG4gICAgICB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBmZWVFc3RpbWF0ZSA9IHBhcnNlSW50KHRvbkFtb3VudCwgMTApO1xuICAgICAgdHJhbnNhY3Rpb25UeXBlID0gJ2pldHRvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLmlzRXF1YWxUbygwKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignRGlkIG5vdCBmaW5kIGFkZHJlc3Mgd2l0aCBUT04gYmFsYW5jZSB0byByZWNvdmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvbkZlZUVzdGltYXRlID0gYXdhaXQgZ2V0RmVlRXN0aW1hdGUod2FsbGV0LCBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYmFsYW5jZSwgc2Vxbm8gYXMgbnVtYmVyKTtcblxuICAgICAgY29uc3QgdG90YWxGZWVFc3RpbWF0ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICh0b25GZWVFc3RpbWF0ZS5zb3VyY2VfZmVlcy5pbl9md2RfZmVlICtcbiAgICAgICAgICB0b25GZWVFc3RpbWF0ZS5zb3VyY2VfZmVlcy5zdG9yYWdlX2ZlZSArXG4gICAgICAgICAgdG9uRmVlRXN0aW1hdGUuc291cmNlX2ZlZXMuZ2FzX2ZlZSArXG4gICAgICAgICAgdG9uRmVlRXN0aW1hdGUuc291cmNlX2ZlZXMuZndkX2ZlZSkgKlxuICAgICAgICAgIDEuNVxuICAgICAgKTtcblxuICAgICAgaWYgKG5ldyBCaWdOdW1iZXIodG90YWxGZWVFc3RpbWF0ZSkuZ3RlKGJhbGFuY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5zdWZmaWNpZW50IFRPTiBiYWxhbmNlIGZvciB0cmFuc2FjdGlvbi4gUmVxdWlyZWQ6ICR7dG90YWxGZWVFc3RpbWF0ZX0gbmFub1RPTiwgQXZhaWxhYmxlOiAke2JhbGFuY2V9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHIpXG4gICAgICAgIC5zZXF1ZW5jZU51bWJlcihzZXFubylcbiAgICAgICAgLnB1YmxpY0tleShhY2NvdW50SWQpXG4gICAgICAgIC5leHBpcmVUaW1lKGV4cGlyZUF0KTtcblxuICAgICAgKHR4QnVpbGRlciBhcyBUcmFuc2ZlckJ1aWxkZXIpLnNlbmQoe1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLm1pbnVzKG5ldyBCaWdOdW1iZXIodG90YWxGZWVFc3RpbWF0ZSkpLnRvU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgZmVlRXN0aW1hdGUgPSB0b3RhbEZlZUVzdGltYXRlO1xuICAgICAgdHJhbnNhY3Rpb25UeXBlID0gJ3Rvbic7XG4gICAgfVxuXG4gICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGFzc2VydChwYXJhbXMudXNlcktleSwgJ21pc3NpbmcgdXNlcktleScpO1xuICAgICAgYXNzZXJ0KHBhcmFtcy5iYWNrdXBLZXksICdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCAnbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbChwYXJhbXMudXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgYXdhaXQgdGhpcy5hZGRSZWNvdmVyeVNpZ25hdHVyZShcbiAgICAgICAgc2lnbmluZ01hdGVyaWFsLFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHIsXG4gICAgICAgIHVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIGN1cnJQYXRoLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpLFxuICAgICAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxsZXRDb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHsgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH07XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gY29tcGxldGVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgaW5wdXRzOiBPdmNJbnB1dFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGNvbXBsZXRlZFRyYW5zYWN0aW9uLmlucHV0cykge1xuICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogaW5wdXQuYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZVN0cmluZzogaW5wdXQudmFsdWUsXG4gICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoaW5wdXQudmFsdWUpLnRvTnVtYmVyKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0czogT3ZjT3V0cHV0W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIGNvbXBsZXRlZFRyYW5zYWN0aW9uLm91dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LnZhbHVlLFxuICAgICAgICAgIGNvaW5OYW1lOiBvdXRwdXQuY29pbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzcGVuZEFtb3VudCA9IGNvbXBsZXRlZFRyYW5zYWN0aW9uLmlucHV0cy5sZW5ndGggPT09IDEgPyBjb21wbGV0ZWRUcmFuc2FjdGlvbi5pbnB1dHNbMF0udmFsdWUgOiAwO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSB7IGlucHV0czogaW5wdXRzLCBvdXRwdXRzOiBvdXRwdXRzLCBzcGVuZEFtb3VudDogc3BlbmRBbW91bnQsIHR5cGU6IHRyYW5zYWN0aW9uVHlwZSB9O1xuICAgICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBmZWVFc3RpbWF0ZSwgZmVlU3RyaW5nOiBmZWVFc3RpbWF0ZS50b1N0cmluZygpIH07XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHtcbiAgICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICAgIHNjYW5JbmRleDogaW5kZXgsXG4gICAgICAgIGNvaW46IHdhbGxldENvaW4sXG4gICAgICAgIHNpZ25hYmxlSGV4OiBjb21wbGV0ZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogY3VyclBhdGgsXG4gICAgICAgIHBhcnNlZFR4OiBwYXJzZWRUeCxcbiAgICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgICAgY29pblNwZWNpZmljOiBjb2luU3BlY2lmaWMsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBjb21wbGV0ZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICBzY2FuSW5kZXg6IGluZGV4LFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZnVuZHMgc3dlZXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24ocykgd2l0aG91dCBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge01QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29tYmluZSB0aGUgc2lnbmF0dXJlc1xuICAgKiBhbmQgdHJhbnNhY3Rpb25zIHRvIGNyZWF0ZSBicm9hZGNhc3RhYmxlIHRyYW5zYWN0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyB7TVBDVHhzfSBhcnJheSBvZiB0aGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5ncyBhbmQgaW5kaWNlc1xuICAgKiBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nIHN3ZXB0XG4gICAqL1xuICBhc3luYyBjcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXM6IE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHM+IHtcbiAgICBjb25zdCByZXEgPSBwYXJhbXMuc2lnbmF0dXJlU2hhcmVzO1xuICAgIGNvbnN0IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnM6IE1QQ1R4W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVxW2ldLnR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIGlmICghcmVxW2ldLm92YyB8fCAhcmVxW2ldLm92Y1swXS5lZGRzYVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlKHMpJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSByZXFbaV0ub3ZjWzBdLmVkZHNhU2lnbmF0dXJlO1xuICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYWJsZUhleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmFibGUgaGV4Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmZyb20odHJhbnNhY3Rpb24uc2lnbmFibGVIZXghLCAnaGV4Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VCdWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYXR1cmVIZXggPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWduYXR1cmUuUiwgJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2lnbWEsICdoZXgnKV0pO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZnJvbSh0cmFuc2FjdGlvbi5zZXJpYWxpemVkVHggYXMgc3RyaW5nKTtcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5jb21tb25LZXljaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29tbW9uIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEuY29tbW9uS2V5Y2hhaW4hIGFzIHN0cmluZztcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2YXRpb24gcGF0aCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSB0cmFuc2FjdGlvbi5kZXJpdmF0aW9uUGF0aCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHRvbktleVBhaXIgPSBuZXcgVG9uS2V5UGFpcih7IHB1YjogYWNjb3VudElkIH0pO1xuXG4gICAgICAvLyBhZGQgY29tYmluZWQgc2lnbmF0dXJlIGZyb20gb3ZjXG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0b25LZXlQYWlyLmdldEtleXMoKS5wdWIgfSwgc2lnbmF0dXJlSGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLnB1c2goe1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiB0cmFuc2FjdGlvbi5zY2FuSW5kZXgsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGkgPT09IHJlcS5sZW5ndGggLSAxICYmIHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCkge1xuICAgICAgICBsYXN0U2NhbkluZGV4ID0gdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4IGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyB0cmFuc2FjdGlvbnM6IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnMsIGxhc3RTY2FuSW5kZXggfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7IHB1YmxpY0tleSwgcHJ2LCBtdWx0aVNpZ1R5cGUgfTogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aVNpZ1R5cGUnKTtcbiAgICB9XG4gICAgYXVkaXRFZGRzYVByaXZhdGVLZXkocHJ2LCBwdWJsaWNLZXkgPz8gJycpO1xuICB9XG59XG4iXX0=
542
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLDBDQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsbURBZ0M4QjtBQUM5Qix5REFBa0Y7QUFDbEYsMERBQTZCO0FBQzdCLGlEQUF5RTtBQUN6RSwyQ0FBc0Q7QUFDdEQsK0JBQW9IO0FBQ3BILHlFQUFzSDtBQUN0SCx1Q0FBNkM7QUFRN0MsTUFBYSxHQUFJLFNBQVEsbUJBQVE7SUFFL0IsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixzQkFBc0I7UUFDcEIsT0FBTyx3QkFBYSxDQUFDLEdBQUcsQ0FB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dCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBUb25XZWIgZnJvbSAndG9ud2ViJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksXG4gIEVERFNBTWV0aG9kcyxcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwgYXMgc2hhcmVkR2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCxcbiAgRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBFRERTQU1ldGhvZFR5cGVzLFxuICBNUENSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1R4LFxuICBPdmNJbnB1dCxcbiAgT3ZjT3V0cHV0LFxuICBFbnZpcm9ubWVudHMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBQdWJsaWNLZXksXG4gIE1QQ1R4cyxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBleHRyYWN0Q29tbW9uS2V5Y2hhaW4sXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5LCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIFRvbktleVBhaXIgfSBmcm9tICcuL2xpYi9rZXlQYWlyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFV0aWxzLCBUcmFuc2ZlckJ1aWxkZXIsIFRva2VuVHJhbnNmZXJCdWlsZGVyLCBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBleHBsYWluVG9uVHJhbnNhY3Rpb24sIGdldFNpZ25hYmxlUGF5bG9hZFdhc20sIHRvQm91bmNlYWJsZUFkZHJlc3NXYXNtIH0gZnJvbSAnLi9saWIvZXhwbGFpblRyYW5zYWN0aW9uV2FzbSc7XG5pbXBvcnQgeyBnZXRGZWVFc3RpbWF0ZSB9IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb25QYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgZnJvbUFkZHJlc3NCb3VuY2VhYmxlPzogYm9vbGVhbjtcbiAgdG9BZGRyZXNzQm91bmNlYWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBUb24gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBUb24oYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3IgYmV0d2VlbiB0aGUgY29pbidzIGJhc2UgdW5pdCBhbmQgaXRzIHNtYWxsZXN0IHN1YmRpdmlzb25cbiAgICovXG4gIHB1YmxpYyBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDFlOTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAndG9uJztcbiAgfVxuXG4gIHB1YmxpYyBnZXRGYW1pbHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3Rvbic7XG4gIH1cblxuICBwdWJsaWMgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0dyYW0nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWRkc2EnO1xuICB9XG5cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IG1lbW9JZD86IHN0cmluZyB9IHtcbiAgICBjb25zdCBhZGRyZXNzQ29tcG9uZW50cyA9IGFkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG5cbiAgICBpZiAoYWRkcmVzc0NvbXBvbmVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogYWRkcmVzc0NvbXBvbmVudHNbMF0sXG4gICAgICAgIG1lbW9JZDogYWRkcmVzc0NvbXBvbmVudHNbMV0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzQ29tcG9uZW50c1swXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQsIHR4UGFyYW1zOiB0eFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHJhd1R4ID0gdHhQcmVidWlsZC50eEhleDtcbiAgICBpZiAoIXJhd1R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXRDaGFpbigpID09PSAndHRvbicpIHtcbiAgICAgIGNvbnN0IHRvQm91bmNlYWJsZSA9IChhZGRyZXNzOiBzdHJpbmcpID0+IHRvQm91bmNlYWJsZUFkZHJlc3NXYXNtKHRoaXMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcykuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcbiAgICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRSZWNpcGllbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdHhQYXJhbXMucmVjaXBpZW50cy5tYXAoYXN5bmMgKHJlY2lwaWVudCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF3YWl0IHRvQm91bmNlYWJsZShyZWNpcGllbnQuYWRkcmVzcyksXG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChyZWNpcGllbnQuYW1vdW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZXhwbGFpbmVkVHgub3V0cHV0cy5tYXAoYXN5bmMgKG91dHB1dCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF3YWl0IHRvQm91bmNlYWJsZShvdXRwdXQuYWRkcmVzcyksXG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChvdXRwdXQuYW1vdW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFfLmlzRXF1YWwoZmlsdGVyZWRPdXRwdXRzLCBmaWx0ZXJlZFJlY2lwaWVudHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHR4UGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgICAgICB0b3RhbEFtb3VudCA9IHRvdGFsQW1vdW50LnBsdXMocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b3RhbEFtb3VudC5pc0VxdWFsVG8oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHggdG90YWwgYW1vdW50IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdG90YWwgYW1vdW50IGZpZWxkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcigpLmZyb20oQnVmZmVyLmZyb20ocmF3VHgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBjb25zdCBleHBsYWluZWRUeCA9IHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhyZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbmV3IFRvbldlYi5BZGRyZXNzKGRlc3RpbmF0aW9uLmFkZHJlc3MpLnRvU3RyaW5nKHRydWUsIHRydWUsIHRydWUpLFxuICAgICAgICAgIGFtb3VudDogQmlnSW50KHJlY2lwaWVudC5hbW91bnQpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZE91dHB1dHMgPSBleHBsYWluZWRUeC5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbmV3IFRvbldlYi5BZGRyZXNzKG91dHB1dC5hZGRyZXNzKS50b1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICBhbW91bnQ6IEJpZ0ludChvdXRwdXQuYW1vdW50KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFfLmlzRXF1YWwoZmlsdGVyZWRPdXRwdXRzLCBmaWx0ZXJlZFJlY2lwaWVudHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHggb3V0cHV0cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgIH1cbiAgICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudHMgb2YgdHhQYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgICB0b3RhbEFtb3VudCA9IHRvdGFsQW1vdW50LnBsdXMocmVjaXBpZW50cy5hbW91bnQpO1xuICAgICAgfVxuICAgICAgaWYgKCF0b3RhbEFtb3VudC5pc0VxdWFsVG8oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHRvdGFsIGFtb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHRvdGFsIGFtb3VudCBmaWVsZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBrZXljaGFpbnMsIGFkZHJlc3M6IG5ld0FkZHJlc3MsIGluZGV4IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MobmV3QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7bmV3QWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbYWRkcmVzcywgbWVtb0lkXSA9IG5ld0FkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG5cbiAgICAvLyBUT04gc3VwcG9ydHMgbWVtb0lkIGZvciBhZGRyZXNzIHRhZ2dpbmcgLSB2ZXJpZnkgaXQgbWF0Y2hlcyB0aGUgaW5kZXhcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICByZXR1cm4gbWVtb0lkID09PSBgJHtpbmRleH1gO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyk7XG5cbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gJ20vJyArIGluZGV4O1xuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSBhd2FpdCBVdGlscy5kZWZhdWx0LmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgcmV0dXJuIGFkZHJlc3MgPT09IGV4cGVjdGVkQWRkcmVzcztcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBUb25QYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IGZhY3RvcnkuZnJvbShCdWZmZXIuZnJvbShwYXJhbXMudHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMudG9BZGRyZXNzQm91bmNlYWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIudG9BZGRyZXNzQm91bmNlYWJsZShwYXJhbXMudG9BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRyYW5zYWN0aW9uQnVpbGRlci5mcm9tQWRkcmVzc0JvdW5jZWFibGUocGFyYW1zLmZyb21BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSByZWJ1aWx0VHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogcGFyc2VkVHJhbnNhY3Rpb24uc2VuZGVyLFxuICAgICAgICAgIGFtb3VudDogcGFyc2VkVHJhbnNhY3Rpb24uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHBhcnNlZFRyYW5zYWN0aW9uLmRlc3RpbmF0aW9uLFxuICAgICAgICAgIGFtb3VudDogcGFyc2VkVHJhbnNhY3Rpb24uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBUb25LZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBUb25LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZGRyZXNzQmFzZTY0ID0gYWRkcmVzcy5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGFkZHJlc3NCYXNlNjQuc3BsaXQoJz9tZW1vSWQ9JylbMF0sICdiYXNlNjQnKTtcbiAgICAgIHJldHVybiBidWYubGVuZ3RoID09PSAzNjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyBnZXRTaWduYWJsZVBheWxvYWQoc2VyaWFsaXplZFR4OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICh0aGlzLmdldENoYWluKCkgPT09ICd0dG9uJykge1xuICAgICAgcmV0dXJuIGdldFNpZ25hYmxlUGF5bG9hZFdhc20oc2VyaWFsaXplZFR4KTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCBmYWN0b3J5LmZyb20oc2VyaWFsaXplZFR4KS5idWlsZCgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBpZiAodGhpcy5nZXRDaGFpbigpID09PSAndHRvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHR4QmFzZTY0ID0gQnVmZmVyLmZyb20ocGFyYW1zLnR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZXhwbGFpblRvblRyYW5zYWN0aW9uKHsgdHhCYXNlNjQsIHRvQWRkcmVzc0JvdW5jZWFibGU6IHBhcmFtcy50b0FkZHJlc3NCb3VuY2VhYmxlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IGZhY3RvcnkuZnJvbShCdWZmZXIuZnJvbShwYXJhbXMudHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuXG4gICAgICBjb25zdCB7IHRvQWRkcmVzc0JvdW5jZWFibGUsIGZyb21BZGRyZXNzQm91bmNlYWJsZSB9ID0gcGFyYW1zO1xuXG4gICAgICBpZiAodHlwZW9mIHRvQWRkcmVzc0JvdW5jZWFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIudG9BZGRyZXNzQm91bmNlYWJsZSh0b0FkZHJlc3NCb3VuY2VhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmcm9tQWRkcmVzc0JvdW5jZWFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKGZyb21BZGRyZXNzQm91bmNlYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zYWN0aW9uQnVpbGRlci5idWlsZCgpO1xuICAgICAgcmV0dXJuIHJlYnVpbHRUcmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS50b25Ob2RlVXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY3JpbWluYXRlZCB1bmlvbiBjYXJyeWluZyBrZXljYXJkIHZlcnNpb24gYW5kIGRlY3J5cHRlZCBWMSB1c2VyIGtleSAodG8gYXZvaWQgcmUtZGVjcnlwdGlvbikuXG4gICAqIFYxIGtleWNhcmRzIGFyZSBKU09OOyBWMiBrZXljYXJkcyBhcmUgQ0JPUi1lbmNvZGVkIHJlZHVjZWQga2V5IHNoYXJlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleTogc3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcpOiBQcm9taXNlPEVkZHNhU2lnbmluZ01hdGVyaWFsPiB7XG4gICAgcmV0dXJuIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXksIHdhbGxldFBhc3NwaHJhc2UsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWNyeXB0S2V5Y2hhaW4oZW5jcnlwdGVkS2V5OiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB7IGVuY3J5cHRlZFBydjogZW5jcnlwdGVkS2V5IH0sIHBhc3NwaHJhc2UpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgJHtsYWJlbH0ga2V5Y2hhaW46IGludmFsaWQgcGFzc3dvcmQgb3IgY29ycnVwdGVkIGtleWApO1xuICAgIH1cbiAgICByZXR1cm4gcHJ2O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRSZWNvdmVyeVNpZ25hdHVyZShcbiAgICBzaWduaW5nTWF0ZXJpYWw6IEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHNlbmRlckFkZHI6IHN0cmluZyxcbiAgICB1bnNpZ25lZFRyYW5zYWN0aW9uOiBhbnksXG4gICAgY3VyclBhdGg6IHN0cmluZyxcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIGJhY2t1cEtleTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2lnbmluZ01hdGVyaWFsLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCh7XG4gICAgICAgIG1lc3NhZ2U6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLFxuICAgICAgICB1c2VyS2V5OiBzaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgZGVyaXZhdGlvblBhdGg6IGN1cnJQYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyQWRkciB9IGFzIFB1YmxpY0tleSwgc2lnbmF0dXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2Uoc2lnbmluZ01hdGVyaWFsLnVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcbiAgICAgIGNvbnN0IGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuZGVjcnlwdEtleWNoYWluKGJhY2t1cEtleSwgd2FsbGV0UGFzc3BocmFzZSwgJ2JhY2t1cCcpO1xuICAgICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlSGV4ID0gYXdhaXQgRUREU0FNZXRob2RzLmdldFRTU1NpZ25hdHVyZShcbiAgICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBjdXJyUGF0aCxcbiAgICAgICAgdW5zaWduZWRUcmFuc2FjdGlvblxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlckFkZHIgfSBhcyBQdWJsaWNLZXksIHNpZ25hdHVyZUhleCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVjb3ZlcihcbiAgICBwYXJhbXM6IE1QQ1JlY292ZXJ5T3B0aW9ucyAmIHsgamV0dG9uTWFzdGVyPzogc3RyaW5nOyBzZW5kZXJKZXR0b25BZGRyZXNzPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxNUENUeCB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYXBpS2V5Jyk7XG4gICAgfVxuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy51c2VyS2V5ICYmICFwYXJhbXMuYmFja3VwS2V5ICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcblxuICAgIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHRvbndlYiA9IG5ldyBUb25XZWIobmV3IFRvbldlYi5IdHRwUHJvdmlkZXIodGhpcy5nZXRQdWJsaWNOb2RlVXJsKCksIHsgYXBpS2V5OiBwYXJhbXMuYXBpS2V5IH0pKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgY29uc3QgaW5kZXggPSBwYXJhbXMuaW5kZXggfHwgMDtcbiAgICBjb25zdCBjdXJyUGF0aCA9IHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpICsgYC8ke2luZGV4fWAgOiBgbS8ke2luZGV4fWA7XG4gICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGN1cnJQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkciA9IGF3YWl0IFV0aWxzLmRlZmF1bHQuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoYWNjb3VudElkKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdG9ud2ViLmdldEJhbGFuY2Uoc2VuZGVyQWRkcik7XG5cbiAgICBjb25zdCBqZXR0b25CYWxhbmNlczogeyBtaW50ZXJBZGRyZXNzPzogc3RyaW5nOyB3YWxsZXRBZGRyZXNzOiBzdHJpbmc7IGJhbGFuY2U6IHN0cmluZyB9W10gPSBbXTtcbiAgICBpZiAocGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpldHRvbldhbGxldERhdGEgPSBhd2FpdCB0b253ZWIucHJvdmlkZXIuY2FsbChwYXJhbXMuc2VuZGVySmV0dG9uQWRkcmVzcywgJ2dldF93YWxsZXRfZGF0YScpO1xuICAgICAgICBjb25zdCBqZXR0b25CYWxhbmNlID0gamV0dG9uV2FsbGV0RGF0YS5zdGFja1swXVsxXTtcbiAgICAgICAgaWYgKGpldHRvbkJhbGFuY2UgJiYgbmV3IEJpZ051bWJlcihqZXR0b25CYWxhbmNlKS5ndCgwKSkge1xuICAgICAgICAgIGpldHRvbkJhbGFuY2VzLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0QWRkcmVzczogcGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3MsXG4gICAgICAgICAgICBiYWxhbmNlOiBqZXR0b25CYWxhbmNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHF1ZXJ5IGpldHRvbiBiYWxhbmNlIGZvciBhZGRyZXNzICR7cGFyYW1zLnNlbmRlckpldHRvbkFkZHJlc3N9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBXYWxsZXRDbGFzcyA9IHRvbndlYi53YWxsZXQuYWxsWyd2NFIyJ107XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldENsYXNzKHRvbndlYi5wcm92aWRlciwge1xuICAgICAgcHVibGljS2V5OiB0b253ZWIudXRpbHMuaGV4VG9CeXRlcyhhY2NvdW50SWQpLFxuICAgICAgd2M6IDAsXG4gICAgfSk7XG4gICAgY29uc3Qgc2Vxbm9SZXN1bHQgPSBhd2FpdCB3YWxsZXQubWV0aG9kcy5zZXFubygpLmNhbGwoKTtcbiAgICBjb25zdCBzZXFubzogbnVtYmVyID0gc2Vxbm9SZXN1bHQgIT09IG51bGwgJiYgc2Vxbm9SZXN1bHQgIT09IHVuZGVmaW5lZCA/IHNlcW5vUmVzdWx0IDogMDtcblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBjb25zdCBleHBpcmVBdCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDFlMykgKyA2MCAqIDYwICogMjQgKiA3O1xuXG4gICAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGxldCB1bnNpZ25lZFRyYW5zYWN0aW9uOiBhbnk7XG4gICAgbGV0IGZlZUVzdGltYXRlOiBudW1iZXI7XG4gICAgbGV0IHRyYW5zYWN0aW9uVHlwZTogJ3RvbicgfCAnamV0dG9uJztcblxuICAgIGlmICgocGFyYW1zLmpldHRvbk1hc3RlciB8fCBwYXJhbXMuc2VuZGVySmV0dG9uQWRkcmVzcykgJiYgamV0dG9uQmFsYW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgamV0dG9uSW5mbyA9IGpldHRvbkJhbGFuY2VzWzBdO1xuICAgICAgY29uc3QgdG9uQW1vdW50ID0gJzUwMDAwMDAwJztcbiAgICAgIGNvbnN0IGZvcndhcmRUb25BbW91bnQgPSAnMSc7XG5cbiAgICAgIGNvbnN0IHRvdGFsUmVxdWlyZWRUb24gPSBuZXcgQmlnTnVtYmVyKHRvbkFtb3VudCkucGx1cyhuZXcgQmlnTnVtYmVyKGZvcndhcmRUb25BbW91bnQpKTtcbiAgICAgIGlmIChuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLmx0KHRvdGFsUmVxdWlyZWRUb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5zdWZmaWNpZW50IFRPTiBiYWxhbmNlIGZvciBqZXR0b24gdHJhbnNmZXIuIFJlcXVpcmVkOiAke3RvdGFsUmVxdWlyZWRUb24udG9TdHJpbmcoKX0gbmFub1RPTiwgQXZhaWxhYmxlOiAke2JhbGFuY2V9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcilcbiAgICAgICAgLnNlcXVlbmNlTnVtYmVyKHNlcW5vKVxuICAgICAgICAucHVibGljS2V5KGFjY291bnRJZClcbiAgICAgICAgLmV4cGlyZVRpbWUoZXhwaXJlQXQpO1xuXG4gICAgICAodHhCdWlsZGVyIGFzIFRva2VuVHJhbnNmZXJCdWlsZGVyKS5yZWNpcGllbnQoXG4gICAgICAgIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBqZXR0b25JbmZvLndhbGxldEFkZHJlc3MsXG4gICAgICAgIHRvbkFtb3VudCxcbiAgICAgICAgamV0dG9uSW5mby5iYWxhbmNlLFxuICAgICAgICBmb3J3YXJkVG9uQW1vdW50XG4gICAgICApO1xuXG4gICAgICB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBmZWVFc3RpbWF0ZSA9IHBhcnNlSW50KHRvbkFtb3VudCwgMTApO1xuICAgICAgdHJhbnNhY3Rpb25UeXBlID0gJ2pldHRvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLmlzRXF1YWxUbygwKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignRGlkIG5vdCBmaW5kIGFkZHJlc3Mgd2l0aCBUT04gYmFsYW5jZSB0byByZWNvdmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvbkZlZUVzdGltYXRlID0gYXdhaXQgZ2V0RmVlRXN0aW1hdGUod2FsbGV0LCBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYmFsYW5jZSwgc2Vxbm8gYXMgbnVtYmVyKTtcblxuICAgICAgY29uc3QgdG90YWxGZWVFc3RpbWF0ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICh0b25GZWVFc3RpbWF0ZS5zb3VyY2VfZmVlcy5pbl9md2RfZmVlICtcbiAgICAgICAgICB0b25GZWVFc3RpbWF0ZS5zb3VyY2VfZmVlcy5zdG9yYWdlX2ZlZSArXG4gICAgICAgICAgdG9uRmVlRXN0aW1hdGUuc291cmNlX2ZlZXMuZ2FzX2ZlZSArXG4gICAgICAgICAgdG9uRmVlRXN0aW1hdGUuc291cmNlX2ZlZXMuZndkX2ZlZSkgKlxuICAgICAgICAgIDEuNVxuICAgICAgKTtcblxuICAgICAgaWYgKG5ldyBCaWdOdW1iZXIodG90YWxGZWVFc3RpbWF0ZSkuZ3RlKGJhbGFuY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5zdWZmaWNpZW50IFRPTiBiYWxhbmNlIGZvciB0cmFuc2FjdGlvbi4gUmVxdWlyZWQ6ICR7dG90YWxGZWVFc3RpbWF0ZX0gbmFub1RPTiwgQXZhaWxhYmxlOiAke2JhbGFuY2V9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHIpXG4gICAgICAgIC5zZXF1ZW5jZU51bWJlcihzZXFubylcbiAgICAgICAgLnB1YmxpY0tleShhY2NvdW50SWQpXG4gICAgICAgIC5leHBpcmVUaW1lKGV4cGlyZUF0KTtcblxuICAgICAgKHR4QnVpbGRlciBhcyBUcmFuc2ZlckJ1aWxkZXIpLnNlbmQoe1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJhbGFuY2UpLm1pbnVzKG5ldyBCaWdOdW1iZXIodG90YWxGZWVFc3RpbWF0ZSkpLnRvU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgZmVlRXN0aW1hdGUgPSB0b3RhbEZlZUVzdGltYXRlO1xuICAgICAgdHJhbnNhY3Rpb25UeXBlID0gJ3Rvbic7XG4gICAgfVxuXG4gICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGFzc2VydChwYXJhbXMudXNlcktleSwgJ21pc3NpbmcgdXNlcktleScpO1xuICAgICAgYXNzZXJ0KHBhcmFtcy5iYWNrdXBLZXksICdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCAnbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbChwYXJhbXMudXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgYXdhaXQgdGhpcy5hZGRSZWNvdmVyeVNpZ25hdHVyZShcbiAgICAgICAgc2lnbmluZ01hdGVyaWFsLFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHIsXG4gICAgICAgIHVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIGN1cnJQYXRoLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpLFxuICAgICAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxsZXRDb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHsgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH07XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gY29tcGxldGVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgaW5wdXRzOiBPdmNJbnB1dFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGNvbXBsZXRlZFRyYW5zYWN0aW9uLmlucHV0cykge1xuICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogaW5wdXQuYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZVN0cmluZzogaW5wdXQudmFsdWUsXG4gICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoaW5wdXQudmFsdWUpLnRvTnVtYmVyKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0czogT3ZjT3V0cHV0W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIGNvbXBsZXRlZFRyYW5zYWN0aW9uLm91dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LnZhbHVlLFxuICAgICAgICAgIGNvaW5OYW1lOiBvdXRwdXQuY29pbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzcGVuZEFtb3VudCA9IGNvbXBsZXRlZFRyYW5zYWN0aW9uLmlucHV0cy5sZW5ndGggPT09IDEgPyBjb21wbGV0ZWRUcmFuc2FjdGlvbi5pbnB1dHNbMF0udmFsdWUgOiAwO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSB7IGlucHV0czogaW5wdXRzLCBvdXRwdXRzOiBvdXRwdXRzLCBzcGVuZEFtb3VudDogc3BlbmRBbW91bnQsIHR5cGU6IHRyYW5zYWN0aW9uVHlwZSB9O1xuICAgICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBmZWVFc3RpbWF0ZSwgZmVlU3RyaW5nOiBmZWVFc3RpbWF0ZS50b1N0cmluZygpIH07XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHtcbiAgICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICAgIHNjYW5JbmRleDogaW5kZXgsXG4gICAgICAgIGNvaW46IHdhbGxldENvaW4sXG4gICAgICAgIHNpZ25hYmxlSGV4OiBjb21wbGV0ZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogY3VyclBhdGgsXG4gICAgICAgIHBhcnNlZFR4OiBwYXJzZWRUeCxcbiAgICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgICAgY29pblNwZWNpZmljOiBjb2luU3BlY2lmaWMsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBjb21wbGV0ZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgICBzY2FuSW5kZXg6IGluZGV4LFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZnVuZHMgc3dlZXAgcmVjb3ZlcnkgdHJhbnNhY3Rpb24ocykgd2l0aG91dCBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge01QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29tYmluZSB0aGUgc2lnbmF0dXJlc1xuICAgKiBhbmQgdHJhbnNhY3Rpb25zIHRvIGNyZWF0ZSBicm9hZGNhc3RhYmxlIHRyYW5zYWN0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyB7TVBDVHhzfSBhcnJheSBvZiB0aGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5ncyBhbmQgaW5kaWNlc1xuICAgKiBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nIHN3ZXB0XG4gICAqL1xuICBhc3luYyBjcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXM6IE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHM+IHtcbiAgICBjb25zdCByZXEgPSBwYXJhbXMuc2lnbmF0dXJlU2hhcmVzO1xuICAgIGNvbnN0IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnM6IE1QQ1R4W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVxW2ldLnR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIGNvbnN0IG92YyA9IHJlcVtpXS5vdmM/LlswXTtcbiAgICAgIGNvbnN0IG1wY3YyU2lnbmF0dXJlSGV4ID0gb3ZjPy5lZGRzYU1wY3YyU2lnbmF0dXJlO1xuICAgICAgaWYgKCFvdmMgfHwgKCFtcGN2MlNpZ25hdHVyZUhleCAmJiAhb3ZjLmVkZHNhU2lnbmF0dXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlKHMpJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLnNpZ25hYmxlSGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzaWduYWJsZSBoZXgnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbi5zaWduYWJsZUhleCEsICdoZXgnKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcigpLmZyb20odHJhbnNhY3Rpb24uc2VyaWFsaXplZFR4IGFzIHN0cmluZyk7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNvbW1vbiBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmNvbW1vbktleWNoYWluISBhcyBzdHJpbmc7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmRlcml2YXRpb25QYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBkZXJpdmF0aW9uIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGggYXMgc3RyaW5nO1xuICAgICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIGRlcml2YXRpb25QYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgICBjb25zdCB0b25LZXlQYWlyID0gbmV3IFRvbktleVBhaXIoeyBwdWI6IGFjY291bnRJZCB9KTtcbiAgICAgIGxldCBzaWduYXR1cmVIZXg6IEJ1ZmZlcjtcbiAgICAgIGlmIChtcGN2MlNpZ25hdHVyZUhleCkge1xuICAgICAgICAvLyBNUEN2MiAoT1ZDIDUtcGFzcyk6IHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLiBWZXJpZnkgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gc2FtZSBkZXJpdmVkIHB1YmxpYyBrZXkgdGhlIHRyYW5zYWN0aW9uIGlzIHNpZ25lZCB1bmRlciwgdGhlbiBlbWJlZCBhcy1pcy5cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20obXBjdjJTaWduYXR1cmVIZXgsICdoZXgnKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZUJ1ZmZlciwgc2lnbmF0dXJlLCBCdWZmZXIuZnJvbShhY2NvdW50SWQsICdoZXgnKSk7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYXR1cmVIZXggPSBzaWduYXR1cmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VCdWZmZXIsIG92Yy5lZGRzYVNpZ25hdHVyZSk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hdHVyZUhleCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgIEJ1ZmZlci5mcm9tKG92Yy5lZGRzYVNpZ25hdHVyZS5SLCAnaGV4JyksXG4gICAgICAgICAgQnVmZmVyLmZyb20ob3ZjLmVkZHNhU2lnbmF0dXJlLnNpZ21hLCAnaGV4JyksXG4gICAgICAgIF0pO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgY29tYmluZWQgc2lnbmF0dXJlIGZyb20gb3ZjXG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0b25LZXlQYWlyLmdldEtleXMoKS5wdWIgfSwgc2lnbmF0dXJlSGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLnB1c2goe1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiB0cmFuc2FjdGlvbi5zY2FuSW5kZXgsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGkgPT09IHJlcS5sZW5ndGggLSAxICYmIHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCkge1xuICAgICAgICBsYXN0U2NhbkluZGV4ID0gdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4IGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyB0cmFuc2FjdGlvbnM6IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnMsIGxhc3RTY2FuSW5kZXggfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleSh7IHB1YmxpY0tleSwgcHJ2LCBtdWx0aVNpZ1R5cGUgfTogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtdWx0aVNpZ1R5cGUnKTtcbiAgICB9XG4gICAgYXVkaXRFZGRzYVByaXZhdGVLZXkocHJ2LCBwdWJsaWNLZXkgPz8gJycpO1xuICB9XG59XG4iXX0=