@bitgo/sdk-coin-iota 2.2.1 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +4 -2
- package/dist/test/unit/iota.js +28 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
package/dist/src/iota.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EAGT,oBAAoB,
|
|
1
|
+
{"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"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"}
|
package/dist/src/iota.js
CHANGED
|
@@ -645,7 +645,9 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
645
645
|
const userKey = params.userKey.replace(/\s/g, '');
|
|
646
646
|
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
647
647
|
const bitgoKey = params.bitgoKey.replace(/\s/g, '');
|
|
648
|
-
const signingMaterial =
|
|
648
|
+
const signingMaterial = (0, sdk_core_1.isEddsaSigningMaterial)(precomputedMaterial)
|
|
649
|
+
? precomputedMaterial
|
|
650
|
+
: await this.getEddsaSigningMaterial(userKey, params.walletPassphrase);
|
|
649
651
|
let signatureBuffer;
|
|
650
652
|
if (signingMaterial.version === 'v2') {
|
|
651
653
|
signatureBuffer = await this.signIotaMpcV2Recovery({
|
|
@@ -897,4 +899,4 @@ class Iota extends sdk_core_1.BaseCoin {
|
|
|
897
899
|
}
|
|
898
900
|
}
|
|
899
901
|
exports.Iota = Iota;
|
|
900
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWdDeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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L0MsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBOWtDRCxvQkE4a0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEVudmlyb25tZW50cyxcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwgYXMgc2hhcmVkR2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDUmVjb3ZlcnlPcHRpb25zLFxuICBNUENTd2VlcFR4cyxcbiAgTVBDVHgsXG4gIE1QQ1R4cyxcbiAgTVBDVHlwZSxcbiAgTVBDVW5zaWduZWRUeCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUG9wdWxhdGVkSW50ZW50LFxuICBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RWRkc2FTaWduaW5nTWF0ZXJpYWx9IFtwcmVjb21wdXRlZE1hdGVyaWFsXSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIG9uY2UgYnkgdGhlXG4gICAqIGNhbGxlciAoZS5nLiByZWNvdmVyQ29uc29saWRhdGlvbnMpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgb24gZXZlcnkgbG9vcCBpdGVyYXRpb25cbiAgICpcbiAgICogQHJldHVybnMge01QQ1R4IHwgTVBDU3dlZXBUeHN9IGFycmF5IG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdzIGFuZCBpbmRpY2VzXG4gICAqIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIoXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbFxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24gYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcigwLCAnSW52YWxpZCBzdGFydGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLCBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXgpO1xuICAgIGNvbnN0IG51bUl0ZXJhdGlvbnMgPSB1dGlscy5nZXRTYWZlTnVtYmVyKERFRkFVTFRfU0NBTl9GQUNUT1IsICdJbnZhbGlkIHNjYW5uaW5nIGZhY3RvcicsIHBhcmFtcy5zY2FuKTtcbiAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIG51bUl0ZXJhdGlvbnM7XG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gKHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpIDogJ20nKSArIGAvJHtpZHh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5KTtcblxuICAgICAgLy8gVG9rZW4gcmVjb3ZlcnkgcGF0aDogcmVjb3ZlciB0aGUgdG9rZW4gcHJvdmlkZWQgYnkgdXNlclxuICAgICAgaWYgKHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmhhc1Rva2VuQmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRva2VuT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9rZW5PYmplY3RzID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBwYXJhbXMuZnVsbG5vZGVScGNVcmwsXG4gICAgICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5PYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNvdmVySW90YVRva2VuKFxuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgdG9rZW5PYmplY3RzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIGJpdGdvS2V5LFxuICAgICAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeCxcbiAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleT8ucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgdXNlcktleSAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMsIHNpZ25pbmdNYXRlcmlhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZS5zdGFydHNXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4nKSkge1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDU3dlZXBUeHMpLnR4UmVxdWVzdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1R4cykudHJhbnNhY3Rpb25zWzBdKTtcbiAgICAgIH1cbiAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggKyAxXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFcbiAgICAgIF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmxhc3RTY2FuSW5kZXggPSBsYXN0U2NhbkluZGV4O1xuICAgICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIGNvaW4gYmFsYW5jZSBmb3IgYW4gYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgVG90YWwgYmFsYW5jZSBhcyBhIGJpZ2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCYWxhbmNlKGFkZHJlc3M6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0QmFsYW5jZScsIFthZGRyZXNzLCBub3JtYWxpemVkQ29pblR5cGVdKTtcbiAgICByZXR1cm4gQmlnSW50KHJlc3BvbnNlLnRvdGFsQmFsYW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvd25lZCBvYmplY3RzIGZvciBhbiBhZGRyZXNzIHZpYSBmdWxsbm9kZSBSUEMuXG4gICAqIEhhbmRsZXMgcGFnaW5hdGlvbiB0byByZXRyaWV2ZSBhbGwgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIHRvIGZpbHRlciBvYmplY3RzIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygb3duZWQgb2JqZWN0cyB3aXRoIGJhbGFuY2UgaW5mb3JtYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybD86IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZ1xuICApOiBQcm9taXNlPElvdGFPYmplY3RXaXRoQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IGFsbE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdID0gW107XG4gICAgY29uc3QgaW5uZXJDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gYDB4Mjo6Y29pbjo6Q29pbjwke2lubmVyQ29pblR5cGV9PmA7XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBNQVhfUEFHRVMgPSA1MDA7XG4gICAgbGV0IHBhZ2VDb3VudCA9IDA7XG4gICAgd2hpbGUgKGhhc05leHRQYWdlICYmIHBhZ2VDb3VudCA8IE1BWF9QQUdFUykge1xuICAgICAgcGFnZUNvdW50Kys7XG4gICAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgICAgZmlsdGVyOiB7IFN0cnVjdFR5cGU6IHN0cnVjdFR5cGUgfSxcbiAgICAgICAgb3B0aW9uczogeyBzaG93Q29udGVudDogdHJ1ZSwgc2hvd1R5cGU6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRPd25lZE9iamVjdHMnLCBbYWRkcmVzcywgcXVlcnksIGN1cnNvciwgNTBdKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgbmV4dEN1cnNvciwgaGFzTmV4dFBhZ2U6IG1vcmUgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSB8fCBbXSkge1xuICAgICAgICBjb25zdCB7IG9iamVjdElkLCB2ZXJzaW9uLCBkaWdlc3QgfSA9IGl0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IGl0ZW0uZGF0YS5jb250ZW50Py5maWVsZHM/LmJhbGFuY2UgfHwgJzAnO1xuICAgICAgICBpZiAoQmlnSW50KGJhbGFuY2UpID4gMG4pIHtcbiAgICAgICAgICBhbGxPYmplY3RzLnB1c2goeyBvYmplY3RJZCwgdmVyc2lvbjogdmVyc2lvbi50b1N0cmluZygpLCBkaWdlc3QsIGJhbGFuY2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDdXJzb3IgPT09IGN1cnNvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc05leHRQYWdlID0gbW9yZTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2VDb3VudCA+PSBNQVhfUEFHRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgZmV0Y2hPd25lZE9iamVjdHM6IEhpdCBtYXggcGFnZSBsaW1pdCAoJHtNQVhfUEFHRVN9KSBmb3IgJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBKU09OLVJQQyBjYWxsIHRvIElPVEEgZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBGdWxsbm9kZSBSUEMgVVJMXG4gICAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJQQyBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFJQQyByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBSUEMgY2FsbCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUnBjQ2FsbCh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBjYWxsIGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGpzb24uZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGVycm9yOiAke2pzb24uZXJyb3IubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShqc29uLmVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbi5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcHVibGljIG5vZGUgUlBDIFVSTCBmcm9tIHRoZSBjZW50cmFsaXplZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBSUEMgVVJMIGZvciB0aGUgY3VycmVudCBCaXRHbyBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFB1YmxpY05vZGVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmlvdGFOb2RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hdGl2ZSBjb2luIHR5cGUgaWRlbnRpZmllciBmb3IgZmlsdGVyaW5nIG93bmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIE5hdGl2ZSBjb2luIHR5cGUgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGdldE5hdGl2ZUNvaW5UeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcweDI6OmlvdGE6OklPVEEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGdhcyBjb25maWd1cmF0aW9uIGZvciBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBHYXMgZXN0aW1hdGlvbiBpcyBkb25lIHZpYSBhIGRyeS1ydW4gb2YgYSB0ZW1wb3JhcnkgdHJhbnNhY3Rpb24sIHRoZW5cbiAgICogbXVsdGlwbGllZCBieSBERUZBVUxUX0dBU19PVkVSSEVBRCAoMS4xeCkgYXMgYSBzYWZldHkgYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZWRPYmplY3RzIC0gTmF0aXZlIElPVEEgY29pbiBvYmplY3RzIHRvIHVzZSBhcyBnYXMgcGF5bWVudFxuICAgKiBAcGFyYW0gc2VuZGVyQWRkcmVzcyAtIFNlbmRlciBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyAtIFJlY292ZXJ5IHBhcmFtZXRlcnMgKGluY2x1ZGVzIHJlY292ZXJ5RGVzdGluYXRpb24sIHJwY1VybClcbiAgICogQHBhcmFtIHBheW1lbnRPYmplY3RzIC0gT3B0aW9uYWwgdG9rZW4gb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnlcbiAgICogQHJldHVybnMgR2FzIGJ1ZGdldCwgZ2FzIHByaWNlLCBnYXMgb2JqZWN0cyBhcnJheSwgYW5kIHRvdGFsIG5hdGl2ZSBiYWxhbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgIG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICBwYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXVxuICApOiBQcm9taXNlPHtcbiAgICBnYXNCdWRnZXQ6IG51bWJlcjtcbiAgICBnYXNQcmljZTogbnVtYmVyO1xuICAgIGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICB0b3RhbEJhbGFuY2U6IGJpZ2ludDtcbiAgfT4ge1xuICAgIGNvbnN0IGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IG93bmVkT2JqZWN0cy5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG90YWxCYWxhbmNlID0gb3duZWRPYmplY3RzLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcblxuICAgIGNvbnN0IGdhc1ByaWNlID0gYXdhaXQgdGhpcy5mZXRjaEdhc1ByaWNlKHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG5cbiAgICAvLyBCdWlsZCB0ZW1wIHRyYW5zYWN0aW9uIGZvciBlc3RpbWF0aW9uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHRlbXBCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICBjb25zdCBlc3RpbWF0aW9uQW1vdW50ID0gdG90YWxCYWxhbmNlID4gMG4gPyAnMScgOiAnMCc7XG5cbiAgICB0ZW1wQnVpbGRlci5zZW5kZXIoc2VuZGVyQWRkcmVzcykucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBlc3RpbWF0aW9uQW1vdW50IH1dKTtcblxuICAgIGlmIChwYXltZW50T2JqZWN0cyAmJiBwYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhwYXltZW50T2JqZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKGdhc09iamVjdHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBUeCA9IGF3YWl0IHRlbXBCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgZXN0aW1hdGVkR2FzID0gYXdhaXQgdGhpcy5lc3RpbWF0ZUdhcyhhd2FpdCB0ZW1wVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICBjb25zdCBnYXNCdWRnZXQgPSBNYXRoLm1pbihNQVhfR0FTX0JVREdFVCwgTWF0aC50cnVuYyhlc3RpbWF0ZWRHYXMgKiBERUZBVUxUX0dBU19PVkVSSEVBRCkpO1xuXG4gICAgcmV0dXJuIHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXJJb3RhVG9rZW4oXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgaWR4OiBudW1iZXIsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAodG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID4gTUFYX09CSkVDVF9MSU1JVCkge1xuICAgICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfT0JKRUNUX0xJTUlUKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b2tlbkJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG4gICAgaWYgKHRva2VuQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIGdhcyBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZ2FzIGJhbGFuY2UgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b2tlbkJhbGFuY2UudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAucGF5bWVudE9iamVjdHModG9rZW5PYmplY3RzKVxuICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCB0b2tlbkNvaW4gPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGlkeCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICB0eEJ1aWxkZXIsXG4gICAgICBwYXJhbXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICB1bnNpZ25lZFR4LFxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgTVBDdjEgdnMgTVBDdjIga2V5Y2FyZCBmb3JtYXQgYW5kIHJldHVybnMgdHlwZWQgc2lnbmluZyBtYXRlcmlhbC5cbiAgICogV3JhcHBlZCBhcyBhIHByb3RlY3RlZCBtZXRob2Qgc28gc2lub24gY2FuIHN0dWIgaXQgaW4gdGVzdHMgKG1hdGNoaW5nIERPVC9TVUkpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXk6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICAgIHJldHVybiBzaGFyZWRHZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCB3YWxsZXRQYXNzcGhyYXNlLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBNUEN2MiAoTVBTKSByZWNvdmVyeSBzaWduaW5nIGZsb3cgYW5kIHJldHVybnMgdGhlIHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLlxuICAgKiBXcmFwcGVkIGFzIGEgcHJvdGVjdGVkIG1ldGhvZCBzbyBzaW5vbiBjYW4gc3R1YiBpdCBpbiB0ZXN0cyAobWF0Y2hpbmcgRE9UL1NVSSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2lnbklvdGFNcGNWMlJlY292ZXJ5KHBhcmFtczogUGFyYW1ldGVyczx0eXBlb2Ygc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4PlswXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXBhcmFtcy51c2VyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbCA/PyAoYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpO1xuXG4gICAgbGV0IHNpZ25hdHVyZUJ1ZmZlcjogQnVmZmVyO1xuXG4gICAgaWYgKHNpZ25pbmdNYXRlcmlhbC52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCB0aGlzLnNpZ25Jb3RhTXBjVjJSZWNvdmVyeSh7XG4gICAgICAgIG1lc3NhZ2U6IHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLFxuICAgICAgICB1c2VyS2V5OiBzaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShzaWduaW5nTWF0ZXJpYWwudXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgICBsZXQgYmFja3VwUHJ2OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBiYWNrdXBQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUREU0FNZXRob2RUeXBlcy5CYWNrdXBTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIC8vIEdlbmVyYXRlIFRTUyBzaWduYXR1cmVcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHVuc2lnbmVkVHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZnVsbCBzaWduYXR1cmU6IHNjaGVtZV9mbGFnICgxIGJ5dGUpICsgc2lnbmF0dXJlICg2NCBieXRlcykgKyBwdWJsaWNfa2V5ICgzMiBieXRlcylcbiAgICBjb25zdCBzY2hlbWVGbGFnID0gQnVmZmVyLmFsbG9jKDEsIDB4MDApOyAvLyBFZDI1NTE5IHNjaGVtZVxuICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZFB1YmxpY0tleSwgJ2hleCcpO1xuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzY2hlbWVGbGFnLCBzaWduYXR1cmVCdWZmZXIsIHB1YmxpY0tleUJ5dGVzXSk7XG5cbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkZXJpdmVkUHVibGljS2V5IH0sIHNpZ25hdHVyZUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gZnVsbFNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjdXJyZW50IHJlZmVyZW5jZSBnYXMgcHJpY2UgZnJvbSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgQ3VycmVudCBnYXMgcHJpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hHYXNQcmljZShycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldFJlZmVyZW5jZUdhc1ByaWNlJywgW10pO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZXMgZ2FzIGZvciBhIHRyYW5zYWN0aW9uIHZpYSBkcnkgcnVuLlxuICAgKlxuICAgKiBAcGFyYW0gdHhCYXNlNjQgLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgZm9ybWF0XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEVzdGltYXRlZCBnYXMgY29zdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlc3RpbWF0ZUdhcyh0eEJhc2U2NDogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGFfZHJ5UnVuVHJhbnNhY3Rpb25CbG9jaycsIFt0eEJhc2U2NF0pO1xuXG4gICAgY29uc3QgY29tcHV0YXRpb25Db3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5jb21wdXRhdGlvbkNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZUNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlUmViYXRlID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlUmViYXRlLCAxMCk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0YXRpb25Db3N0ICsgc3RvcmFnZUNvc3QgLSBzdG9yYWdlUmViYXRlLCBjb21wdXRhdGlvbkNvc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBzY2FuSW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzPzogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogc2VyaWFsaXplZFR4SGV4IH0pO1xuICAgIGNvbnN0IHdhbGxldENvaW4gPSB0b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCB0aGlzLmdldENoYWluKCk7XG4gICAgY29uc3QgcGFyc2VkT3V0cHV0cyA9IHBhcnNlZFR4Lm91dHB1dHMgYXMgQXJyYXk8eyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0+O1xuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZE91dHB1dHNbMF07XG5cbiAgICAvLyBCdWlsZCBwYXJzZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZyb20gcGFyc2VkIGRhdGFcbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgY29tcGxldGVkUGFyc2VkVHggPSB7XG4gICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgIG91dHB1dHM6IG91dHB1dHMsXG4gICAgICBzcGVuZEFtb3VudDogb3V0cHV0LmFtb3VudCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgIH07XG5cbiAgICBjb25zdCBmZWUgPSBwYXJzZWRUeC5mZWUgYXMgQmlnTnVtYmVyO1xuICAgIGNvbnN0IGZlZUluZm8gPSB7IGZlZTogZmVlLnRvTnVtYmVyKCksIGZlZVN0cmluZzogZmVlLnRvU3RyaW5nKCkgfTtcbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB7IGNvbW1vbktleWNoYWluOiBiaXRnb0tleSB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICBzY2FuSW5kZXgsXG4gICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgcGFyc2VkVHg6IGNvbXBsZXRlZFBhcnNlZFR4LFxuICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgIGNvaW5TcGVjaWZpYzogY29pblNwZWNpZmljLFxuICAgIH07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4V3JhcHBlcjogTVBDVW5zaWduZWRUeCA9IHsgdW5zaWduZWRUeDogdHJhbnNhY3Rpb24sIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFJlY292ZXJ5VHhSZXF1ZXN0ID0geyB0cmFuc2FjdGlvbnM6IFt1bnNpZ25lZFR4V3JhcHBlcl0sIHdhbGxldENvaW4gfTtcbiAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBleHRyYWN0cyB0cmFuc2FjdGlvbiBoZXggZnJvbSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHR4SGV4IGlzIG1pc3NpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbmApO1xuICAgIH1cbiAgICByZXR1cm4gdHhIZXg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGEgVHJhbnNmZXJUcmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gaXMgbm90IGEgVHJhbnNmZXJUcmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zZmVyVHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG5vdCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBtYXRjaCB0aGUgZXhwZWN0ZWQgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZXhwZWN0ZWRSZWNpcGllbnRzIC0gVGhlIGV4cGVjdGVkIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAgICogQHRocm93cyBFcnJvciBpZiByZWNpcGllbnRzIGRvbid0IG1hdGNoXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyhcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBleHBlY3RlZFJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCkgYXMgVHJhbnNmZXJUeERhdGE7XG5cbiAgICBpZiAoIXR4RGF0YS5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsUmVjaXBpZW50cyA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyh0eERhdGEucmVjaXBpZW50cyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHMoZXhwZWN0ZWRSZWNpcGllbnRzKTtcblxuICAgIGlmICghdGhpcy5yZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQsIGFjdHVhbFJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgcmVjaXBpZW50cyBieSBleHRyYWN0aW5nIG9ubHkgcmVsZXZhbnQgZmllbGRzLlxuICAgKiBAcGFyYW0gcmVjaXBpZW50cyAtIFJlY2lwaWVudHMgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgcmVjaXBpZW50cyB3aXRoIGFkZHJlc3MsIGFtb3VudCwgYW5kIHRva2VuTmFtZSBvbmx5XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlY2lwaWVudHMocmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50JywgJ3Rva2VuTmFtZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGV4cGVjdGVkIHJlY2lwaWVudHMgbWF0Y2ggYWN0dWFsIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSBleHBlY3RlZCAtIEV4cGVjdGVkIHJlY2lwaWVudHNcbiAgICogQHBhcmFtIGFjdHVhbCAtIEFjdHVhbCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgcmVjaXBpZW50cyBhcmUgZm91bmQgaW4gYWN0dWFsIHJlY2lwaWVudHNcbiAgICovXG4gIHByaXZhdGUgcmVjaXBpZW50c01hdGNoKGV4cGVjdGVkOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBhY3R1YWw6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoKGV4cGVjdGVkUmVjaXBpZW50KSA9PlxuICAgICAgYWN0dWFsLnNvbWUoKGFjdHVhbFJlY2lwaWVudCkgPT4gXy5pc0VxdWFsKGV4cGVjdGVkUmVjaXBpZW50LCBhY3R1YWxSZWNpcGllbnQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbXB0eSBwYXJzZWQgdHJhbnNhY3Rpb24gcmVzdWx0LlxuICAgKiBVc2VkIHdoZW4gdHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IG5ldyBCaWdOdW1iZXIoMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgZnJvbSB0aGUgZXhwbGFuYXRpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBUaGUgZmVlIGFzIGEgQmlnTnVtYmVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQmlnTnVtYmVyIHtcbiAgICBpZiAoZXhwbGFuYXRpb24uZmVlLmZlZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5mZWUuZmVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGlucHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEluY2x1ZGVzIHNlbmRlciBpbnB1dCBhbmQgb3B0aW9uYWxseSBzcG9uc29yIGlucHV0IGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcGFyYW0gZmVlIC0gVGhlIGNhbGN1bGF0ZWQgdHJhbnNhY3Rpb24gZmVlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uSW5wdXRzKFxuICAgIGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIGZlZTogQmlnTnVtYmVyXG4gICk6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50KTtcblxuICAgIC8vIElmIHRoZXJlJ3MgYSBzcG9uc29yLCBzZW5kZXIgb25seSBwYXlzIGZvciBvdXRwdXRzXG4gICAgLy8gT3RoZXJ3aXNlLCBzZW5kZXIgcGF5cyBmb3Igb3V0cHV0cyArIGZlZVxuICAgIGNvbnN0IHNlbmRlckFtb3VudCA9IGV4cGxhbmF0aW9uLnNwb25zb3IgPyBvdXRwdXRBbW91bnQudG9GaXhlZCgpIDogb3V0cHV0QW1vdW50LnBsdXMoZmVlKS50b0ZpeGVkKCk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogc2VuZGVyQW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudFxuICAgIGlmIChleHBsYW5hdGlvbi5zcG9uc29yKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGV4cGxhbmF0aW9uLnNwb25zb3IsXG4gICAgICAgIGFtb3VudDogZmVlLnRvRml4ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvdXRwdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIG91dHB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbk91dHB1dHMoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uLm91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZhY3RvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZm9yIHRoaXMgY29pblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUeEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gcmVidWlsZFxuICAgKiBAcmV0dXJucyBUaGUgcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSByZWJ1aWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlckZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHhCdWlsZGVyRmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIHJldHVybiAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbjogJHtlcnIudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
902
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWlDeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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R0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBL2tDRCxvQkEra0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEVudmlyb25tZW50cyxcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwgYXMgc2hhcmVkR2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIGlzRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDUmVjb3ZlcnlPcHRpb25zLFxuICBNUENTd2VlcFR4cyxcbiAgTVBDVHgsXG4gIE1QQ1R4cyxcbiAgTVBDVHlwZSxcbiAgTVBDVW5zaWduZWRUeCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUG9wdWxhdGVkSW50ZW50LFxuICBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RWRkc2FTaWduaW5nTWF0ZXJpYWx9IFtwcmVjb21wdXRlZE1hdGVyaWFsXSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIG9uY2UgYnkgdGhlXG4gICAqIGNhbGxlciAoZS5nLiByZWNvdmVyQ29uc29saWRhdGlvbnMpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgb24gZXZlcnkgbG9vcCBpdGVyYXRpb25cbiAgICpcbiAgICogQHJldHVybnMge01QQ1R4IHwgTVBDU3dlZXBUeHN9IGFycmF5IG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdzIGFuZCBpbmRpY2VzXG4gICAqIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIoXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbFxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24gYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcigwLCAnSW52YWxpZCBzdGFydGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLCBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXgpO1xuICAgIGNvbnN0IG51bUl0ZXJhdGlvbnMgPSB1dGlscy5nZXRTYWZlTnVtYmVyKERFRkFVTFRfU0NBTl9GQUNUT1IsICdJbnZhbGlkIHNjYW5uaW5nIGZhY3RvcicsIHBhcmFtcy5zY2FuKTtcbiAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIG51bUl0ZXJhdGlvbnM7XG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gKHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpIDogJ20nKSArIGAvJHtpZHh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5KTtcblxuICAgICAgLy8gVG9rZW4gcmVjb3ZlcnkgcGF0aDogcmVjb3ZlciB0aGUgdG9rZW4gcHJvdmlkZWQgYnkgdXNlclxuICAgICAgaWYgKHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmhhc1Rva2VuQmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRva2VuT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9rZW5PYmplY3RzID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBwYXJhbXMuZnVsbG5vZGVScGNVcmwsXG4gICAgICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5PYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNvdmVySW90YVRva2VuKFxuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgdG9rZW5PYmplY3RzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIGJpdGdvS2V5LFxuICAgICAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeCxcbiAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleT8ucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgdXNlcktleSAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMsIHNpZ25pbmdNYXRlcmlhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZS5zdGFydHNXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4nKSkge1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDU3dlZXBUeHMpLnR4UmVxdWVzdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1R4cykudHJhbnNhY3Rpb25zWzBdKTtcbiAgICAgIH1cbiAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggKyAxXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFcbiAgICAgIF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmxhc3RTY2FuSW5kZXggPSBsYXN0U2NhbkluZGV4O1xuICAgICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIGNvaW4gYmFsYW5jZSBmb3IgYW4gYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgVG90YWwgYmFsYW5jZSBhcyBhIGJpZ2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCYWxhbmNlKGFkZHJlc3M6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0QmFsYW5jZScsIFthZGRyZXNzLCBub3JtYWxpemVkQ29pblR5cGVdKTtcbiAgICByZXR1cm4gQmlnSW50KHJlc3BvbnNlLnRvdGFsQmFsYW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvd25lZCBvYmplY3RzIGZvciBhbiBhZGRyZXNzIHZpYSBmdWxsbm9kZSBSUEMuXG4gICAqIEhhbmRsZXMgcGFnaW5hdGlvbiB0byByZXRyaWV2ZSBhbGwgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIHRvIGZpbHRlciBvYmplY3RzIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygb3duZWQgb2JqZWN0cyB3aXRoIGJhbGFuY2UgaW5mb3JtYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybD86IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZ1xuICApOiBQcm9taXNlPElvdGFPYmplY3RXaXRoQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IGFsbE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdID0gW107XG4gICAgY29uc3QgaW5uZXJDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gYDB4Mjo6Y29pbjo6Q29pbjwke2lubmVyQ29pblR5cGV9PmA7XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBNQVhfUEFHRVMgPSA1MDA7XG4gICAgbGV0IHBhZ2VDb3VudCA9IDA7XG4gICAgd2hpbGUgKGhhc05leHRQYWdlICYmIHBhZ2VDb3VudCA8IE1BWF9QQUdFUykge1xuICAgICAgcGFnZUNvdW50Kys7XG4gICAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgICAgZmlsdGVyOiB7IFN0cnVjdFR5cGU6IHN0cnVjdFR5cGUgfSxcbiAgICAgICAgb3B0aW9uczogeyBzaG93Q29udGVudDogdHJ1ZSwgc2hvd1R5cGU6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRPd25lZE9iamVjdHMnLCBbYWRkcmVzcywgcXVlcnksIGN1cnNvciwgNTBdKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgbmV4dEN1cnNvciwgaGFzTmV4dFBhZ2U6IG1vcmUgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSB8fCBbXSkge1xuICAgICAgICBjb25zdCB7IG9iamVjdElkLCB2ZXJzaW9uLCBkaWdlc3QgfSA9IGl0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IGl0ZW0uZGF0YS5jb250ZW50Py5maWVsZHM/LmJhbGFuY2UgfHwgJzAnO1xuICAgICAgICBpZiAoQmlnSW50KGJhbGFuY2UpID4gMG4pIHtcbiAgICAgICAgICBhbGxPYmplY3RzLnB1c2goeyBvYmplY3RJZCwgdmVyc2lvbjogdmVyc2lvbi50b1N0cmluZygpLCBkaWdlc3QsIGJhbGFuY2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDdXJzb3IgPT09IGN1cnNvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc05leHRQYWdlID0gbW9yZTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2VDb3VudCA+PSBNQVhfUEFHRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgZmV0Y2hPd25lZE9iamVjdHM6IEhpdCBtYXggcGFnZSBsaW1pdCAoJHtNQVhfUEFHRVN9KSBmb3IgJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBKU09OLVJQQyBjYWxsIHRvIElPVEEgZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBGdWxsbm9kZSBSUEMgVVJMXG4gICAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJQQyBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFJQQyByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBSUEMgY2FsbCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUnBjQ2FsbCh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBjYWxsIGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGpzb24uZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGVycm9yOiAke2pzb24uZXJyb3IubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShqc29uLmVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbi5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcHVibGljIG5vZGUgUlBDIFVSTCBmcm9tIHRoZSBjZW50cmFsaXplZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBSUEMgVVJMIGZvciB0aGUgY3VycmVudCBCaXRHbyBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFB1YmxpY05vZGVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmlvdGFOb2RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hdGl2ZSBjb2luIHR5cGUgaWRlbnRpZmllciBmb3IgZmlsdGVyaW5nIG93bmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIE5hdGl2ZSBjb2luIHR5cGUgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGdldE5hdGl2ZUNvaW5UeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcweDI6OmlvdGE6OklPVEEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGdhcyBjb25maWd1cmF0aW9uIGZvciBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBHYXMgZXN0aW1hdGlvbiBpcyBkb25lIHZpYSBhIGRyeS1ydW4gb2YgYSB0ZW1wb3JhcnkgdHJhbnNhY3Rpb24sIHRoZW5cbiAgICogbXVsdGlwbGllZCBieSBERUZBVUxUX0dBU19PVkVSSEVBRCAoMS4xeCkgYXMgYSBzYWZldHkgYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZWRPYmplY3RzIC0gTmF0aXZlIElPVEEgY29pbiBvYmplY3RzIHRvIHVzZSBhcyBnYXMgcGF5bWVudFxuICAgKiBAcGFyYW0gc2VuZGVyQWRkcmVzcyAtIFNlbmRlciBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyAtIFJlY292ZXJ5IHBhcmFtZXRlcnMgKGluY2x1ZGVzIHJlY292ZXJ5RGVzdGluYXRpb24sIHJwY1VybClcbiAgICogQHBhcmFtIHBheW1lbnRPYmplY3RzIC0gT3B0aW9uYWwgdG9rZW4gb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnlcbiAgICogQHJldHVybnMgR2FzIGJ1ZGdldCwgZ2FzIHByaWNlLCBnYXMgb2JqZWN0cyBhcnJheSwgYW5kIHRvdGFsIG5hdGl2ZSBiYWxhbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgIG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICBwYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXVxuICApOiBQcm9taXNlPHtcbiAgICBnYXNCdWRnZXQ6IG51bWJlcjtcbiAgICBnYXNQcmljZTogbnVtYmVyO1xuICAgIGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICB0b3RhbEJhbGFuY2U6IGJpZ2ludDtcbiAgfT4ge1xuICAgIGNvbnN0IGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IG93bmVkT2JqZWN0cy5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG90YWxCYWxhbmNlID0gb3duZWRPYmplY3RzLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcblxuICAgIGNvbnN0IGdhc1ByaWNlID0gYXdhaXQgdGhpcy5mZXRjaEdhc1ByaWNlKHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG5cbiAgICAvLyBCdWlsZCB0ZW1wIHRyYW5zYWN0aW9uIGZvciBlc3RpbWF0aW9uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHRlbXBCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICBjb25zdCBlc3RpbWF0aW9uQW1vdW50ID0gdG90YWxCYWxhbmNlID4gMG4gPyAnMScgOiAnMCc7XG5cbiAgICB0ZW1wQnVpbGRlci5zZW5kZXIoc2VuZGVyQWRkcmVzcykucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBlc3RpbWF0aW9uQW1vdW50IH1dKTtcblxuICAgIGlmIChwYXltZW50T2JqZWN0cyAmJiBwYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhwYXltZW50T2JqZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKGdhc09iamVjdHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBUeCA9IGF3YWl0IHRlbXBCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgZXN0aW1hdGVkR2FzID0gYXdhaXQgdGhpcy5lc3RpbWF0ZUdhcyhhd2FpdCB0ZW1wVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICBjb25zdCBnYXNCdWRnZXQgPSBNYXRoLm1pbihNQVhfR0FTX0JVREdFVCwgTWF0aC50cnVuYyhlc3RpbWF0ZWRHYXMgKiBERUZBVUxUX0dBU19PVkVSSEVBRCkpO1xuXG4gICAgcmV0dXJuIHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXJJb3RhVG9rZW4oXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgaWR4OiBudW1iZXIsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAodG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID4gTUFYX09CSkVDVF9MSU1JVCkge1xuICAgICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfT0JKRUNUX0xJTUlUKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b2tlbkJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG4gICAgaWYgKHRva2VuQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIGdhcyBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZ2FzIGJhbGFuY2UgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b2tlbkJhbGFuY2UudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAucGF5bWVudE9iamVjdHModG9rZW5PYmplY3RzKVxuICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCB0b2tlbkNvaW4gPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGlkeCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICB0eEJ1aWxkZXIsXG4gICAgICBwYXJhbXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICB1bnNpZ25lZFR4LFxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgTVBDdjEgdnMgTVBDdjIga2V5Y2FyZCBmb3JtYXQgYW5kIHJldHVybnMgdHlwZWQgc2lnbmluZyBtYXRlcmlhbC5cbiAgICogV3JhcHBlZCBhcyBhIHByb3RlY3RlZCBtZXRob2Qgc28gc2lub24gY2FuIHN0dWIgaXQgaW4gdGVzdHMgKG1hdGNoaW5nIERPVC9TVUkpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXk6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICAgIHJldHVybiBzaGFyZWRHZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCB3YWxsZXRQYXNzcGhyYXNlLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBNUEN2MiAoTVBTKSByZWNvdmVyeSBzaWduaW5nIGZsb3cgYW5kIHJldHVybnMgdGhlIHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLlxuICAgKiBXcmFwcGVkIGFzIGEgcHJvdGVjdGVkIG1ldGhvZCBzbyBzaW5vbiBjYW4gc3R1YiBpdCBpbiB0ZXN0cyAobWF0Y2hpbmcgRE9UL1NVSSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2lnbklvdGFNcGNWMlJlY292ZXJ5KHBhcmFtczogUGFyYW1ldGVyczx0eXBlb2Ygc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4PlswXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXBhcmFtcy51c2VyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPSBpc0VkZHNhU2lnbmluZ01hdGVyaWFsKHByZWNvbXB1dGVkTWF0ZXJpYWwpXG4gICAgICA/IHByZWNvbXB1dGVkTWF0ZXJpYWxcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG5cbiAgICBsZXQgc2lnbmF0dXJlQnVmZmVyOiBCdWZmZXI7XG5cbiAgICBpZiAoc2lnbmluZ01hdGVyaWFsLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IHRoaXMuc2lnbklvdGFNcGNWMlJlY292ZXJ5KHtcbiAgICAgICAgbWVzc2FnZTogdW5zaWduZWRUeC5zaWduYWJsZVBheWxvYWQsXG4gICAgICAgIHVzZXJLZXk6IHNpZ25pbmdNYXRlcmlhbC5lbmNyeXB0ZWRVc2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIGJpdGdvOiB0aGlzLmJpdGdvLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHNpZ25pbmdNYXRlcmlhbC51c2VyUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLlVzZXJTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIGxldCBiYWNrdXBQcnY6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBiYWNrdXBLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLkJhY2t1cFNpZ25pbmdNYXRlcmlhbDtcblxuICAgICAgLy8gR2VuZXJhdGUgVFNTIHNpZ25hdHVyZVxuICAgICAgc2lnbmF0dXJlQnVmZmVyID0gYXdhaXQgRUREU0FNZXRob2RzLmdldFRTU1NpZ25hdHVyZShcbiAgICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgdW5zaWduZWRUeFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBmdWxsIHNpZ25hdHVyZTogc2NoZW1lX2ZsYWcgKDEgYnl0ZSkgKyBzaWduYXR1cmUgKDY0IGJ5dGVzKSArIHB1YmxpY19rZXkgKDMyIGJ5dGVzKVxuICAgIGNvbnN0IHNjaGVtZUZsYWcgPSBCdWZmZXIuYWxsb2MoMSwgMHgwMCk7IC8vIEVkMjU1MTkgc2NoZW1lXG4gICAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4Jyk7XG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NjaGVtZUZsYWcsIHNpZ25hdHVyZUJ1ZmZlciwgcHVibGljS2V5Qnl0ZXNdKTtcblxuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IGRlcml2ZWRQdWJsaWNLZXkgfSwgc2lnbmF0dXJlQnVmZmVyKTtcblxuICAgIHJldHVybiBmdWxsU2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGN1cnJlbnQgcmVmZXJlbmNlIGdhcyBwcmljZSBmcm9tIGZ1bGxub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcmV0dXJucyBDdXJyZW50IGdhcyBwcmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEdhc1ByaWNlKHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0UmVmZXJlbmNlR2FzUHJpY2UnLCBbXSk7XG4gICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdCwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBnYXMgZm9yIGEgdHJhbnNhY3Rpb24gdmlhIGRyeSBydW4uXG4gICAqXG4gICAqIEBwYXJhbSB0eEJhc2U2NCAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBmb3JtYXRcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIGdhcyBjb3N0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVzdGltYXRlR2FzKHR4QmFzZTY0OiBzdHJpbmcsIHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YV9kcnlSdW5UcmFuc2FjdGlvbkJsb2NrJywgW3R4QmFzZTY0XSk7XG5cbiAgICBjb25zdCBjb21wdXRhdGlvbkNvc3QgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLmNvbXB1dGF0aW9uQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VDb3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VSZWJhdGUgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLnN0b3JhZ2VSZWJhdGUsIDEwKTtcblxuICAgIHJldHVybiBNYXRoLm1heChjb21wdXRhdGlvbkNvc3QgKyBzdG9yYWdlQ29zdCAtIHN0b3JhZ2VSZWJhdGUsIGNvbXB1dGF0aW9uQ29zdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIHNjYW5JbmRleDogbnVtYmVyLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHRoaXMucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSk7XG4gICAgY29uc3Qgd2FsbGV0Q29pbiA9IHRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICBjb25zdCBwYXJzZWRPdXRwdXRzID0gcGFyc2VkVHgub3V0cHV0cyBhcyBBcnJheTx7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfT47XG4gICAgY29uc3Qgb3V0cHV0ID0gcGFyc2VkT3V0cHV0c1swXTtcblxuICAgIC8vIEJ1aWxkIHBhcnNlZCB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgZnJvbSBwYXJzZWQgZGF0YVxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LmFtb3VudCxcbiAgICAgICAgY29pbk5hbWU6IHdhbGxldENvaW4sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBjb21wbGV0ZWRQYXJzZWRUeCA9IHtcbiAgICAgIGlucHV0czogaW5wdXRzLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIHNwZW5kQW1vdW50OiBvdXRwdXQuYW1vdW50LFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsXG4gICAgfTtcblxuICAgIGNvbnN0IGZlZSA9IHBhcnNlZFR4LmZlZSBhcyBCaWdOdW1iZXI7XG4gICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBmZWUudG9OdW1iZXIoKSwgZmVlU3RyaW5nOiBmZWUudG9TdHJpbmcoKSB9O1xuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHsgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbjogTVBDVHggPSB7XG4gICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIHNjYW5JbmRleCxcbiAgICAgIGNvaW46IHdhbGxldENvaW4sXG4gICAgICBzaWduYWJsZUhleDogdW5zaWduZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJzZWRUeDogY29tcGxldGVkUGFyc2VkVHgsXG4gICAgICBmZWVJbmZvOiBmZWVJbmZvLFxuICAgICAgY29pblNwZWNpZmljOiBjb2luU3BlY2lmaWMsXG4gICAgfTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHhXcmFwcGVyOiBNUENVbnNpZ25lZFR4ID0geyB1bnNpZ25lZFR4OiB0cmFuc2FjdGlvbiwgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgIGNvbnN0IHR4UmVxdWVzdDogUmVjb3ZlcnlUeFJlcXVlc3QgPSB7IHRyYW5zYWN0aW9uczogW3Vuc2lnbmVkVHhXcmFwcGVyXSwgd2FsbGV0Q29pbiB9O1xuICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IFt0eFJlcXVlc3RdIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIHRyYW5zYWN0aW9uIGhleCBmcm9tIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEV4dHJhY3RUeEhleCh0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgYSBUcmFuc2ZlclRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBpcyBub3QgYSBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNmZXJUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0cmFuc2FjdGlvbiByZWNpcGllbnRzIG1hdGNoIHRoZSBleHBlY3RlZCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFJlY2lwaWVudHMgLSBUaGUgZXhwZWN0ZWQgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uIHBhcmFtc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2hcbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5VHJhbnNhY3Rpb25SZWNpcGllbnRzKFxuICAgIHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uLFxuICAgIGV4cGVjdGVkUmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcblxuICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxSZWNpcGllbnRzID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKHR4RGF0YS5yZWNpcGllbnRzKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyhleHBlY3RlZFJlY2lwaWVudHMpO1xuXG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHNNYXRjaChleHBlY3RlZCwgYWN0dWFsUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyByZWNpcGllbnRzIGJ5IGV4dHJhY3Rpbmcgb25seSByZWxldmFudCBmaWVsZHMuXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gUmVjaXBpZW50cyB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCByZWNpcGllbnRzIHdpdGggYWRkcmVzcywgYW1vdW50LCBhbmQgdG9rZW5OYW1lIG9ubHlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVjaXBpZW50cyhyZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZXhwZWN0ZWQgcmVjaXBpZW50cyBtYXRjaCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIGV4cGVjdGVkIC0gRXhwZWN0ZWQgcmVjaXBpZW50c1xuICAgKiBAcGFyYW0gYWN0dWFsIC0gQWN0dWFsIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCByZWNpcGllbnRzIGFyZSBmb3VuZCBpbiBhY3R1YWwgcmVjaXBpZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sIGFjdHVhbDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHBlY3RlZC5ldmVyeSgoZXhwZWN0ZWRSZWNpcGllbnQpID0+XG4gICAgICBhY3R1YWwuc29tZSgoYWN0dWFsUmVjaXBpZW50KSA9PiBfLmlzRXF1YWwoZXhwZWN0ZWRSZWNpcGllbnQsIGFjdHVhbFJlY2lwaWVudCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHBhcnNlZCB0cmFuc2FjdGlvbiByZXN1bHQuXG4gICAqIFVzZWQgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gb3V0cHV0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlQYXJzZWRUcmFuc2FjdGlvbigpOiBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZTogbmV3IEJpZ051bWJlcigwKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmcm9tIHRoZSBleHBsYW5hdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBmZWUgYXMgYSBCaWdOdW1iZXJcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVHJhbnNhY3Rpb25GZWUoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBCaWdOdW1iZXIge1xuICAgIGlmIChleHBsYW5hdGlvbi5mZWUuZmVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLmZlZS5mZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgaW5wdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogSW5jbHVkZXMgc2VuZGVyIGlucHV0IGFuZCBvcHRpb25hbGx5IHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEBwYXJhbSBmZWUgLSBUaGUgY2FsY3VsYXRlZCB0cmFuc2FjdGlvbiBmZWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gaW5wdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25JbnB1dHMoXG4gICAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgZmVlOiBCaWdOdW1iZXJcbiAgKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHNwb25zb3IsIHNlbmRlciBvbmx5IHBheXMgZm9yIG91dHB1dHNcbiAgICAvLyBPdGhlcndpc2UsIHNlbmRlciBwYXlzIGZvciBvdXRwdXRzICsgZmVlXG4gICAgY29uc3Qgc2VuZGVyQW1vdW50ID0gZXhwbGFuYXRpb24uc3BvbnNvciA/IG91dHB1dEFtb3VudC50b0ZpeGVkKCkgOiBvdXRwdXRBbW91bnQucGx1cyhmZWUpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzZW5kZXJBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBBZGQgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50XG4gICAgaWYgKGV4cGxhbmF0aW9uLnNwb25zb3IpIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogZXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG91dHB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uT3V0cHV0cyhleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gZXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBmb3IgdGhpcyBjb2luXG4gICAqL1xuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZyb20gaXRzIGhleCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byByZWJ1aWxkXG4gICAqIEByZXR1cm5zIFRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gY2Fubm90IGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uOiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|