@bitgo-beta/sdk-core 8.2.1-beta.7 → 8.2.1-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +8 -5
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +8 -41
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +26 -104
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/util/crypto.d.ts +5 -25
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +10 -55
- package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -3
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +7 -6
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +3 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/tss/common.d.ts +4 -5
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +5 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +25 -17
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +4 -3
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +4 -2
- package/dist/tsconfig.tsbuildinfo +97 -89
- package/package.json +5 -5
|
@@ -1538,8 +1538,10 @@ class Wallet {
|
|
|
1538
1538
|
}
|
|
1539
1539
|
const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
|
|
1540
1540
|
// Doing a sanity check for password here to avoid doing further work if we know it's wrong
|
|
1541
|
+
// we ignore this check with if customSigningFunction is provided
|
|
1542
|
+
// which means that the user is handling the signing in external signing mode
|
|
1541
1543
|
try {
|
|
1542
|
-
if (keychains[0].encryptedPrv) {
|
|
1544
|
+
if (keychains[0].encryptedPrv && !params.customSigningFunction && params.walletPassphrase) {
|
|
1543
1545
|
this.bitgo.decrypt({ input: keychains[0].encryptedPrv, password: params.walletPassphrase });
|
|
1544
1546
|
}
|
|
1545
1547
|
}
|
|
@@ -2611,4 +2613,4 @@ class Wallet {
|
|
|
2611
2613
|
}
|
|
2612
2614
|
}
|
|
2613
2615
|
exports.Wallet = Wallet;
|
|
2614
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIscURBQXVDO0FBU3ZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBQThFO0FBQzlFLCtEQUFpRDtBQUNqRCxpREFBa0Q7QUFFbEQsd0RBQXVFO0FBQ3ZFLDhEQUEyRDtBQUMzRCxvQ0FPa0I7QUF1RGxCLDREQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsK0RBQTRDO0FBQzVDLDhDQUFnRDtBQUNoRCxnQ0FBc0M7QUFFdEMsaURBQWdEO0FBRWhELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQiw2RUFBVSxDQUFBO0lBQ1YsdUZBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFHaEM7QUFFRCxNQUFhLE1BQU07SUFPakIsWUFBWSxLQUFnQixFQUFFLFFBQW1CLEVBQUUsVUFBZTtRQUNoRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENB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RyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQWgzRkQsd0JBZzNGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7XG4gIElCYXNlQ29pbixcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWwgZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZHJhd0tleWNhcmQgfSBmcm9tICcuLi9pbnRlcm5hbC9rZXljYXJkJztcbmltcG9ydCB7IEtleWNoYWluIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IFRyYWRpbmdBY2NvdW50IH0gZnJvbSAnLi4vdHJhZGluZy90cmFkaW5nQWNjb3VudCc7XG5pbXBvcnQge1xuICBpbmZlckFkZHJlc3NUeXBlLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBUeFJlcXVlc3QsXG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEFkZHJlc3Nlc09wdGlvbnMsXG4gIEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zLFxuICBDaGFuZ2VGZWVPcHRpb25zLFxuICBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyxcbiAgQ3JlYXRlQWRkcmVzc09wdGlvbnMsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIENyb3NzQ2hhaW5VVFhPLFxuICBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyxcbiAgRG93bmxvYWRLZXljYXJkT3B0aW9ucyxcbiAgRmFub3V0VW5zcGVudHNPcHRpb25zLFxuICBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGb3J3YXJkZXJCYWxhbmNlLFxuICBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyxcbiAgRnJlZXplT3B0aW9ucyxcbiAgRnVuZEZvcndhcmRlcnNPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICBJV2FsbGV0LFxuICBNYXhpbXVtU3BlbmRhYmxlLFxuICBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyxcbiAgTW9kaWZ5V2ViaG9va09wdGlvbnMsXG4gIFBhZ2luYXRpb25PcHRpb25zLFxuICBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0LFxuICBSZWNvdmVyVG9rZW5PcHRpb25zLFxuICBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgUmVtb3ZlVXNlck9wdGlvbnMsXG4gIFNlbmRNYW55T3B0aW9ucyxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRFY2RzYUNoYWxsZW5nZXMsXG4gIFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMsXG59IGZyb20gJy4vaVdhbGxldCc7XG5pbXBvcnQgeyBTdGFraW5nV2FsbGV0IH0gZnJvbSAnLi4vc3Rha2luZy9zdGFraW5nV2FsbGV0JztcbmltcG9ydCB7IExpZ2h0bmluZyB9IGZyb20gJy4uL2xpZ2h0bmluZyc7XG5pbXBvcnQgRWRkc2FVdGlscyBmcm9tICcuLi91dGlscy90c3MvZWRkc2EnO1xuaW1wb3J0IHsgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi90c3MnO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBvZmNUb2tlbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdiaXRnbzp2Mjp3YWxsZXQnKTtcblxudHlwZSBNYW5hZ2VVbnNwZW50cyA9ICdjb25zb2xpZGF0ZScgfCAnZmFub3V0JztcblxuZXhwb3J0IGVudW0gTWFuYWdlVW5zcGVudHNPcHRpb25zIHtcbiAgQlVJTERfT05MWSxcbiAgQlVJTERfU0lHTl9TRU5ELFxufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWRkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnYWRkcmVzc1R5cGUnLFxuICAgICAgJ2FwaVZlcnNpb24nLFxuICAgICAgJ2NoYW5nZUFkZHJlc3MnLFxuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICdjcGZwRmVlUmF0ZScsXG4gICAgICAnY3BmcFR4SWRzJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2dhc0xpbWl0JyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnaG9wUGFyYW1zJyxcbiAgICAgICdpZGZTaWduZWRUaW1lc3RhbXAnLFxuICAgICAgJ2lkZlVzZXJJZCcsXG4gICAgICAnaWRmVmVyc2lvbicsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdtYXhGZWUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd0cmFuc2ZlcklkJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnbm9uY2UnLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ3JlY2VpdmVBZGRyZXNzJyxcbiAgICAgICdyZWNpcGllbnRzJyxcbiAgICAgICdyZXNlcnZhdGlvbicsXG4gICAgICAnc2VxdWVuY2VJZCcsXG4gICAgICAnc3RyYXRlZ3knLFxuICAgICAgJ3NvdXJjZUNoYWluJyxcbiAgICAgICdkZXN0aW5hdGlvbkNoYWluJyxcbiAgICAgICd0YXJnZXRXYWxsZXRVbnNwZW50cycsXG4gICAgICAndHJ1c3RsaW5lcycsXG4gICAgICAndHhGb3JtYXQnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3Vuc3BlbnRzJyxcbiAgICAgICdub25QYXJ0aWNpcGF0aW9uJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdtZXNzYWdlS2V5JyxcbiAgICAgICdzdGFraW5nT3B0aW9ucycsXG4gICAgICAnZWlwMTU1OScsXG4gICAgICAna2V5cmVnVHhCYXNlNjQnLFxuICAgICAgJ2Nsb3NlUmVtYWluZGVyVG8nLFxuICAgICAgJ3Rva2VuTmFtZScsXG4gICAgICAnZW5hYmxlVG9rZW5zJyxcbiAgICAgIC8vIHBhcmFtIHRvIHNldCBlbWVyZ2VuY3kgZmxhZyBvbiBhIGN1c3RvZGlhbCB0cmFuc2FjdGlvbi5cbiAgICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBpbiBsZXNzIHRoYW4gMSBob3VyIG9yIGl0IHdpbGwgZmFpbC5cbiAgICAgICdlbWVyZ2VuY3knLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdwcmV2aWV3JyxcbiAgICAgICdrZWVwQWxpdmUnLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb2luIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGNvaW4gdGhpcyB3YWxsZXQgaG9sZHNcbiAgICovXG4gIGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYWJlbCAobmFtZSkgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljIG9iamVjdCBpZHMgZm9yIHRoZSBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuXG4gICAqL1xuICBwdWJsaWMga2V5SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmtleXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVjZWl2ZSBhZGRyZXNzIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIHJlY2VpdmVBZGRyZXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5yZWNlaXZlQWRkcmVzcy5hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2FsbGV0IGlkIG9mIHRoZSB3YWxsZXQgdGhhdCB0aGlzIHdhbGxldCB3YXMgbWlncmF0ZWQgZnJvbS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgYSBCQ0ggd2FsbGV0IHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSBhIEJUQyB3YWxsZXQsXG4gICAqIHRoZSBCQ0ggd2FsbGV0IG1pZ3JhdGVkIGZyb20gZmllbGQgd291bGQgaGF2ZSB0aGUgQlRDIHdhbGxldCBpZC5cbiAgICovXG4gIHB1YmxpYyBtaWdyYXRlZEZyb20oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm1pZ3JhdGVkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEByZXR1cm4geyp8T2JqZWN0fSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGRzIH0gYmFzZSB1bml0c1xuICAgKi9cbiAgdG9rZW5GbHVzaFRocmVzaG9sZHMoKTogYW55IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMudG9rZW5GbHVzaFRocmVzaG9sZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIGNvaW4gaW1wbGVtZW50YXRpb25zXG4gICAqL1xuICBjb2luU3BlY2lmaWMoKTogV2FsbGV0Q29pblNwZWNpZmljIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgYXBwcm92YWxzIG9uIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IElQZW5kaW5nQXBwcm92YWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5wZW5kaW5nQXBwcm92YWxzLm1hcCgoY3VycmVudEFwcHJvdmFsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBjdXJyZW50QXBwcm92YWwsIHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtXYWxsZXR9XG4gICAqL1xuICBhc3luYyByZWZyZXNoKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9ucyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHgnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogIC0gdHhIYXNoIHRoZSB0cmFuc2FjdGlvbiBoYXNoIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2FjdGlvbihwYXJhbXM6IEdldFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4SGFzaCddLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMudHhIYXNoKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2ZlcnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlcnMocGFyYW1zOiBUcmFuc2ZlcnNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBUcmFuc2ZlcnNPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2hMYWJlbCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5zZWFyY2hMYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlYXJjaExhYmVsIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWFyY2hMYWJlbCA9IHBhcmFtcy5zZWFyY2hMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHBhcmFtcy5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVHdGUpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVHdGUgPSBwYXJhbXMuZGF0ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVMdCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVMdCA9IHBhcmFtcy5kYXRlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVHdGUgPSBwYXJhbXMudmFsdWVHdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVMdCA9IHBhcmFtcy52YWx1ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUhleCA9IHBhcmFtcy5pbmNsdWRlSGV4O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuc3RhdGUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHBhcmFtcy5zdGF0ZS5mb3JFYWNoKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIHN0YXRlIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy50eXBlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHlwZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNmZXJzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFRyYW5zZmVyKHBhcmFtczogR2V0VHJhbnNmZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJCeVNlcXVlbmNlSWQocGFyYW1zOiBUcmFuc2ZlckJ5U2VxdWVuY2VJZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci9zZXF1ZW5jZUlkLycgKyBwYXJhbXMuc2VxdWVuY2VJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBhbW91bnQgeW91IGNhbiBzcGVuZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgdW5zcGVudHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBmZWUgcmF0ZSB0byB1c2UgaW4gY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzcGVuZGFibGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5yZWNpcGllbnRBZGRyZXNzIC0gcmVjaXBpZW50IGFkZHJlc3NlcyBmb3IgYSBtb3JlIGFjY3VyYXRlIGNhbGN1bGF0aW9uIG9mIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB0byBzZW5kXG4gICAqIEByZXR1cm5zIHt7bWF4aW11bVNwZW5kYWJsZTogTnVtYmVyLCBjb2luOiBTdHJpbmd9fVxuICAgKiBOT1RFIDogZmVlVHhDb25maXJtVGFyZ2V0IG9taXR0ZWQgb24gcHVycG9zZSBiZWNhdXNlIGdhdWdpbmcgdGhlIG1heGltdW0gc3BlbmRhYmxlIGFtb3VudCB3aXRoIGR5bmFtaWMgZmVlcyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4gICAqL1xuICBhc3luYyBtYXhpbXVtU3BlbmRhYmxlKHBhcmFtczogTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWF4aW11bVNwZW5kYWJsZT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncGxhaW5UYXJnZXQnLFxuICAgICAgJ3JlY2lwaWVudEFkZHJlc3MnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9tYXhpbXVtU3BlbmRhYmxlJykpLnF1ZXJ5KGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVuc3BlbnRzKHBhcmFtczogVW5zcGVudHNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2NoYWlucycsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncHJldklkJyxcbiAgICAgICdzZWd3aXQnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy91bnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgb3IgZmFub3V0IHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb3V0ZU5hbWUgLSBlaXRoZXIgYGNvbnNvbGlkYXRlYCBvciBgZmFub3V0YFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICpcbiAgICogV2FsbGV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBGZWUgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqXG4gICAqIElucHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBPdXRwdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVW5zcGVudHMoXG4gICAgcm91dGVOYW1lOiBNYW5hZ2VVbnNwZW50cyxcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zIHwgRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuXG4gICAgICByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZScgPyAnbGltaXQnIDogJ21heE51bUlucHV0c1RvVXNlJyxcbiAgICAgICdudW1VbnNwZW50c1RvTWFrZScsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtyb3V0ZU5hbWV9VW5zcGVudHNgKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgaWYgKG9wdGlvbiA9PT0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX09OTFkpIHtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSksXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywgeyB0eXBlOiByb3V0ZU5hbWUgfSk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZVxuICAgKi9cbiAgYXN5bmMgY29uc29saWRhdGVVbnNwZW50cyhcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuICAgICAgKHBhcmFtcyBhcyBhbnkpLnJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKTtcbiAgICB9XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbG93IHdvcmtzIGZvciBhbGwgVVRYTyBjb2luc1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG4gICAgICAnYWxsb3dQYXJ0aWFsU3dlZXAnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIC8vIFRPRE8oQkctMzU4OCk6IGFkZCB0eEhleCB2YWxpZGF0aW9uIHRvIHByb3RlY3QgbWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrcyByZXBsYWNpbmcgdGhlIHR4SGV4XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB3YWxsZXQgYWRkcmVzcyBieSBpdHMgaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldEFkZHJlc3MocGFyYW1zOiBHZXRBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydhZGRyZXNzJywgJ2lkJ10pO1xuICAgIGxldCBxdWVyeTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb25lIG9yIG1vcmUgbmV3IGFkZHJlc3MoZXMpIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbiAgICpcbiAgICogSWYgdGhlIGBjb3VudGAgZmllbGQgaXMgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDEsIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlXG4gICAqIGFycmF5IHByb3BlcnR5IG5hbWVkIGBhZGRyZXNzZXNgIGNvbnRhaW5pbmcgYGNvdW50YCBhZGRyZXNzIG9iamVjdHNcbiAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHNpbmdsZSBhZGRyZXNzIG9iamVjdCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNoYWluIG9uIHdoaWNoIHRoZSBuZXcgYWRkcmVzcyBzaG91bGQgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0geyhOdW1iZXJ8U3RyaW5nKX0gcGFyYW1zLmdhc1ByaWNlIGdhcyBwcmljZSBmb3IgbmV3IGFkZHJlc3MgY3JlYXRpb24sIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5sYWJlbCBsYWJlbCBmb3IgdGhlIG5ldyBhZGRyZXNzKGVzKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNvdW50PTEgbnVtYmVyIG9mIG5ldyBhZGRyZXNzZXMgd2hpY2ggc2hvdWxkIGJlIGNyZWF0ZWQgKG1heGltdW0gMjUwKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZvcndhcmRlclZlcnNpb24gVGhlIHZlcnNpb24gb2YgYWRkcmVzcyB0byBjcmVhdGUsIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubG93UHJpb3JpdHkgRXRoZXJldW0tc3BlY2lmaWMgcGFyYW0gdG8gY3JlYXRlIGFkZHJlc3MgdXNpbmcgbG93IHByaW9yaXR5IGZlZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYmFzZUFkZHJlc3MgYmFzZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQob3B0aW9uYWwgcGFyYW1ldGVyKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5hbGxvd1NraXBWZXJpZnlBZGRyZXNzIFdoZW4gc2V0IHRvIGZhbHNlLCBpdCB0aHJvd3MgZXJyb3IgaWYgYWRkcmVzcyB2ZXJpZmljYXRpb24gaXMgc2tpcHBlZCBmb3IgYW55IHJlYXNvbi4gRGVmYXVsdCBpcyB0cnVlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm9uVG9rZW4gbWFuZGF0b3J5IGluIGNhc2Ugb2YgdGhlIE9GQyB3YWxsZXQsIHRoZSBuYW1lIG9mIHRva2VuIHRvIGNyZWF0ZSBhZGRyZXNzIGZvclxuICAgKiBBZGRyZXNzIHZlcmlmaWNhdGlvbiBjYW4gYmUgc2tpcHBlZCB3aGVuIGZvcndhcmRlclZlcnNpb24gaXMgMCBhbmQgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gaXMgdHJ1ZSBPUlxuICAgKiBpZiAnY29pblNwZWNpZmljJyBpcyBub3QgcGFydCBvZiB0aGUgcmVzcG9uc2UgZnJvbSBhcGkgY2FsbCB0byBjcmVhdGUgYWRkcmVzc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWRkcmVzcyhwYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3NQYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge307XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2hhaW4sXG4gICAgICBnYXNQcmljZSxcbiAgICAgIGxhYmVsLFxuICAgICAgbG93UHJpb3JpdHksXG4gICAgICBmb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgZm9ybWF0LFxuICAgICAgY291bnQgPSAxLFxuICAgICAgYmFzZUFkZHJlc3MsXG4gICAgICBhbGxvd1NraXBWZXJpZnlBZGRyZXNzID0gdHJ1ZSxcbiAgICAgIG9uVG9rZW4sXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciAwLCAxLCAyIG9yIDMnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfSBlbHNlIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcndhcmRlclZlcnNpb24gPSAzO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsYWJlbCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhsYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFzZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYmFzZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFzZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihjb3VudCkgfHwgY291bnQgPD0gMCB8fCBjb3VudCA+IDI1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VudCBoYXMgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTAnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobG93UHJpb3JpdHkpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGxvd1ByaW9yaXR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvd1ByaW9yaXR5IGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubG93UHJpb3JpdHkgPSBsb3dQcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9ybWF0KSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtYXQgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvblRva2VuKSkge1xuICAgICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvZmNUb2tlbnMuaW5jbHVkZXMob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gT0ZDIHRva2VuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcmFtcy5vblRva2VuID0gb25Ub2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIE9GQyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICAvLyBpbmZlciBpdHMgYWRkcmVzcyB0eXBlXG4gICAgICBpZiAoXy5pc09iamVjdChuZXdBZGRyZXNzLmNvaW5TcGVjaWZpYykpIHtcbiAgICAgICAgbmV3QWRkcmVzcy5hZGRyZXNzVHlwZSA9IGluZmVyQWRkcmVzc1R5cGUobmV3QWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25EYXRhOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IF8ubWVyZ2Uoe30sIG5ld0FkZHJlc3MsIHsgcm9vdEFkZHJlc3MgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhlIHVzZXIga2V5IGNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgeyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IChhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG5cbiAgICBsZXQgdXNlclBydjtcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc2hhcmUgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHNraXBLZXljaGFpbiB0byBiZSBhIGJvb2xlYW4uICcpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICAgIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVFbWFpbCB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5lbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZyA9IChhd2FpdCB0aGlzLmJpdGdvLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KSkgYXMgYW55O1xuICAgICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFBydiB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ucHJ2IH0pO1xuICAgICAgICAgIC8vIE9ubHkgb25lIG9mIHB1Yi9jb21tb25QdWIvY29tbW9uS2V5Y2hhaW4gc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGtleWNoYWluXG4gICAgICAgICAgbGV0IHB1YiA9IGtleWNoYWluLnB1YiA/PyBrZXljaGFpbi5jb21tb25QdWI7XG4gICAgICAgICAgaWYgKGtleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgICAgICBwdWIgPVxuICAgICAgICAgICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnXG4gICAgICAgICAgICAgICAgPyBFZGRzYVV0aWxzLmdldFB1YmxpY0tleUZyb21Db21tb25LZXljaGFpbihrZXljaGFpbi5jb21tb25LZXljaGFpbilcbiAgICAgICAgICAgICAgICA6IEVjZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICBwdWIsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICB0b1B1YktleTogc2hhcmluZy5wdWJrZXksXG4gICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5tZXNzYWdlID09PSAnTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKSB7XG4gICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7fTtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBlcnJvciBiZWNhdXNlIHRoaXMgbG9va3MgbGlrZSBhIGNvbGQgd2FsbGV0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgfTtcblxuICAgIGlmIChzaGFyZWRLZXljaGFpbikge1xuICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIGZyb20gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB1c2VySWQgSWQgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVVc2VyKHBhcmFtczogUmVtb3ZlVXNlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VySWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXNlcklkID0gcGFyYW1zLnVzZXJJZDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy91c2VyLycgKyB1c2VySWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkICh1bnNpZ25lZCB0cmFuc2FjdGlvbikgZnJvbSBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdW5zcGVudHMgZ29pbmcgaW50byB0aGlzIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2UgbWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyBvbiBjaGFuZ2UgKGludGVybmFsKSBpbnB1dHMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0LiBJZiB0aGUgd2FsbGV04oCZcyBjdXJyZW50IHVuc3BlbnQgY291bnQgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0LCB1cCB0byBmb3VyIGFkZGl0aW9uYWwgY2hhbmdlIG91dHB1dHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNMaW1pdCAtIEN1c3RvbSBnYXMgbGltaXQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9uUGFydGljaXBhdGlvbiAtIChBbGdvcmFuZCkgTm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkRnJvbUJsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWluaW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRUb0Jsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWF4aW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBCdWlsZCB0aGlzIHRyYW5zYWN0aW9uIHRvIGNvbmZvcm0gd2l0aCBpbnN0YW50IHNlbmRpbmcgY29pbi1zcGVjaWZpYyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMua2VlcEFsaXZlIC0gKFBvbGthZG90KSBrZWVwIGFkZHJlc3MgYWxpdmUgYnkgc2VuZGluZyB0aGUgYWRkcmVzcyBtaW5pbXVtIGZ1bmRpbmcgYW1vdW50LCB1c2VkIGR1cmluZyB3YWxsZXQgY29uc29saWRhdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW0udHJhbnNmZXJJZCAtIHRyYW5zZmVyIElkIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IGNhc3BlcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzVHlwZSAtIFRoZSB0eXBlIG9mIGFkZHJlc3MgdG8gY3JlYXRlIGZvciBjaGFuZ2UuIE9uZSBvZiBgcDJzaGAsIGBwMnNoUDJ3c2hgLCBhbmQgYHAyd3NoYC4gQ2FzZS1zZW5zaXRpdmUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmhvcCAtIEJ1aWxkIHRoaXMgYXMgYW4gRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMucmVzZXJ2YXRpb24gLSBPYmplY3QgdG8gcmVzZXJ2ZSB0aGUgdW5zcGVudHMgdGhhdCB0aGlzIHR4IGJ1aWxkIHVzZXMuIEZvcm1hdCBpcyByZXNlcnZhdGlvbiA9IHsgZXhwaXJlVGltZTogSVNPRGF0ZVN0cmluZywgcGVuZGluZ0FwcHJvdmFsSWQ6IFN0cmluZyB9XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB0byB0aGUgd2FsbGV0IHVzZXIga2V5LCB0byBzaWduIGNvbW1pdG1lbnQgZGF0YSBmb3IgRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIHVzZWQgYXMgdGhlIFwidG9cIiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb25Uc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHsgd2FsbGV0OiB0aGlzLCBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMgfSlcbiAgICApKSBhcyBhbnk7XG4gICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG4gICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICBpZiAodGhpcy5fd2FsbGV0ICYmIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMgJiYgIXBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHtcbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldENvbnRyYWN0QWRkcmVzczogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcyB9KTtcbiAgICB9XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIGFwaVZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiYgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzaWduID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzcyh7IC4uLnByZXNpZ24sIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLCBhcGlWZXJzaW9uIH0pO1xuICAgIH1cblxuICAgIGxldCB7IHB1YnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXB1YnMgJiYgdGhpcy5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHlwZWQgc3RydWN0dXJlZCBkYXRhIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduVHlwZWREYXRhKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTaWduaW5nVHlwZWREYXRhKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbiB0eXBlZCBkYXRhIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy50eXBlZERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZWQgZGF0YSByZXF1aXJlZGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlZERhdGEudHlwZWREYXRhUmF3IG11c3QgYmUgSlNPTiBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YSkpIHtcbiAgICAgIHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKHBhcmFtcy50eXBlZERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHsgLi4ucGFyYW1zLCBrZXljaGFpbjoga2V5Y2hhaW5zWzBdIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7IC4uLnBhcmFtcywga2V5Y2hhaW46IGtleWNoYWluc1swXSB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydih1c2VyUHJ2T3B0aW9ucyksXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduTWVzc2FnZVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgZnJvbSBlaXRoZXIgYSBkZXJpdmF0aW9uIG9yIGFuIGVuY3J5cHRlZCBrZXljaGFpblxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIHVzZSB0aGUgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIHByb3BlcnR5IGZyb20gdGhlIHVzZXIga2V5Y2hhaW4gYXMgdGhlIGBjb2xkRGVyaXZhdGlvblNlZWRgXG4gICAgLy8gaWYgbm8gb3RoZXIgYGNvbGREZXJpdmF0aW9uU2VlZGAgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID0gcGFyYW1zLmtleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgfVxuXG4gICAgaWYgKHVzZXJQcnYgJiYgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7IGtleTogdXNlclBydiwgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlckVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBmcm9tIEJpdEdvLCB2YWxpZGF0ZSBpdCwgYW5kIHRoZW4gZGVjcnlwdCB0aGUgdXNlciBrZXkgYW5kIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5ICYmIHBhcmFtcy5nYXNQcmljZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcGFyYW1zLmVpcDE1NTkgYW5kIHBhcmFtcy5nYXNQcmljZSBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfZ2FzUHJpY2VfYW5kX2VpcDE1NTlnYXNNb2RlbF9zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwcmVidWlsZFR4IGFuZCByZWNpcGllbnRzIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9wcmVidWlsZHR4X2FuZF9yZWNpcGllbnRzX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBhcnJheScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuX3Blcm1pc3Npb25zKSAmJiAhdGhpcy5fcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ25vIHNwZW5kIHBlcm1pc3Npb24gb24gdGhpcyB3YWxsZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAndXNlcl9ub3RfYWxsb3dlZF90b19zcGVuZF9mcm9tX3dhbGxldCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2VpdmVBZGRyZXNzICYmIChwYXJhbXMudHlwZSA9PT0gJ3RyYW5zZmVyJyB8fCBwYXJhbXMudHlwZSA9PT0gJ3RyYW5zZmVyVG9rZW4nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHVzZSByZWNlaXZlIGFkZHJlc3MgZm9yIFRTUyB0cmFuc2FjdGlvbnMgb2YgdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNlaXZlX2FkZHJlc3Nfbm90X2FsbG93ZWRfZm9yX3Rzc193aXRoZHJhd2Fscyc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgKHBhcmFtcy50eXBlID09PSAnZmlsbE5vbmNlJyB8fCBwYXJhbXMudHlwZSA9PT0gJ2FjY2VsZXJhdGlvbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgcHJvdmlkZSByZWNpcGllbnRzIGZvciB0cmFuc2FjdGlvbiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FsbG93ZWRfZm9yX2ZpbGxub25jZV9hbmRfYWNjZWxlcmF0aW9uX3R4X3R5cGUnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICB0cnkge1xuICAgICAgaWYgKGtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYgYXMgc3RyaW5nLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgYHVuYWJsZSB0byBkZWNyeXB0IGtleWNoYWluIHdpdGggdGhlIGdpdmVuIHdhbGxldCBwYXNzcGhyYXNlLiBFcnJvcjogJHtKU09OLnN0cmluZ2lmeShlKX1gXG4gICAgICApO1xuICAgICAgZXJyb3IuY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGRRdWVyeSA9IHBhcmFtcy5wcmVidWlsZFR4ID8gUHJvbWlzZS5yZXNvbHZlKHBhcmFtcy5wcmVidWlsZFR4KSA6IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQcmVidWlsZC5idWlsZFBhcmFtcyB8fCBwYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQgZmFpbGVkIGxvY2FsIHZhbGlkYXRpb246JywgZS5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICd0cmFuc2FjdGlvbiBwYXJhbXM6JyxcbiAgICAgICAgXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSlcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZDonLCB0eFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgbXVsdGlzaWcgYWRkcmVzcyBhdCB3YWxsZXQgY3JlYXRpb24gdGltZVxuICAgICAgICBhZGRyZXNzVmVyc2lvbjogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5hZGRyZXNzVmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyAgICAgICAgICAgICAgICBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwVHhJZHMpIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5jcGZwVHhJZHMpIHx8IHBhcmFtcy5jcGZwVHhJZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgY3BmcFR4SWRzIHRvIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2NwZnB0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBGZWVSYXRlKSkge1xuICAgICAgaWYgKHBhcmFtcy5ub0NwZnBGZWVSYXRlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgc2V0IHVubGVzcyBub0NwZnBGZWVSYXRlIGlzIHNldCcpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuY3BmcEZlZVJhdGUpIHx8IHBhcmFtcy5jcGZwRmVlUmF0ZSA8IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMubWF4RmVlKSkge1xuICAgICAgaWYgKHBhcmFtcy5ub01heEZlZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vTWF4RmVlIGlzIHNldCcpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ21heGZlZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEZlZSkgfHwgcGFyYW1zLm1heEZlZSA8IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ21heGZlZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpIHx8IHBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmFsdWUgZm9yICdyZWNpcGllbnRzJzogbXVzdCBiZSBlbXB0eSBhcnJheSB3aGVuIHNldGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmFtcy5yZWNpcGllbnRzID0gW107XG5cbiAgICAvLyBXZSBtdXN0IHBhc3MgdGhlIGJ1aWxkIHBhcmFtcyB0aHJvdWdoIHRvIHN1Ym1pdCBpbiBjYXNlIHRoZSBDUEZQIHR4IGV2ZXIgaGFzIHRvIGJlIHJlYnVpbHQuXG4gICAgY29uc3Qgc3VibWl0UGFyYW1zID0gT2JqZWN0LmFzc2lnbihwYXJhbXMsIGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSk7XG4gICAgZGVsZXRlIChzdWJtaXRQYXJhbXMgYXMgYW55KS53YWxsZXQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc3VibWl0UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhIZXg6IHRyYW5zYWN0aW9uIGhleCB0byBzdWJtaXRcbiAgICogLSBoYWxmU2lnbmVkOiBvYmplY3QgY29udGFpbmluZyB0cmFuc2FjdGlvbiAodHhIZXggb3IgdHhCYXNlNjQpIHRvIHN1Ym1pdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuICAgIGlmIChhbW91bnQuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7IHJlY2lwaWVudHMgfSk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMubWFwKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvdHgvaW5pdGlhdGUnKSkuc2VuZChzZWxlY3RQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy90eC9zZW5kJykpLnNlbmQoZmluYWxUeFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiB1bnN1cHBvcnRlZCB0b2tlbiBmcm9tIGEgQml0R28gbXVsdGlzaWcgd2FsbGV0XG4gICAqIHBhcmFtcyBhcmUgdmFsaWRhdGVkIGluIEV0aC5wcm90b3R5cGUucmVjb3ZlclRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdW5zdXBwb3J0ZWQgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmVjb3ZlcmVkIHRva2VucyBzaG91bGQgYmUgc2VudCB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHRoZSB4cHJ2XG4gICAqL1xuICBhc3luYyByZWNvdmVyVG9rZW4ocGFyYW1zOiBSZWNvdmVyVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiByZWNvdmVyeSBvbmx5IHN1cHBvcnRlZCBmb3IgZXRoIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZWNpcGllbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciByZWNpcGllbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyVG9rZW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSwgcGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KTtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5yZWNvdmVyVG9rZW4ocmVjb3ZlclRva2VuT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgc3RpbGwgcGVuZGluZyBvciBhdHRlbXB0ZWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0eGlkLCB3YWxsZXRJZCwgdHgsIGFuZCBmZWUgKGlmIHN1cHBvcnRlZCBmb3IgY29pbilcbiAgICovXG4gIGFzeW5jIGdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBpbnRlcm5hbC5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbih7IHdhbGxldElkOiB0aGlzLmlkKCkgfSwgdGhpcy5iYXNlQ29pbiwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmZWUgb24gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gdHhpZCB0byB0aGUgZ2l2ZW4gbmV3IGZlZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhpZCBUaGUgdHJhbnNhY3Rpb24gSWQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNhY3Rpb24gd2hvc2UgZmVlIGlzIHRvIGJlIGNoYW5nZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZmVlXSBPcHRpb25hbCAtIFRoZSBuZXcgZmVlIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmVpcDE1NTldIE9wdGlvbmFsIC0gdGhlIGVpcDE1NTkgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbmV3IHRyYW5zYWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5ldyBmZWUgcmF0ZVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRmVlKHBhcmFtczogQ2hhbmdlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLmZlZSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJywgJ2ZlZSddLCBbXSk7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5KSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLmVpcDE1NTksIFsnbWF4RmVlUGVyR2FzJywgJ21heFByaW9yaXR5RmVlUGVyR2FzJ10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9jaGFuZ2VGZWUnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBpbmZvIGZyb20gbWVyY2hhbnQgc2VydmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVybCB0byByZXRyaWV2ZSBpbmZvIGZyb21cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRQYXltZW50SW5mbyhwYXJhbXM6IHsgdXJsPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BheW1lbnRJbmZvJykpLnF1ZXJ5KHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBqc29uIHBheW1lbnQgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBheW1lbnRVcmwgLSBUaGUgdXJsIHRvIHNlbmQgdGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lbW8ge1N0cmluZ30gLSBBIG1lbW8gc3VwcGxpZWQgYnkgdGhlIG1lcmNoYW50LCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmFuc2ZlciBhcyB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmV4cGlyZXMge1N0cmluZ30gLSBJU08gRGF0ZSBmb3JtYXQgb2Ygd2hlbiB0aGUgcGF5bWVudCByZXF1ZXN0IGV4cGlyZXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyIFBheW1lbnQgQWNrXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kUGF5bWVudFJlc3BvbnNlKHBhcmFtczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zZW5kUGF5bWVudCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2xpY3lSdWxlKHBhcmFtczogQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2V0UG9saWN5UnVsZShwYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIFBvbGljeSBSdWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVQb2xpY3lSdWxlKHBhcmFtczogUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3Jvc3NDaGFpbiBVVFhPc1xuICAgKiBDdXJyZW50bHkgb25seSBmb3IgQVZBWFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUNoYWluIHRoZSBzb3VyY2VjaGFpbiB0byBwaWNrIFVUWE9zLCBpZiBub3QgZ2l2ZW4sIHRoZW4gcGljayBmcm9tIGFsbCBhdmFpbGFibGUgY2hhaW5zIFtQLCBDXVxuICAgKi9cbiAgZmV0Y2hDcm9zc0NoYWluVVRYT3MocGFyYW1zOiBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMpOiBQcm9taXNlPENyb3NzQ2hhaW5VVFhPW10+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFsnc291cmNlQ2hhaW4nXSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvY3Jvc3NDaGFpblVuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgSlNPTiByZXByZXNlbnRhYmxlIHZlcnNpb24gb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvSlNPTigpOiBXYWxsZXREYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYWRpbmcgYWNjb3VudCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1RyYWRpbmdBY2NvdW50KCk6IFRyYWRpbmdBY2NvdW50IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSB0cmFkaW5nIGFjY291bnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFkaW5nQWNjb3VudCh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcywgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9TdGFraW5nV2FsbGV0KCk6IFN0YWtpbmdXYWxsZXQge1xuICAgIGNvbnN0IGlzRXRoVHNzID1cbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT0gJ2V0aCcgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ud2FsbGV0VmVyc2lvblxuICAgICAgICA/IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbiA+PSAzXG4gICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBTdGFraW5nV2FsbGV0KHRoaXMsIGlzRXRoVHNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBkb3dubG9hZHMgUERGIGtleWNhcmQgZm9yIHdhbGxldCAocmVxdWlyZXMgcmVzcG9uc2UgZnJvbSB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KVxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGlzIGV4YW1wbGUgY29kZSBhbmQgaXMgbm90IHRoZSB2ZXJzaW9uIHVzZWQgb24gYml0Z28uY29tXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAqIGpzUERGIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIGpzUERGIGxpYnJhcnlcbiAgICogICAqIFFSQ29kZSAtIGFuIGluc3RhbmNlIG9mIHRoZSBRUmlvdXMgbGlicmFyeVxuICAgKiAgICogdXNlcktleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIHVzZXIga2V5Y2hhaW5cbiAgICogICAqIGJhY2t1cEtleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJhY2t1cCBrZXljaGFpblxuICAgKiAgICogYml0Z29LZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiaXRnbyBrZXljaGFpblxuICAgKiAgICogcGFzc3BocmFzZSAtIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiAgICogcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAtIHRoZSBlbmNyeXB0aW9uIHNlY3JldCB1c2VkIGZvciBCb3ggRFxuICAgKiAgICogYWN0aXZhdGlvbkNvZGUgLSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBzaXgtZGlnaXQgYWN0aXZhdGlvbiBjb2RlXG4gICAqICAgKiB3YWxsZXRLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIHNpZ25pbmcga2V5XG4gICAqICAgKiBiYWNrdXBLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIGJhY2t1cCBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBkb3dubG9hZEtleWNhcmQocGFyYW1zOiBEb3dubG9hZEtleWNhcmRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkb3dubG9hZEtleWNhcmQgZnVuY3Rpb24gaXMgb25seSBjYWxsYWJsZSB3aXRoaW4gYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIC8vIEdyYWIgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgZm9yIGFjdGl2YXRpb25Db2RlXG4gICAgY29uc3Qge1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgICBhY3RpdmF0aW9uQ29kZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCArIDEwMDAwMCkudG9TdHJpbmcoKSxcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFqc1BERiB8fCB0eXBlb2YganNQREYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHBhc3MgaW4gYSB2YWxpZCBqc1BERiBpbnN0YW5jZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleWNoYWluc1xuICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdhbGxldCBrZXljaGFpbiBtdXN0IGhhdmUgYSAndXNlcicgcHJvcGVydHlgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t1cEtleWNoYWluIHx8IHR5cGVvZiBiYWNrdXBLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmFja3VwIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCB0eXBlb2YgYml0Z29LZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28ga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHdhbGxldEtleUlEICYmIHR5cGVvZiB3YWxsZXRLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0S2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChiYWNrdXBLZXlJRCAmJiB0eXBlb2YgYmFja3VwS2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhY2t1cEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3RpdmF0aW9uIGNvZGUgaWYgcHJvdmlkZWRcbiAgICBpZiAodHlwZW9mIGFjdGl2YXRpb25Db2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIENvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uQ29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBjb2RlIG11c3QgYmUgc2l4IGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luU2hvcnROYW1lID0gdGhpcy5iYXNlQ29pbi50eXBlO1xuICAgIGNvbnN0IGNvaW5OYW1lID0gdGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpO1xuICAgIGNvbnN0IHdhbGxldExhYmVsID0gdGhpcy5fd2FsbGV0LmxhYmVsO1xuXG4gICAgY29uc3QgZG9jID0gZHJhd0tleWNhcmQoe1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICBlbmNyeXB0OiB0aGlzLmJpdGdvLmVuY3J5cHQsXG4gICAgICBjb2luU2hvcnROYW1lLFxuICAgICAgY29pbk5hbWUsXG4gICAgICBhY3RpdmF0aW9uQ29kZSxcbiAgICAgIHdhbGxldExhYmVsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0aGUgUERGIG9uIHRoZSB1c2VyJ3MgYnJvd3NlclxuICAgIGRvYy5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke3dhbGxldExhYmVsfS5wZGZgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY291bGQgcmV0dXJuIDEwMCBidWlsZCB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgIC8vIHdlIG5lZWQgdG8gc3RlcCBvdmVyIGVhY2ggcHJlYnVpbGQgbm93IC0gc2hvdWxkIGJlIGluIGFuIGFycmF5IGluIHRoZSBib2R5XG4gICAgY29uc3QgY29uc29saWRhdGlvbnM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc29saWRhdGVBY2NvdW50QnVpbGQgb2YgYnVpbGRSZXNwb25zZSkge1xuICAgICAgbGV0IHByZWJ1aWxkOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0ID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb25zb2xpZGF0ZUFjY291bnRCdWlsZCwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICAgKSkgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcblxuICAgICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcblxuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICAgIGRlYnVnKCdmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcblxuICAgICAgY29uc29saWRhdGlvbnMucHVzaChwcmVidWlsZCk7XG4gICAgfVxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHBhcmFtcy50eXBlID0gJ2NvbnNvbGlkYXRlJztcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy90eC9pbml0aWF0ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSAoYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXMpKSBhcyBhbnk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdG9rZW4uYWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5iYXNlQWRkcmVzcztcbiAgICAgICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgZG9lcyBub3QgaGF2ZSBiYXNlIGFkZHJlc3MsIG11c3Qgc3BlY2lmeSB3aXRoIHRva2VuIHBhcmFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGJ1aWxkUGFyYW1zLmVuYWJsZVRva2VucztcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHggPSBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICAgICAgcHJlYnVpbGRUeC5idWlsZFBhcmFtcyA9IGJ1aWxkUGFyYW1zO1xuICAgICAgcmV0dXJuIFtwcmVidWlsZFR4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgc2luZ2xlIHVuc2lnbmVkIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gc2VuZGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGhvdC9jb2xkIHdhbGxldHNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBjdXN0b2RpYWwgd2FsbGV0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnQocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgICBjYXNlICdob3QnOlxuICAgICAgICBjYXNlICdjb2xkJzpcbiAgICAgICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcykucmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBsaWdodG5pbmcgZm9yIGJ0Yy90YnRjIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsaWdodG5pbmcoKTogTGlnaHRuaW5nIHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNMaWdodG5pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaWdodG5pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmNvaW4oKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBMaWdodG5pbmcodGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPT09ICdsaXRlJyAmJlxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDdXN0b2RpYWwgYW5kIEVDRFNBIE1QQyBhbGdvcml0aG0gbXVzdCBhbHdheXMgdXNlICdmdWxsJyBhcGkgdmVyc2lvbmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVZlcnNpb24gPVxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gfHxcbiAgICAgICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgfHwgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJyA/ICdmdWxsJyA6ICdsaXRlJyk7XG5cbiAgICAvLyBUd28gb3B0aW9ucyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIGZlZXMgc2VlbXMgdG8gbm93IGJlIHN1cHBvcnRlZCwgZm9yIG5vdyB3ZSB3aWxsIHN1cHBvcnQgYm90aCB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZVxuICAgIC8vIFRPRE8oQkctNTk2ODUpOiBkZXByZWNhdGUgb25lIG9mIHRoZXNlIHNvIHRoYXQgd2UgaGF2ZSBhIHNpbmdsZSB3YXkgdG8gcGFzcyBmZWVzXG4gICAgbGV0IGZlZU9wdGlvbnM7XG4gICAgaWYgKHBhcmFtcy5mZWVPcHRpb25zKSB7XG4gICAgICBmZWVPcHRpb25zID0gcGFyYW1zLmZlZU9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZCB8fCBwYXJhbXMuZWlwMTU1OSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID1cbiAgICAgICAgcGFyYW1zLmdhc1ByaWNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgZ2FzUHJpY2U6IHBhcmFtcy5nYXNQcmljZSwgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG1heEZlZVBlckdhczogTnVtYmVyKHBhcmFtcy5laXAxNTU5Py5tYXhGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogTnVtYmVyKHBhcmFtcy5laXAxNTU5Py5tYXhQcmlvcml0eUZlZVBlckdhcyksXG4gICAgICAgICAgICAgIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQsXG4gICAgICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmdhc0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB7IGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmVlT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgc3dpdGNoIChwYXJhbXMudHlwZSkge1xuICAgICAgY2FzZSAndHJhbnNmZXInOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdwYXltZW50JyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG1lbW86IHBhcmFtcy5tZW1vLFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBjdXN0b2RpYW5UcmFuc2FjdGlvbklkOiBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0cmFuc2ZlcnRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpc1RzczogcGFyYW1zLmlzVHNzLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbmFibGV0b2tlbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2VuYWJsZVRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBwYXJhbXMuZW5hYmxlVG9rZW5zLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWNjZWxlcmF0aW9uJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnYWNjZWxlcmF0aW9uJyxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgbG93RmVlVHhpZDogcGFyYW1zLmxvd0ZlZVR4aWQsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaWxsTm9uY2UnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdmaWxsTm9uY2UnLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgbGV0IHVuc2lnbmVkVHg6IEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbjtcblxuICAgIGlmICh0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudW5zaWduZWRUeHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXRJZDogdGhpcy5pZCgpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIGZlZUluZm86IHVuc2lnbmVkVHguZmVlSW5mbyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVkRFNBKFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9LFxuICAgIGNvaW46IElCYXNlQ29pblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgRyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblVzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSB0aGUgZ2V0SGFzaEZ1bmN0aW9uKCkgaXMgZGVmaW5lZCBmb3IgdGhlIGNvaW4gdXNlIGl0IG90aGVyd2lzZVxuICAgIC8vIHBhc3MgdW5kZWZpbmVkIGhhc2gsIGRlZmF1bHQgaGFzaCB3aWxsIGJlIHVzZWQgaW4gdGhhdCBjYXNlLlxuICAgIGxldCBoYXNoOiBIYXNoIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0KHtcbiAgICAgICAgdHhSZXF1ZXN0OiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgICAgICBoYXNoLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBtZXNzYWdlIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduTWVzc2FnZVRzcyhwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCFwYXJhbXMucmVxSWQpIHtcbiAgICAgIHBhcmFtcy5yZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2Ugd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMubWVzc2FnZSwgJ21lc3NhZ2UgcmVxdWlyZWQgZm9yIG1lc3NhZ2Ugc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduTWVzc2FnZScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyxcbiAgICAgICAgICBtZXNzYWdlRW5jb2RlZDogQnVmZmVyLmZyb20ocGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VFbmNvZGVkID8/ICcnKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLmNyZWF0ZVR4UmVxdWVzdFdpdGhJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyhpbnRlbnRPcHRpb24pO1xuICAgICAgICBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBCdWZmZXIuZnJvbShwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA/PyAnJyksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Jyk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlUmF3LFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkTWVzc2FnZVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gbWVzc2FnZSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHlwZWQgZGF0YSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHlwZWREYXRhVHNzKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHR5cGVkIGRhdGEgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMudHlwZWREYXRhLCAndHlwZWREYXRhIHJlcXVpcmVkIGZvciB0eXBlZCBkYXRhIHNpZ25pbmcnKTtcbiAgICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduVHlwZWRTdHJ1Y3R1cmVkRGF0YScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgdHlwZWREYXRhUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgICB0eXBlZERhdGFFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoaW50ZW50T3B0aW9ucyk7XG4gICAgICAgIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbmVkVHlwZWREYXRhUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogSlNPTi5zdHJpbmdpZnkocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpLFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGJ1ZmZlclRvU2lnbjogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkISxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Jyk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHlwZWQgZGF0YSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWFueVRzcyhwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBCRy01MTEyMiBSZW1vdmUgY29uZGl0aW9uYWwgd2hlbiBtb3ZlZCB0byB0eFJlcXVlc3RGdWxsIGZvciBldmVyeXRoaW5nXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdChcbiAgICAgICAgICB0aGlzLmJpdGdvLnVybChcbiAgICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4cmVxdWVzdHMvJyArIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkICsgJy90cmFuc2ZlcnMnLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc2VuZCgpO1xuICAgIH1cblxuICAgIC8vIEVDRFNBIFRTUyB1c2VzIFR4UmVxdWVzdEZ1bGxcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJyB8fCBwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICByZXR1cm4gZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci4gT25seSBzdXBwb3J0cyBldGgtbGlrZSBjb2lucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcyAtIEFkZHJlc3Mgb2YgdGhlIGZvcndhcmRlciB0byBzZW5kIGZ1bmRzIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFtb3VudCAtIEFtb3VudCB0byBzZW5kIHRoZSBmb3J3YXJkZXIgKG9wdGlvbmFsKS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBzZW5kaW5nIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgbmVlZGVkIGZvciBhIGZ1bmQgcmVjb3ZlcnlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcihwYXJhbXM6IEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlciBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZEZvcndhcmRlcicpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZm9yd2FyZGVyJ3MgYmFsYW5jZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBMaXN0IG9mIGZvcndhcmRlciBhZGRyZXNzIGFuZCBiYWxhbmNlXG4gICAqIGlmIHBhcmFtcyBpcyBub3Qgc2V0IHRoZW4gcmV0dXJucyBsb3cgYmFsYW5jZSBmb3J3YXJkZXJzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Rm9yd2FyZGVyQmFsYW5jZShwYXJhbXM/OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8Rm9yd2FyZGVyQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgcXVlcnk6IEZvcndhcmRlckJhbGFuY2VPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcz8ubWF4aW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1heGltdW1CYWxhbmNlID0gcGFyYW1zPy5tYXhpbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5taW5pbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWluaW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1pbmltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvZm9yd2FyZGVycy9iYWxhbmNlc2ApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIEZvcndhcmRlckJhbGFuY2VbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlY2RzYSB0c3MgY2hhbGxlbmdlcyBmb3IgYSB3YWxsZXQuXG4gICAqIFRoZXNlIGFyZSBzdGF0aWMgY2hhbGxlbmdlcyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCBieSBhbiBlbnRlcnByaXNlIGFkbWluLlxuICAgKiBDYWxsZXJzIHNob3VsZCB2ZXJpZnkgdGhhdCBhbiBlbnRlcnByaXNlIGFkbWluIHNpZ25lZCB0aGUgY2hhbGxlbmdlIHZhbHVlcyBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPn1cbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTogUHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+IHtcbiAgICAvLyBub3RlOiB0aGlzIGlzIG5vdCBhIGNvaW4gc3BlY2lmaWMgcm91dGUsIHdlIGNhbm5vdCB1c2UgdGhpcy51cmwoLi4pXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L2NoYWxsZW5nZXNgLCAyKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeSh7fSkucmVzdWx0KCk7XG4gIH1cbn1cbiJdfQ==
|
|
2616
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIscURBQXVDO0FBU3ZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBQThFO0FBQzlFLCtEQUFpRDtBQUNqRCxpREFBa0Q7QUFFbEQsd0RBQXVFO0FBQ3ZFLDhEQUEyRDtBQUMzRCxvQ0FPa0I7QUF1RGxCLDREQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsK0RBQTRDO0FBQzVDLDhDQUFnRDtBQUNoRCxnQ0FBc0M7QUFFdEMsaURBQWdEO0FBRWhELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQiw2RUFBVSxDQUFBO0lBQ1YsdUZBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFHaEM7QUFFRCxNQUFhLE1BQU07SUFPakIsWUFBWSxLQUFnQixFQUFFLFFBQW1CLEVBQUUsVUFBZTtRQUNoRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENB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LGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQWwzRkQsd0JBazNGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7XG4gIElCYXNlQ29pbixcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWwgZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZHJhd0tleWNhcmQgfSBmcm9tICcuLi9pbnRlcm5hbC9rZXljYXJkJztcbmltcG9ydCB7IEtleWNoYWluIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IFRyYWRpbmdBY2NvdW50IH0gZnJvbSAnLi4vdHJhZGluZy90cmFkaW5nQWNjb3VudCc7XG5pbXBvcnQge1xuICBpbmZlckFkZHJlc3NUeXBlLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBUeFJlcXVlc3QsXG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEFkZHJlc3Nlc09wdGlvbnMsXG4gIEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zLFxuICBDaGFuZ2VGZWVPcHRpb25zLFxuICBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyxcbiAgQ3JlYXRlQWRkcmVzc09wdGlvbnMsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIENyb3NzQ2hhaW5VVFhPLFxuICBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyxcbiAgRG93bmxvYWRLZXljYXJkT3B0aW9ucyxcbiAgRmFub3V0VW5zcGVudHNPcHRpb25zLFxuICBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGb3J3YXJkZXJCYWxhbmNlLFxuICBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyxcbiAgRnJlZXplT3B0aW9ucyxcbiAgRnVuZEZvcndhcmRlcnNPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICBJV2FsbGV0LFxuICBNYXhpbXVtU3BlbmRhYmxlLFxuICBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyxcbiAgTW9kaWZ5V2ViaG9va09wdGlvbnMsXG4gIFBhZ2luYXRpb25PcHRpb25zLFxuICBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0LFxuICBSZWNvdmVyVG9rZW5PcHRpb25zLFxuICBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgUmVtb3ZlVXNlck9wdGlvbnMsXG4gIFNlbmRNYW55T3B0aW9ucyxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRFY2RzYUNoYWxsZW5nZXMsXG4gIFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMsXG59IGZyb20gJy4vaVdhbGxldCc7XG5pbXBvcnQgeyBTdGFraW5nV2FsbGV0IH0gZnJvbSAnLi4vc3Rha2luZy9zdGFraW5nV2FsbGV0JztcbmltcG9ydCB7IExpZ2h0bmluZyB9IGZyb20gJy4uL2xpZ2h0bmluZyc7XG5pbXBvcnQgRWRkc2FVdGlscyBmcm9tICcuLi91dGlscy90c3MvZWRkc2EnO1xuaW1wb3J0IHsgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi90c3MnO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBvZmNUb2tlbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdiaXRnbzp2Mjp3YWxsZXQnKTtcblxudHlwZSBNYW5hZ2VVbnNwZW50cyA9ICdjb25zb2xpZGF0ZScgfCAnZmFub3V0JztcblxuZXhwb3J0IGVudW0gTWFuYWdlVW5zcGVudHNPcHRpb25zIHtcbiAgQlVJTERfT05MWSxcbiAgQlVJTERfU0lHTl9TRU5ELFxufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWRkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnYWRkcmVzc1R5cGUnLFxuICAgICAgJ2FwaVZlcnNpb24nLFxuICAgICAgJ2NoYW5nZUFkZHJlc3MnLFxuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICdjcGZwRmVlUmF0ZScsXG4gICAgICAnY3BmcFR4SWRzJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2dhc0xpbWl0JyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnaG9wUGFyYW1zJyxcbiAgICAgICdpZGZTaWduZWRUaW1lc3RhbXAnLFxuICAgICAgJ2lkZlVzZXJJZCcsXG4gICAgICAnaWRmVmVyc2lvbicsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdtYXhGZWUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd0cmFuc2ZlcklkJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnbm9uY2UnLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ3JlY2VpdmVBZGRyZXNzJyxcbiAgICAgICdyZWNpcGllbnRzJyxcbiAgICAgICdyZXNlcnZhdGlvbicsXG4gICAgICAnc2VxdWVuY2VJZCcsXG4gICAgICAnc3RyYXRlZ3knLFxuICAgICAgJ3NvdXJjZUNoYWluJyxcbiAgICAgICdkZXN0aW5hdGlvbkNoYWluJyxcbiAgICAgICd0YXJnZXRXYWxsZXRVbnNwZW50cycsXG4gICAgICAndHJ1c3RsaW5lcycsXG4gICAgICAndHhGb3JtYXQnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3Vuc3BlbnRzJyxcbiAgICAgICdub25QYXJ0aWNpcGF0aW9uJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdtZXNzYWdlS2V5JyxcbiAgICAgICdzdGFraW5nT3B0aW9ucycsXG4gICAgICAnZWlwMTU1OScsXG4gICAgICAna2V5cmVnVHhCYXNlNjQnLFxuICAgICAgJ2Nsb3NlUmVtYWluZGVyVG8nLFxuICAgICAgJ3Rva2VuTmFtZScsXG4gICAgICAnZW5hYmxlVG9rZW5zJyxcbiAgICAgIC8vIHBhcmFtIHRvIHNldCBlbWVyZ2VuY3kgZmxhZyBvbiBhIGN1c3RvZGlhbCB0cmFuc2FjdGlvbi5cbiAgICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBpbiBsZXNzIHRoYW4gMSBob3VyIG9yIGl0IHdpbGwgZmFpbC5cbiAgICAgICdlbWVyZ2VuY3knLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdwcmV2aWV3JyxcbiAgICAgICdrZWVwQWxpdmUnLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb2luIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGNvaW4gdGhpcyB3YWxsZXQgaG9sZHNcbiAgICovXG4gIGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYWJlbCAobmFtZSkgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljIG9iamVjdCBpZHMgZm9yIHRoZSBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuXG4gICAqL1xuICBwdWJsaWMga2V5SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmtleXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVjZWl2ZSBhZGRyZXNzIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIHJlY2VpdmVBZGRyZXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5yZWNlaXZlQWRkcmVzcy5hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2FsbGV0IGlkIG9mIHRoZSB3YWxsZXQgdGhhdCB0aGlzIHdhbGxldCB3YXMgbWlncmF0ZWQgZnJvbS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgYSBCQ0ggd2FsbGV0IHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSBhIEJUQyB3YWxsZXQsXG4gICAqIHRoZSBCQ0ggd2FsbGV0IG1pZ3JhdGVkIGZyb20gZmllbGQgd291bGQgaGF2ZSB0aGUgQlRDIHdhbGxldCBpZC5cbiAgICovXG4gIHB1YmxpYyBtaWdyYXRlZEZyb20oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm1pZ3JhdGVkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEByZXR1cm4geyp8T2JqZWN0fSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGRzIH0gYmFzZSB1bml0c1xuICAgKi9cbiAgdG9rZW5GbHVzaFRocmVzaG9sZHMoKTogYW55IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMudG9rZW5GbHVzaFRocmVzaG9sZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIGNvaW4gaW1wbGVtZW50YXRpb25zXG4gICAqL1xuICBjb2luU3BlY2lmaWMoKTogV2FsbGV0Q29pblNwZWNpZmljIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgYXBwcm92YWxzIG9uIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IElQZW5kaW5nQXBwcm92YWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5wZW5kaW5nQXBwcm92YWxzLm1hcCgoY3VycmVudEFwcHJvdmFsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBjdXJyZW50QXBwcm92YWwsIHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtXYWxsZXR9XG4gICAqL1xuICBhc3luYyByZWZyZXNoKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9ucyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHgnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogIC0gdHhIYXNoIHRoZSB0cmFuc2FjdGlvbiBoYXNoIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2FjdGlvbihwYXJhbXM6IEdldFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4SGFzaCddLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMudHhIYXNoKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2ZlcnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlcnMocGFyYW1zOiBUcmFuc2ZlcnNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBUcmFuc2ZlcnNPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2hMYWJlbCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5zZWFyY2hMYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlYXJjaExhYmVsIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWFyY2hMYWJlbCA9IHBhcmFtcy5zZWFyY2hMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHBhcmFtcy5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVHdGUpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVHdGUgPSBwYXJhbXMuZGF0ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVMdCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVMdCA9IHBhcmFtcy5kYXRlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVHdGUgPSBwYXJhbXMudmFsdWVHdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVMdCA9IHBhcmFtcy52YWx1ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUhleCA9IHBhcmFtcy5pbmNsdWRlSGV4O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuc3RhdGUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHBhcmFtcy5zdGF0ZS5mb3JFYWNoKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIHN0YXRlIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy50eXBlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHlwZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNmZXJzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFRyYW5zZmVyKHBhcmFtczogR2V0VHJhbnNmZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJCeVNlcXVlbmNlSWQocGFyYW1zOiBUcmFuc2ZlckJ5U2VxdWVuY2VJZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci9zZXF1ZW5jZUlkLycgKyBwYXJhbXMuc2VxdWVuY2VJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBhbW91bnQgeW91IGNhbiBzcGVuZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgdW5zcGVudHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBmZWUgcmF0ZSB0byB1c2UgaW4gY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzcGVuZGFibGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5yZWNpcGllbnRBZGRyZXNzIC0gcmVjaXBpZW50IGFkZHJlc3NlcyBmb3IgYSBtb3JlIGFjY3VyYXRlIGNhbGN1bGF0aW9uIG9mIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB0byBzZW5kXG4gICAqIEByZXR1cm5zIHt7bWF4aW11bVNwZW5kYWJsZTogTnVtYmVyLCBjb2luOiBTdHJpbmd9fVxuICAgKiBOT1RFIDogZmVlVHhDb25maXJtVGFyZ2V0IG9taXR0ZWQgb24gcHVycG9zZSBiZWNhdXNlIGdhdWdpbmcgdGhlIG1heGltdW0gc3BlbmRhYmxlIGFtb3VudCB3aXRoIGR5bmFtaWMgZmVlcyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4gICAqL1xuICBhc3luYyBtYXhpbXVtU3BlbmRhYmxlKHBhcmFtczogTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWF4aW11bVNwZW5kYWJsZT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncGxhaW5UYXJnZXQnLFxuICAgICAgJ3JlY2lwaWVudEFkZHJlc3MnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9tYXhpbXVtU3BlbmRhYmxlJykpLnF1ZXJ5KGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVuc3BlbnRzKHBhcmFtczogVW5zcGVudHNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2NoYWlucycsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncHJldklkJyxcbiAgICAgICdzZWd3aXQnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy91bnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgb3IgZmFub3V0IHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb3V0ZU5hbWUgLSBlaXRoZXIgYGNvbnNvbGlkYXRlYCBvciBgZmFub3V0YFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICpcbiAgICogV2FsbGV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBGZWUgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqXG4gICAqIElucHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBPdXRwdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVW5zcGVudHMoXG4gICAgcm91dGVOYW1lOiBNYW5hZ2VVbnNwZW50cyxcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zIHwgRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuXG4gICAgICByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZScgPyAnbGltaXQnIDogJ21heE51bUlucHV0c1RvVXNlJyxcbiAgICAgICdudW1VbnNwZW50c1RvTWFrZScsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtyb3V0ZU5hbWV9VW5zcGVudHNgKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgaWYgKG9wdGlvbiA9PT0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX09OTFkpIHtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSksXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywgeyB0eXBlOiByb3V0ZU5hbWUgfSk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZVxuICAgKi9cbiAgYXN5bmMgY29uc29saWRhdGVVbnNwZW50cyhcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuICAgICAgKHBhcmFtcyBhcyBhbnkpLnJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKTtcbiAgICB9XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbG93IHdvcmtzIGZvciBhbGwgVVRYTyBjb2luc1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG4gICAgICAnYWxsb3dQYXJ0aWFsU3dlZXAnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIC8vIFRPRE8oQkctMzU4OCk6IGFkZCB0eEhleCB2YWxpZGF0aW9uIHRvIHByb3RlY3QgbWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrcyByZXBsYWNpbmcgdGhlIHR4SGV4XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB3YWxsZXQgYWRkcmVzcyBieSBpdHMgaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldEFkZHJlc3MocGFyYW1zOiBHZXRBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydhZGRyZXNzJywgJ2lkJ10pO1xuICAgIGxldCBxdWVyeTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb25lIG9yIG1vcmUgbmV3IGFkZHJlc3MoZXMpIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbiAgICpcbiAgICogSWYgdGhlIGBjb3VudGAgZmllbGQgaXMgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDEsIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlXG4gICAqIGFycmF5IHByb3BlcnR5IG5hbWVkIGBhZGRyZXNzZXNgIGNvbnRhaW5pbmcgYGNvdW50YCBhZGRyZXNzIG9iamVjdHNcbiAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHNpbmdsZSBhZGRyZXNzIG9iamVjdCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNoYWluIG9uIHdoaWNoIHRoZSBuZXcgYWRkcmVzcyBzaG91bGQgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0geyhOdW1iZXJ8U3RyaW5nKX0gcGFyYW1zLmdhc1ByaWNlIGdhcyBwcmljZSBmb3IgbmV3IGFkZHJlc3MgY3JlYXRpb24sIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5sYWJlbCBsYWJlbCBmb3IgdGhlIG5ldyBhZGRyZXNzKGVzKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNvdW50PTEgbnVtYmVyIG9mIG5ldyBhZGRyZXNzZXMgd2hpY2ggc2hvdWxkIGJlIGNyZWF0ZWQgKG1heGltdW0gMjUwKVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZvcndhcmRlclZlcnNpb24gVGhlIHZlcnNpb24gb2YgYWRkcmVzcyB0byBjcmVhdGUsIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubG93UHJpb3JpdHkgRXRoZXJldW0tc3BlY2lmaWMgcGFyYW0gdG8gY3JlYXRlIGFkZHJlc3MgdXNpbmcgbG93IHByaW9yaXR5IGZlZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYmFzZUFkZHJlc3MgYmFzZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQob3B0aW9uYWwgcGFyYW1ldGVyKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5hbGxvd1NraXBWZXJpZnlBZGRyZXNzIFdoZW4gc2V0IHRvIGZhbHNlLCBpdCB0aHJvd3MgZXJyb3IgaWYgYWRkcmVzcyB2ZXJpZmljYXRpb24gaXMgc2tpcHBlZCBmb3IgYW55IHJlYXNvbi4gRGVmYXVsdCBpcyB0cnVlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm9uVG9rZW4gbWFuZGF0b3J5IGluIGNhc2Ugb2YgdGhlIE9GQyB3YWxsZXQsIHRoZSBuYW1lIG9mIHRva2VuIHRvIGNyZWF0ZSBhZGRyZXNzIGZvclxuICAgKiBBZGRyZXNzIHZlcmlmaWNhdGlvbiBjYW4gYmUgc2tpcHBlZCB3aGVuIGZvcndhcmRlclZlcnNpb24gaXMgMCBhbmQgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gaXMgdHJ1ZSBPUlxuICAgKiBpZiAnY29pblNwZWNpZmljJyBpcyBub3QgcGFydCBvZiB0aGUgcmVzcG9uc2UgZnJvbSBhcGkgY2FsbCB0byBjcmVhdGUgYWRkcmVzc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWRkcmVzcyhwYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3NQYXJhbXM6IENyZWF0ZUFkZHJlc3NPcHRpb25zID0ge307XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2hhaW4sXG4gICAgICBnYXNQcmljZSxcbiAgICAgIGxhYmVsLFxuICAgICAgbG93UHJpb3JpdHksXG4gICAgICBmb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgZm9ybWF0LFxuICAgICAgY291bnQgPSAxLFxuICAgICAgYmFzZUFkZHJlc3MsXG4gICAgICBhbGxvd1NraXBWZXJpZnlBZGRyZXNzID0gdHJ1ZSxcbiAgICAgIG9uVG9rZW4sXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciAwLCAxLCAyIG9yIDMnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfSBlbHNlIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcndhcmRlclZlcnNpb24gPSAzO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsYWJlbCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhsYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFzZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYmFzZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFzZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihjb3VudCkgfHwgY291bnQgPD0gMCB8fCBjb3VudCA+IDI1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VudCBoYXMgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTAnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobG93UHJpb3JpdHkpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGxvd1ByaW9yaXR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvd1ByaW9yaXR5IGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubG93UHJpb3JpdHkgPSBsb3dQcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9ybWF0KSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtYXQgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvblRva2VuKSkge1xuICAgICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvZmNUb2tlbnMuaW5jbHVkZXMob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gT0ZDIHRva2VuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcmFtcy5vblRva2VuID0gb25Ub2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIE9GQyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICAvLyBpbmZlciBpdHMgYWRkcmVzcyB0eXBlXG4gICAgICBpZiAoXy5pc09iamVjdChuZXdBZGRyZXNzLmNvaW5TcGVjaWZpYykpIHtcbiAgICAgICAgbmV3QWRkcmVzcy5hZGRyZXNzVHlwZSA9IGluZmVyQWRkcmVzc1R5cGUobmV3QWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25EYXRhOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IF8ubWVyZ2Uoe30sIG5ld0FkZHJlc3MsIHsgcm9vdEFkZHJlc3MgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhlIHVzZXIga2V5IGNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgeyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IChhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG5cbiAgICBsZXQgdXNlclBydjtcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc2hhcmUgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHNraXBLZXljaGFpbiB0byBiZSBhIGJvb2xlYW4uICcpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICAgIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVFbWFpbCB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5lbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZyA9IChhd2FpdCB0aGlzLmJpdGdvLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KSkgYXMgYW55O1xuICAgICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFBydiB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ucHJ2IH0pO1xuICAgICAgICAgIC8vIE9ubHkgb25lIG9mIHB1Yi9jb21tb25QdWIvY29tbW9uS2V5Y2hhaW4gc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGtleWNoYWluXG4gICAgICAgICAgbGV0IHB1YiA9IGtleWNoYWluLnB1YiA/PyBrZXljaGFpbi5jb21tb25QdWI7XG4gICAgICAgICAgaWYgKGtleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgICAgICBwdWIgPVxuICAgICAgICAgICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnXG4gICAgICAgICAgICAgICAgPyBFZGRzYVV0aWxzLmdldFB1YmxpY0tleUZyb21Db21tb25LZXljaGFpbihrZXljaGFpbi5jb21tb25LZXljaGFpbilcbiAgICAgICAgICAgICAgICA6IEVjZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICBwdWIsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICB0b1B1YktleTogc2hhcmluZy5wdWJrZXksXG4gICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5tZXNzYWdlID09PSAnTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKSB7XG4gICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7fTtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBlcnJvciBiZWNhdXNlIHRoaXMgbG9va3MgbGlrZSBhIGNvbGQgd2FsbGV0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgfTtcblxuICAgIGlmIChzaGFyZWRLZXljaGFpbikge1xuICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIGZyb20gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB1c2VySWQgSWQgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVVc2VyKHBhcmFtczogUmVtb3ZlVXNlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VySWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXNlcklkID0gcGFyYW1zLnVzZXJJZDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy91c2VyLycgKyB1c2VySWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkICh1bnNpZ25lZCB0cmFuc2FjdGlvbikgZnJvbSBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdW5zcGVudHMgZ29pbmcgaW50byB0aGlzIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2UgbWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyBvbiBjaGFuZ2UgKGludGVybmFsKSBpbnB1dHMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0LiBJZiB0aGUgd2FsbGV04oCZcyBjdXJyZW50IHVuc3BlbnQgY291bnQgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0LCB1cCB0byBmb3VyIGFkZGl0aW9uYWwgY2hhbmdlIG91dHB1dHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNMaW1pdCAtIEN1c3RvbSBnYXMgbGltaXQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9uUGFydGljaXBhdGlvbiAtIChBbGdvcmFuZCkgTm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkRnJvbUJsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWluaW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRUb0Jsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWF4aW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBCdWlsZCB0aGlzIHRyYW5zYWN0aW9uIHRvIGNvbmZvcm0gd2l0aCBpbnN0YW50IHNlbmRpbmcgY29pbi1zcGVjaWZpYyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMua2VlcEFsaXZlIC0gKFBvbGthZG90KSBrZWVwIGFkZHJlc3MgYWxpdmUgYnkgc2VuZGluZyB0aGUgYWRkcmVzcyBtaW5pbXVtIGZ1bmRpbmcgYW1vdW50LCB1c2VkIGR1cmluZyB3YWxsZXQgY29uc29saWRhdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW0udHJhbnNmZXJJZCAtIHRyYW5zZmVyIElkIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IGNhc3BlcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzVHlwZSAtIFRoZSB0eXBlIG9mIGFkZHJlc3MgdG8gY3JlYXRlIGZvciBjaGFuZ2UuIE9uZSBvZiBgcDJzaGAsIGBwMnNoUDJ3c2hgLCBhbmQgYHAyd3NoYC4gQ2FzZS1zZW5zaXRpdmUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmhvcCAtIEJ1aWxkIHRoaXMgYXMgYW4gRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMucmVzZXJ2YXRpb24gLSBPYmplY3QgdG8gcmVzZXJ2ZSB0aGUgdW5zcGVudHMgdGhhdCB0aGlzIHR4IGJ1aWxkIHVzZXMuIEZvcm1hdCBpcyByZXNlcnZhdGlvbiA9IHsgZXhwaXJlVGltZTogSVNPRGF0ZVN0cmluZywgcGVuZGluZ0FwcHJvdmFsSWQ6IFN0cmluZyB9XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB0byB0aGUgd2FsbGV0IHVzZXIga2V5LCB0byBzaWduIGNvbW1pdG1lbnQgZGF0YSBmb3IgRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIHVzZWQgYXMgdGhlIFwidG9cIiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb25Uc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHsgd2FsbGV0OiB0aGlzLCBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMgfSlcbiAgICApKSBhcyBhbnk7XG4gICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG4gICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICBpZiAodGhpcy5fd2FsbGV0ICYmIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMgJiYgIXBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHtcbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldENvbnRyYWN0QWRkcmVzczogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcyB9KTtcbiAgICB9XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIGFwaVZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiYgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzaWduID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5wcmVzaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzcyh7IC4uLnByZXNpZ24sIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLCBhcGlWZXJzaW9uIH0pO1xuICAgIH1cblxuICAgIGxldCB7IHB1YnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXB1YnMgJiYgdGhpcy5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHlwZWQgc3RydWN0dXJlZCBkYXRhIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduVHlwZWREYXRhKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTaWduaW5nVHlwZWREYXRhKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbiB0eXBlZCBkYXRhIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy50eXBlZERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZWQgZGF0YSByZXF1aXJlZGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlZERhdGEudHlwZWREYXRhUmF3IG11c3QgYmUgSlNPTiBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YSkpIHtcbiAgICAgIHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKHBhcmFtcy50eXBlZERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHsgLi4ucGFyYW1zLCBrZXljaGFpbjoga2V5Y2hhaW5zWzBdIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7IC4uLnBhcmFtcywga2V5Y2hhaW46IGtleWNoYWluc1swXSB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydih1c2VyUHJ2T3B0aW9ucyksXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduTWVzc2FnZVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgZnJvbSBlaXRoZXIgYSBkZXJpdmF0aW9uIG9yIGFuIGVuY3J5cHRlZCBrZXljaGFpblxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIHVzZSB0aGUgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIHByb3BlcnR5IGZyb20gdGhlIHVzZXIga2V5Y2hhaW4gYXMgdGhlIGBjb2xkRGVyaXZhdGlvblNlZWRgXG4gICAgLy8gaWYgbm8gb3RoZXIgYGNvbGREZXJpdmF0aW9uU2VlZGAgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID0gcGFyYW1zLmtleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgfVxuXG4gICAgaWYgKHVzZXJQcnYgJiYgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7IGtleTogdXNlclBydiwgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlckVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBmcm9tIEJpdEdvLCB2YWxpZGF0ZSBpdCwgYW5kIHRoZW4gZGVjcnlwdCB0aGUgdXNlciBrZXkgYW5kIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5ICYmIHBhcmFtcy5nYXNQcmljZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcGFyYW1zLmVpcDE1NTkgYW5kIHBhcmFtcy5nYXNQcmljZSBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfZ2FzUHJpY2VfYW5kX2VpcDE1NTlnYXNNb2RlbF9zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwcmVidWlsZFR4IGFuZCByZWNpcGllbnRzIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9wcmVidWlsZHR4X2FuZF9yZWNpcGllbnRzX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBhcnJheScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuX3Blcm1pc3Npb25zKSAmJiAhdGhpcy5fcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ25vIHNwZW5kIHBlcm1pc3Npb24gb24gdGhpcyB3YWxsZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAndXNlcl9ub3RfYWxsb3dlZF90b19zcGVuZF9mcm9tX3dhbGxldCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2VpdmVBZGRyZXNzICYmIChwYXJhbXMudHlwZSA9PT0gJ3RyYW5zZmVyJyB8fCBwYXJhbXMudHlwZSA9PT0gJ3RyYW5zZmVyVG9rZW4nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHVzZSByZWNlaXZlIGFkZHJlc3MgZm9yIFRTUyB0cmFuc2FjdGlvbnMgb2YgdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNlaXZlX2FkZHJlc3Nfbm90X2FsbG93ZWRfZm9yX3Rzc193aXRoZHJhd2Fscyc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgKHBhcmFtcy50eXBlID09PSAnZmlsbE5vbmNlJyB8fCBwYXJhbXMudHlwZSA9PT0gJ2FjY2VsZXJhdGlvbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgcHJvdmlkZSByZWNpcGllbnRzIGZvciB0cmFuc2FjdGlvbiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FsbG93ZWRfZm9yX2ZpbGxub25jZV9hbmRfYWNjZWxlcmF0aW9uX3R4X3R5cGUnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiAmJiAhcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDoga2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiBhcyBzdHJpbmcsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2UuIEVycm9yOiAke0pTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICk7XG4gICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zIHx8IHBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHR4UHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDoge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtdWx0aXNpZyBhZGRyZXNzIGF0IHdhbGxldCBjcmVhdGlvbiB0aW1lXG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmFkZHJlc3NWZXJzaW9uLFxuICAgICAgfSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2luc3VmZmljaWVudCBmdW5kcycpKSB7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnaW5zdWZmaWNpZW50X2Z1bmRzJztcbiAgICAgICAgZXJyb3Iud2FsbGV0QmFsYW5jZXMgPSB7XG4gICAgICAgICAgYmFsYW5jZVN0cmluZzogdGhpcy5iYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZVN0cmluZzogdGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgYmFsYW5jZTogdGhpcy5iYWxhbmNlKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZTogdGhpcy5jb25maXJtZWRCYWxhbmNlKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZTogdGhpcy5zcGVuZGFibGVCYWxhbmNlKCksXG4gICAgICAgIH07XG4gICAgICAgIGVycm9yLnR4UGFyYW1zID0gXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleSddKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlbGVyYXRlIGEgdHJhbnNhY3Rpb24ncyBjb25maXJtYXRpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIFRPRE8oQkctOTM0OSk6IGNoYW5nZSB0aGUgbGFzdCBjaGVjayB0byA+IDAgYW5kIHRoZSBlcnJvciBtZXNzYWdlIG9uY2UgcGxhdGZvcm0gYWxsb3dzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB0b1xuICAgIC8vICAgICAgICAgICAgICAgIGJlIGJ1bXBlZCBpbiB0aGUgc2FtZSBDUEZQIHRyYW5zYWN0aW9uXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBUeElkcykgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIC8vIFdlIG11c3QgcGFzcyB0aGUgYnVpbGQgcGFyYW1zIHRocm91Z2ggdG8gc3VibWl0IGluIGNhc2UgdGhlIENQRlAgdHggZXZlciBoYXMgdG8gYmUgcmVidWlsdC5cbiAgICBjb25zdCBzdWJtaXRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHBhcmFtcywgYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKTtcbiAgICBkZWxldGUgKHN1Ym1pdFBhcmFtcyBhcyBhbnkpLndhbGxldDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzdWJtaXRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eEhleDogdHJhbnNhY3Rpb24gaGV4IHRvIHN1Ym1pdFxuICAgKiAtIGhhbGZTaWduZWQ6IG9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uICh0eEhleCBvciB0eEJhc2U2NCkgdG8gc3VibWl0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihwYXJhbXM6IFN1Ym1pdFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydvdHAnLCAndHhIZXgnLCAndHhSZXF1ZXN0SWQnXSk7XG4gICAgY29uc3QgaGFzVHhIZXggPSAhIXBhcmFtcy50eEhleDtcbiAgICBjb25zdCBoYXNIYWxmU2lnbmVkID0gISFwYXJhbXMuaGFsZlNpZ25lZDtcblxuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKGhhc1R4SGV4IHx8IGhhc0hhbGZTaWduZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGV4YWN0bHkgb25lIG9mIHR4UmVxdWVzdElkLCB0eEhleCwgb3IgaGFsZlNpZ25lZCcpO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy50eFJlcXVlc3RJZCAmJiAoKGhhc1R4SGV4ICYmIGhhc0hhbGZTaWduZWQpIHx8ICghaGFzVHhIZXggJiYgIWhhc0hhbGZTaWduZWQpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIZXggb3IgaGFsZlNpZ25lZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGNvaW5zIHRvIGEgcmVjaXBpZW50XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtcy5hbW91bnQgLSB0aGUgYW1vdW50IGluIHNhdG9zaGlzL3dlaS9iYXNlIHZhbHVlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kYXRhIC0gW0V0aGVyZXVtIFNwZWNpZmljXSBvcHRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkIC0gW0V0aGVyZXVtL01NSSBTcGVjaWZpY10gaWQgb2YgdHJhbnNhY3Rpb24gY3JlYXRlZCB2aWEgbWV0YW1hc2tcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXMubWluQ29uZmlybXMgLSB0aGUgbWluaW11bSBjb25maXJtYXRpb24gdGhyZXNob2xkIGZvciBpbnB1dHNcbiAgICogQHBhcmFtIHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSB3aGV0aGVyIHRvIGVuZm9yY2UgbWluQ29uZmlybXMgZm9yIGNoYW5nZSBpbnB1dHNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kKHBhcmFtczogU2VuZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnbWVzc2FnZScsICdkYXRhJ10pO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbjtcblxuICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmFtb3VudCk7XG4gICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBwb3NpdGl2ZSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVjaXBpZW50czogU2VuZE1hbnlPcHRpb25zWydyZWNpcGllbnRzJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICB9LFxuICAgIF07XG4gICAgaWYgKHBhcmFtcy50b2tlbk5hbWUpIHtcbiAgICAgIHJlY2lwaWVudHNbMF0udG9rZW5OYW1lID0gcGFyYW1zLnRva2VuTmFtZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIGNvaW4udHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpKSB7XG4gICAgICByZWNpcGllbnRzWzBdLmRhdGEgPSBwYXJhbXMuZGF0YTtcbiAgICB9XG4gICAgY29uc3Qgc2VuZE1hbnlPcHRpb25zOiBTZW5kTWFueU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMsIHsgcmVjaXBpZW50cyB9KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5tYXAoZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgICBpZiAoYW1vdW50LmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbLi4udGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCksICdjb21tZW50JywgJ290cCcsICdob3AnXSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy90eC9pbml0aWF0ZScpKS5zZW5kKHNlbGVjdFBhcmFtcykucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3R4L3NlbmQnKSkuc2VuZChmaW5hbFR4UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjcm9zc0NoYWluIFVUWE9zXG4gICAqIEN1cnJlbnRseSBvbmx5IGZvciBBVkFYXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQ2hhaW4gdGhlIHNvdXJjZWNoYWluIHRvIHBpY2sgVVRYT3MsIGlmIG5vdCBnaXZlbiwgdGhlbiBwaWNrIGZyb20gYWxsIGF2YWlsYWJsZSBjaGFpbnMgW1AsIENdXG4gICAqL1xuICBmZXRjaENyb3NzQ2hhaW5VVFhPcyhwYXJhbXM6IEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyk6IFByb21pc2U8Q3Jvc3NDaGFpblVUWE9bXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgWydzb3VyY2VDaGFpbiddKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9jcm9zc0NoYWluVW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBKU09OIHJlcHJlc2VudGFibGUgdmVyc2lvbiBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9KU09OKCk6IFdhbGxldERhdGEge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHJhZGluZyBhY2NvdW50IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvVHJhZGluZ0FjY291bnQoKTogVHJhZGluZ0FjY291bnQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHRyYWRpbmcgYWNjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYWRpbmdBY2NvdW50KHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1N0YWtpbmdXYWxsZXQoKTogU3Rha2luZ1dhbGxldCB7XG4gICAgY29uc3QgaXNFdGhUc3MgPVxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PSAnZXRoJyAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy53YWxsZXRWZXJzaW9uXG4gICAgICAgID8gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy53YWxsZXRWZXJzaW9uID49IDNcbiAgICAgICAgOiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcywgaXNFdGhUc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgLy8gd2UgbmVlZCB0byBzdGVwIG92ZXIgZWFjaCBwcmVidWlsZCBub3cgLSBzaG91bGQgYmUgaW4gYW4gYXJyYXkgaW4gdGhlIGJvZHlcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zb2xpZGF0ZUFjY291bnRCdWlsZCBvZiBidWlsZFJlc3BvbnNlKSB7XG4gICAgICBsZXQgcHJlYnVpbGQ6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkLCB7IHdhbGxldDogdGhpcywgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zIH0pXG4gICAgICApKSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuXG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgICAgZGVidWcoJ2ZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuXG4gICAgICBjb25zb2xpZGF0aW9ucy5wdXNoKHByZWJ1aWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBwcmVidWlsZFR4ICAgLSB0aGlzIGlzIHRoZSBwcmUtYnVpbGQgY29uc29saWRhdGlvbiB0eC4gdGhpcyBpcyBhIG5vcm1hbGx5IGJ1aWx0IHR4IHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9mIGNvbnNvbGlkYXRlSWQuXG4gICAqICAgICB2ZXJpZmljYXRpb24gLSBub3JtYWwga2V5Y2hhaW5zLCBldGMuIGZvciB2ZXJpZmljYXRpb25cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSAnY29uc29saWRhdGUnO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3R4L2luaXRpYXRlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICAvLyBvbmUgb2YgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCBjb25zb2xpZGF0aW9uIGlkIG9uIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LnR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc29saWRhdGlvbiByZXF1ZXN0IG1pc3NpbmcgdHhSZXF1ZXN0SWQuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBhbnk7XG5cbiAgICAvLyBkZWNvcmF0ZSB3aXRoIG91ciBjb25zb2xpZGF0aW9uIGlkXG4gICAgc2lnbmVkUHJlYnVpbGQuY29uc29saWRhdGVJZCA9IHBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQ7XG5cbiAgICBkZWxldGUgc2lnbmVkUHJlYnVpbGQud2FsbGV0O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9ucy4gVGhpcyBpcyBpbnRlbmRlZCB0byBmbHVzaCBtYW55IGJhbGFuY2VzIHRvIHRoZSByb290IHdhbGxldCBiYWxhbmNlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGdpdmVzIHVzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IChhd2FpdCB0aGlzLmJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKHBhcmFtcykpIGFzIGFueTtcbiAgICBpZiAodW5zaWduZWRCdWlsZHMgJiYgdW5zaWduZWRCdWlsZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICAgIGZvciAoY29uc3QgdW5zaWduZWRCdWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgICAvLyBmb2xkIGFueSBvZiB0aGUgcGFyYW1ldGVycyB3ZSB1c2VkIHRvIGJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gaW50byB0aGUgdW5zaWduZWRCdWlsZFxuICAgICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5wcmVidWlsZFR4ID0gdW5zaWduZWRCdWlsZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRBY2NvdW50Q29uc29saWRhdGlvbih1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5kaXIoZSk7XG4gICAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJucyBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYnVpbGRUb2tlbkVuYWJsZW1lbnRzKFxuICAgIHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH1cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50c2ApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdG9rZW5zIGFyZSBiZWluZyBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3Qgc3BlY2lmeSByZWNpcGllbnRzIGZvciB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9ucycpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIFNwbGl0IHF1ZXJ5IGlmIHdlIGNhbid0IGVuYWJsZSBtdWx0aXBsZSB0b2tlbnMgaW4gb25lIHR4XG4gICAgaWYgKCF0ZUNvbmZpZy5zdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50cyAmJiBwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHF1ZXJpZXMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcChhc3luYyAoZW5hYmxlVG9rZW4pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHtcbiAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbZW5hYmxlVG9rZW5dLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkUGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBidWlsZFBhcmFtcy50eXBlID0gJ2VuYWJsZXRva2VuJztcbiAgICAvLyBDaGVjayBpZiB3ZSBidWlsZCB3aXRoIGludGVudFxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV3cml0ZSB0b2tlbnMgaW50byByZWNpcGllbnRzIGZvciBidWlsZFRyYW5zYWN0aW9uXG4gICAgICBidWlsZFBhcmFtcy5yZWNpcGllbnRzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoKHRva2VuKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB0b2tlbi5hZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBkb2VzIG5vdCBoYXZlIGJhc2UgYWRkcmVzcywgbXVzdCBzcGVjaWZ5IHdpdGggdG9rZW4gcGFyYW0nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgYnVpbGRQYXJhbXMuZW5hYmxlVG9rZW5zO1xuICAgICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyk7XG4gICAgICBwcmVidWlsZFR4LmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICByZXR1cm4gW3ByZWJ1aWxkVHhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSBzaW5nbGUgdW5zaWduZWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgaG90L2NvbGQgd2FsbGV0c1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudChwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uc2ApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4Py5idWlsZFBhcmFtcz8udHlwZSAhPT0gJ2VuYWJsZXRva2VuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVRzcyhwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2hvdCc6XG4gICAgICAgIGNhc2UgJ2NvbGQnOlxuICAgICAgICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgICAgICAgY2FzZSAnY3VzdG9kaWFsJzpcbiAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9pbml0aWF0ZScpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zKS5yZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29tZSBjaGFpbnMgcmVxdWlyZSB0b2tlbnMgdG8gYmUgZW5hYmxlZCBiZWZvcmUgdGhleSBjYW4gYmUgcmVjZWl2ZWQvc2VudC5cbiAgICogVGhpcyBpcyBhIGRlZGljYXRlZCBmdW5jdGlvbiB0aGF0IGVuYWJsZXMgdG9rZW5zLlxuICAgKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSBzZXQgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgZW5hYmxlVG9rZW5zOiBUb2tlbiBlbmFibGVtZW50IG9wZXJhdGlvbnMgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAqIEByZXR1cm5cbiAgICogICAgc3VjY2VzczogU3VjY2Vzc2Z1bCByZXNwb25zZXMgZnJvbSBzZW5kVG9rZW5FbmFibGVtZW50XG4gICAqICAgIGZhaWx1cmU6IEVycm9ycyBmcm9tIGZhaWxlZCB0cmFuc2FjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50cyhwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYW55W107XG4gICAgZmFpbHVyZTogRXJyb3JbXTtcbiAgfT4ge1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRzID0gYXdhaXQgdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMocGFyYW1zKTtcblxuICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgIGZvciAoY29uc3QgdW5zaWduZWRCdWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcHJlYnVpbGRUeDogdW5zaWduZWRCdWlsZCxcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRUb2tlbkVuYWJsZW1lbnQodW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGxpZ2h0bmluZyBmb3IgYnRjL3RidGMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxpZ2h0bmluZygpOiBMaWdodG5pbmcge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c0xpZ2h0bmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExpZ2h0bmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuY29pbigpfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IExpZ2h0bmluZyh0aGlzLmJpdGdvLCB0aGlzKTtcbiAgfVxuXG4gIC8qIE1BUks6IFRTUyBIZWxwZXJzICovXG5cbiAgLyoqXG4gICAqIFByZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZvciBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgcHJlYnVpbGQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVidWlsZFRyYW5zYWN0aW9uVHNzKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2xpdGUnICYmXG4gICAgICAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnIHx8IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1c3RvZGlhbCBhbmQgRUNEU0EgTVBDIGFsZ29yaXRobSBtdXN0IGFsd2F5cyB1c2UgJ2Z1bGwnIGFwaSB2ZXJzaW9uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiB8fFxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnID8gJ2Z1bGwnIDogJ2xpdGUnKTtcblxuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLCBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyksXG4gICAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCxcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvZGlhblRyYW5zYWN0aW9uSWQ6IHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EoXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30sXG4gICAgY29pbjogSUJhc2VDb2luXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBHIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBnZXRIYXNoRnVuY3Rpb24oKSBpcyBkZWZpbmVkIGZvciB0aGUgY29pbiB1c2UgaXQgb3RoZXJ3aXNlXG4gICAgLy8gcGFzcyB1bmRlZmluZWQgaGFzaCwgZGVmYXVsdCBoYXNoIHdpbGwgYmUgdXNlZCBpbiB0aGF0IGNhc2UuXG4gICAgbGV0IGhhc2g6IEhhc2ggfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBCdWZmZXIuZnJvbShwYXJhbXMubWVzc2FnZT8ubWVzc2FnZUVuY29kZWQgPz8gJycpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvck1lc3NhZ2VTaWduaW5nKGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID8/ICcnKSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0eXBlZCBkYXRhICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRNYW55VHNzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbWlzc2luZyBmcm9tIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEJHLTUxMTIyIFJlbW92ZSBjb25kaXRpb25hbCB3aGVuIG1vdmVkIHRvIHR4UmVxdWVzdEZ1bGwgZm9yIGV2ZXJ5dGhpbmdcbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIHRoaXMuYml0Z28udXJsKFxuICAgICAgICAgICAgJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHhyZXF1ZXN0cy8nICsgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQgKyAnL3RyYW5zZmVycycsXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zZW5kKCk7XG4gICAgfVxuXG4gICAgLy8gRUNEU0EgVFNTIHVzZXMgVHhSZXF1ZXN0RnVsbFxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnIHx8IHBhcmFtcy5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIHJldHVybiBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLiBPbmx5IHN1cHBvcnRzIGV0aC1saWtlIGNvaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIHRvIHNlbmQgZnVuZHMgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gQW1vdW50IHRvIHNlbmQgdGhlIGZvcndhcmRlciAob3B0aW9uYWwpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHNlbmRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBuZWVkZWQgZm9yIGEgZnVuZCByZWNvdmVyeVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVyKHBhcmFtczogRnVuZEZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBmb3J3YXJkZXIncyBiYWxhbmNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgZm9yd2FyZGVyIGFkZHJlc3MgYW5kIGJhbGFuY2VcbiAgICogaWYgcGFyYW1zIGlzIG5vdCBzZXQgdGhlbiByZXR1cm5zIGxvdyBiYWxhbmNlIGZvcndhcmRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGb3J3YXJkZXJCYWxhbmNlKHBhcmFtcz86IEZvcndhcmRlckJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxGb3J3YXJkZXJCYWxhbmNlW10+IHtcbiAgICBjb25zdCBxdWVyeTogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zPy5tYXhpbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWF4aW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1heGltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/Lm1pbmltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5taW5pbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWluaW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9mb3J3YXJkZXJzL2JhbGFuY2VzYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgRm9yd2FyZGVyQmFsYW5jZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVjZHNhIHRzcyBjaGFsbGVuZ2VzIGZvciBhIHdhbGxldC5cbiAgICogVGhlc2UgYXJlIHN0YXRpYyBjaGFsbGVuZ2VzIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IGFuIGVudGVycHJpc2UgYWRtaW4uXG4gICAqIENhbGxlcnMgc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGVudGVycHJpc2UgYWRtaW4gc2lnbmVkIHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+fVxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlc0ZvckVjZHNhU2lnbmluZygpOiBQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz4ge1xuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGEgY29pbiBzcGVjaWZpYyByb3V0ZSwgd2UgY2Fubm90IHVzZSB0aGlzLnVybCguLilcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vY2hhbGxlbmdlc2AsIDIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHt9KS5yZXN1bHQoKTtcbiAgfVxufVxuIl19
|