@bitgo/abstract-utxo 8.2.0 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -966,7 +966,7 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
966
966
|
}
|
|
967
967
|
async getExtraPrebuildParams(buildParams) {
|
|
968
968
|
let txFormat = buildParams.txFormat;
|
|
969
|
-
let
|
|
969
|
+
let changeAddressType = buildParams.changeAddressType;
|
|
970
970
|
const walletFlagMusigKp = buildParams.wallet.flag('musigKp') === 'true';
|
|
971
971
|
// if the txFormat is not specified, we need to default to psbt for distributed custody wallets or testnet hot wallets
|
|
972
972
|
if (buildParams.txFormat === undefined &&
|
|
@@ -980,14 +980,12 @@ class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
|
|
|
980
980
|
if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
|
|
981
981
|
buildParams.changeAddressType === undefined &&
|
|
982
982
|
buildParams.changeAddress === undefined &&
|
|
983
|
-
buildParams.wallet.type() === 'hot'
|
|
984
|
-
|
|
985
|
-
(this.network === utxolib.networks.testnet || walletFlagMusigKp)) {
|
|
986
|
-
addressType = 'p2trMusig2';
|
|
983
|
+
buildParams.wallet.type() === 'hot') {
|
|
984
|
+
changeAddressType = ['p2trMusig2', 'p2tr', 'p2wsh', 'p2shP2wsh', 'p2sh'];
|
|
987
985
|
}
|
|
988
986
|
return {
|
|
989
987
|
txFormat,
|
|
990
|
-
|
|
988
|
+
changeAddressType,
|
|
991
989
|
};
|
|
992
990
|
}
|
|
993
991
|
preCreateBitGo(params) {
|
|
@@ -1019,4 +1017,4 @@ exports.AbstractUtxoCoin = AbstractUtxoCoin;
|
|
|
1019
1017
|
* TODO BTC-276: This cache may need to be done with LRU like memory safe caching if memory issues comes up.
|
|
1020
1018
|
*/
|
|
1021
1019
|
AbstractUtxoCoin.PSBT_CACHE = new Map();
|
|
1022
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkNBQTJDO0FBQzNDLDhDQUEwRTtBQUMxRSxpQ0FBaUM7QUFDakMsb0RBQW9EO0FBQ3BELG1DQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsNEJBQTRCO0FBQzVCLCtDQUFxQztBQUVyQyx5Q0FRb0I7QUFFcEIsOENBNEN5QjtBQUN6QiwrQ0FBaUU7QUFFakUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBR3hDLHlEQUErRDtBQUMvRCxpQ0FBMkU7QUFDM0UscUNBQXlEO0FBQ3pELCtDQUFxRjtBQTJCckYsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsR0FBRyxnQkFBSyxDQUFDO0FBc0V2RixNQUFhLHNCQUF1QixTQUFRLGlCQUFNO0lBR2hELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLFVBQWU7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTkQsd0RBTUM7QUEwSUQsTUFBc0IsZ0JBQWlCLFNBQVEsbUJBQVE7SUFNckQsWUFBc0IsS0FBZ0IsRUFBRSxPQUF3QixFQUFFLGFBQWtDLFFBQVE7UUFDMUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0Q7Z0JBQzdELDZFQUE2RSxDQUNoRixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixD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QUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0IsQ0FDNUIsWUFBNkMsRUFDN0MsU0FBMkI7UUFFM0IsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBaUI7UUFDbkMsT0FBTyxJQUFBLGtCQUFPLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7O0FBN3JDSCw0Q0E4ckNDO0FBNXFDQzs7Ozs7OztHQU9HO0FBQ3FCLDJCQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UsIGJpdGdvLCBpc1Rlc3RuZXQgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmltcG9ydCB7XG4gIENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZCxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQsXG4gIGZvckNvaW4sXG4gIHJlY292ZXJDcm9zc0NoYWluLFxuICBSZWNvdmVyeVByb3ZpZGVyLFxuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgUmVjb3ZlclBhcmFtcyxcbn0gZnJvbSAnLi9yZWNvdmVyeSc7XG5cbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEFkZHJlc3NUeXBlQ2hhaW5NaXNtYXRjaEVycm9yLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5LFxuICBFeHRyYVByZWJ1aWxkUGFyYW1zT3B0aW9ucyxcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgSUJhc2VDb2luLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBpc1RyaXBsZSxcbiAgSVRyYW5zYWN0aW9uRXhwbGFuYXRpb24gYXMgQmFzZVRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIElXYWxsZXQsXG4gIEtleWNoYWluLFxuICBLZXljaGFpbnNUcmlwbGV0LFxuICBLZXlJbmRpY2VzLFxuICBQMnNoUDJ3c2hVbnN1cHBvcnRlZEVycm9yLFxuICBQMnRyTXVzaWcyVW5zdXBwb3J0ZWRFcnJvcixcbiAgUDJ0clVuc3VwcG9ydGVkRXJyb3IsXG4gIFAyd3NoVW5zdXBwb3J0ZWRFcnJvcixcbiAgUGFyc2VkVHJhbnNhY3Rpb24gYXMgQmFzZVBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWNyZWF0ZUJpdEdvT3B0aW9ucyxcbiAgUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgcHJvbWlzZVByb3BzLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBUcmFuc2FjdGlvblBhcmFtcyBhcyBCYXNlVHJhbnNhY3Rpb25QYXJhbXMsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQgYXMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmlwbGUsXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFcnJvcixcbiAgVmVyaWZpY2F0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMgYXMgQmFzZVZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0LFxuICBXYWxsZXREYXRhLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djI6dXR4bycpO1xuXG5pbXBvcnQgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5pbXBvcnQgeyBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50IH0gZnJvbSAnLi9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlQc2J0LCBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24gfSBmcm9tICcuL3NpZ24nO1xuaW1wb3J0IHsgc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXMgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBleHBsYWluUHNidCwgZXhwbGFpblR4LCBnZXRQc2J0VHhJbnB1dHMsIGdldFR4SW5wdXRzIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5cbnR5cGUgVXR4b0N1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHtcbiAgKHBhcmFtczoge1xuICAgIGNvaW46IElCYXNlQ29pbjtcbiAgICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICAgIHB1YnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBzaWduaW5nU3RlcCBmbGFnIGJlY29tZXMgYXBwbGljYWJsZSB3aGVuIGJvdGggb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gICAgICogMSkgV2hlbiB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgaXMgYWN0aXZhdGVkXG4gICAgICogMikgV2hlbiB0aGUgUFNCVCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dC5cbiAgICAgKlxuICAgICAqIFRoZSBzaWduaW5nIHByb2Nlc3Mgb2YgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGlzIGEgNC1zdGVwIHNlcXVlbmNlOlxuICAgICAqIGkpIHVzZXIgbm9uY2UgZ2VuZXJhdGlvbiAtIHNpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBleHRlcm5hbCBleHByZXNzIHNpZ25lciBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaSkgYml0Z28gbm9uY2UgZ2VuZXJhdGlvbiAtIGNvc2lnbmVyTm9uY2UgLSB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgb25seSBjYWxsIHRvIGxvY2FsIHNpZ25UcmFuc2FjdGlvblxuICAgICAqIGlpaSkgdXNlciBzaWduYXR1cmUgLSBzaWduZXJTaWduYXR1cmUgLSB0aGlzIGlzIHRoZSBzZWNvbmQgY2FsbCB0byBleHRlcm5hbCBleHByZXNzIHNpZ25lciBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpdikgYml0Z28gc2lnbmF0dXJlIC0gbm90IGluIHNpZ25UcmFuc2FjdGlvbiBtZXRob2TigJlzIHNjb3BlXG4gICAgICpcbiAgICAgKiBJbiB0aGUgYWJzZW5jZSBvZiB0aGlzIGZsYWcsIHRoZSBhZm9yZW1lbnRpb25lZCBmaXJzdCB0aHJlZSBzZXF1ZW5jZSBpcyBleGVjdXRlZCBpbiBhIHNpbmdsZSBzaWduVHJhbnNhY3Rpb24gY2FsbC5cbiAgICAgKlxuICAgICAqIE5PVEU6IFdlIG1ha2UgYSBzdHJvbmcgYXNzdW1wdGlvbiB0aGF0IHRoZSBleHRlcm5hbCBleHByZXNzIHNpZ25lciBhbmQgaXRzIGNhbGxlciB1c2VzIHN0aWNreSBzZXNzaW9ucyxcbiAgICAgKiBzaW5jZSBQU0JUcyBhcmUgY2FjaGVkIGluIHN0ZXAgMSB0byBiZSB1c2VkIGluIHN0ZXAgMyBmb3IgTXVTaWcyIHVzZXIgc2VjdXJlIG5vbmNlIGFjY2Vzcy5cbiAgICAgKi9cbiAgICBzaWduaW5nU3RlcD86ICdzaWduZXJOb25jZScgfCAnc2lnbmVyU2lnbmF0dXJlJyB8ICdjb3NpZ25lck5vbmNlJztcbiAgfSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+O1xufTtcblxuY29uc3QgeyBnZXRFeHRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cyB9ID0gYml0Z287XG50eXBlIFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBiaXRnby5VbnNwZW50PFROdW1iZXI+O1xuXG50eXBlIFJvb3RXYWxsZXRLZXlzID0gYml0Z28uUm9vdFdhbGxldEtleXM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5QWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMge1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dCB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmcgfCBudW1iZXI7XG4gIGV4dGVybmFsPzogYm9vbGVhbjtcbiAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjxzdHJpbmcsIHN0cmluZz4ge1xuICBsb2NrdGltZTogbnVtYmVyO1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBpbnB1dCBzaWduYXR1cmVzIHBlciBpbnB1dC5cbiAgICovXG4gIGlucHV0U2lnbmF0dXJlczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEhpZ2hlc3QgaW5wdXQgc2lnbmF0dXJlIGNvdW50IGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNpZ25hdHVyZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkluZm88VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICAvKiogTWFwcyB0eGlkIHRvIHR4aGV4LiBSZXF1aXJlZCBmb3Igb2ZmbGluZSBzaWduaW5nLiAqL1xuICB0eEhleGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY2hhbmdlQWRkcmVzc2VzPzogc3RyaW5nW107XG4gIC8qKiBwc2J0IGRvZXMgbm90IHJlcXVpcmUgdW5zcGVudHMuICovXG4gIHVuc3BlbnRzPzogVW5zcGVudDxUTnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIGZlZUluZm8/OiBzdHJpbmc7XG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgVXR4b05ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblBhcmFtcyBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyB7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIHJiZlR4SWRzPzogc3RyaW5nW107XG59XG5cbi8vIHBhcnNlVHJhbnNhY3Rpb25zJyByZXR1cm4gdHlwZSBtYWtlcyB1c2Ugb2YgV2FsbGV0RGF0YSdzIHR5cGUgYnV0IHdpdGggY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyBhcyByZXF1aXJlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RVdHhvQ29pbldhbGxldERhdGEgZXh0ZW5kcyBXYWxsZXREYXRhIHtcbiAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlczoge1xuICAgIHVzZXI6IHN0cmluZztcbiAgICBiYWNrdXA6IHN0cmluZztcbiAgICBiaXRnbzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbldhbGxldCBleHRlbmRzIFdhbGxldCB7XG4gIHB1YmxpYyBfd2FsbGV0OiBBYnN0cmFjdFV0eG9Db2luV2FsbGV0RGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXREYXRhOiBhbnkpIHtcbiAgICBzdXBlcihiaXRnbywgYmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogQWJzdHJhY3RVdHhvQ29pbldhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VQYXJzZWRUcmFuc2FjdGlvbiB7XG4gIGtleWNoYWluczoge1xuICAgIHVzZXI/OiBLZXljaGFpbjtcbiAgICBiYWNrdXA/OiBLZXljaGFpbjtcbiAgICBiaXRnbz86IEtleWNoYWluO1xuICB9O1xuICBrZXlTaWduYXR1cmVzOiB7XG4gICAgYmFja3VwUHViPzogc3RyaW5nO1xuICAgIGJpdGdvUHViPzogc3RyaW5nO1xuICB9O1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgbWlzc2luZ091dHB1dHM6IE91dHB1dFtdO1xuICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogT3V0cHV0W107XG4gIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG4gIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogVE51bWJlcjtcbiAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBUTnVtYmVyO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAga2V5Y2hhaW5zOiB7XG4gICAgcHViOiBzdHJpbmc7XG4gICAgYXNwS2V5SWQ/OiBzdHJpbmc7XG4gIH1bXTtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljO1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbn1cblxudHlwZSBVdHhvQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyAmIHtcbiAgLyoqIFRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gYml0Z28gc2VydmVyICovXG4gIHR4UHJlYnVpbGQ6IHtcbiAgICAvKipcbiAgICAgKiB3YWxsZXRJZCBpcyByZXF1aXJlZCBpbiBmb2xsb3dpbmcgMiBzY2VuYXJpb3MuXG4gICAgICogMS4gRXh0ZXJuYWwgc2lnbmVyIGV4cHJlc3MgbW9kZSBpcyB1c2VkLlxuICAgICAqIDIuIGJpdGdvIE11U2lnMiBub25jZSBpcyByZXF1ZXN0ZWRcbiAgICAgKi9cbiAgICB3YWxsZXRJZD86IHN0cmluZztcbiAgICB0eEhleDogc3RyaW5nO1xuICAgIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgfTtcbiAgLyoqIHhwdWJzIHRyaXBsZSBmb3Igd2FsbGV0ICh1c2VyLCBiYWNrdXAsIGJpdGdvKS4gUmVxdWlyZWQgb25seSB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbm90IGEgUFNCVCAqL1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIC8qKiB4cHViIGZvciBjb3NpZ25lciAoZGVmYXVsdHMgdG8gYml0Z28pICovXG4gIGNvc2lnbmVyUHViPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCBjcmVhdGVzIGZ1bGwtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGhvdXQgcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICogV2hlbiBmYWxzZSwgY3JlYXRlcyBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHBsYWNlaG9sZGVyIHNpZ25hdHVyZXMuXG4gICAqL1xuICBpc0xhc3RTaWduYXR1cmU/OiBib29sZWFuO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgYWxsb3dzIHNpZ25pbmcgYSBub24tc2Vnd2l0IGlucHV0IHdpdGggYSB3aXRuZXNzVXR4byBpbnN0ZWFkIHJlcXVpcmluZyBhIHByZXZpb3VzXG4gICAqIHRyYW5zYWN0aW9uIChub25XaXRuZXNzVXR4bylcbiAgICovXG4gIGFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHg/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPiAmXG4gIChcbiAgICB8IHtcbiAgICAgICAgcHJ2OiBzdHJpbmc7XG4gICAgICAgIHNpZ25pbmdTdGVwPzogJ3NpZ25lck5vbmNlJyB8ICdzaWduZXJTaWduYXR1cmUnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnO1xuICAgICAgfVxuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2lnQWRkcmVzcyB7XG4gIG91dHB1dFNjcmlwdDogQnVmZmVyO1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIGFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zIHtcbiAgdHhpZDogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIHhwcnY/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGNvaW4/OiBBYnN0cmFjdFV0eG9Db2luO1xuICByZWNvdmVyeUNvaW4/OiBBYnN0cmFjdFV0eG9Db2luO1xuICBzaWduZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zIHtcbiAgdXNlcktleWNoYWluOiB7IHB1Yj86IHN0cmluZyB9O1xuICBrZXljaGFpblRvVmVyaWZ5OiB7IHB1Yj86IHN0cmluZyB9O1xuICBrZXlTaWduYXR1cmU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IEtleWNoYWluO1xuICBkaXNhYmxlTmV0d29ya2luZzogYm9vbGVhbjtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICB3YWxsZXQ6IEFic3RyYWN0VXR4b0NvaW5XYWxsZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblBzYnRSZXF1ZXN0IHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVzcG9uc2Uge1xuICBwc2J0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFV0eG9Db2luIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwdWJsaWMgYWx0U2NyaXB0SGFzaD86IG51bWJlcjtcbiAgcHVibGljIHN1cHBvcnRBbHRTY3JpcHREZXN0aW5hdGlvbj86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaywgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICAgIGlmICghdXR4b2xpYi5pc1ZhbGlkTmV0d29yayhuZXR3b3JrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnaW52YWxpZCBuZXR3b3JrOiBwbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB0aGUgc2FtZSB2ZXJzaW9uIG9mICcgK1xuICAgICAgICAgICdAYml0Z28vdXR4by1saWIgYXMgdGhpcyBsaWJyYXJ5IHdoZW4gaW5pdGlhbGl6aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICAgIHRoaXMuX25ldHdvcmsgPSBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleSBWYWx1ZTogVW5zaWduZWQgdHggaWQgPT4gUFNCVFxuICAgKiBJdCBpcyB1c2VkIHRvIGNhY2hlIFBTQlRzIHdpdGggdGFwcm9vdCBrZXkgcGF0aCAoTXVTaWcyKSBpbnB1dHMgZHVyaW5nIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZC5cbiAgICogUmVhc29uOiBNdVNpZzIgc2lnbmVyIHNlY3VyZSBub25jZSBpcyBjYWNoZWQgaW4gdGhlIFV0eG9Qc2J0IG9iamVjdC4gSXQgd2lsbCBiZSByZXF1aXJlZCBkdXJpbmcgdGhlIHNpZ25pbmcgc3RlcC5cbiAgICogRm9yIG1vcmUgaW5mbywgY2hlY2sgU2lnblRyYW5zYWN0aW9uT3B0aW9ucy5zaWduaW5nU3RlcFxuICAgKlxuICAgKiBUT0RPIEJUQy0yNzY6IFRoaXMgY2FjaGUgbWF5IG5lZWQgdG8gYmUgZG9uZSB3aXRoIExSVSBsaWtlIG1lbW9yeSBzYWZlIGNhY2hpbmcgaWYgbWVtb3J5IGlzc3VlcyBjb21lcyB1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBTQlRfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgdXR4b2xpYi5iaXRnby5VdHhvUHNidD4oKTtcblxuICBnZXQgbmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy5fbmV0d29yaztcbiAgfVxuXG4gIHN3ZWVwV2l0aFNlbmRNYW55KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIHN0YXRpYyBnZXQgdmFsaWRBZGRyZXNzVHlwZXMoKTogU2NyaXB0VHlwZTJPZjNbXSB7XG4gICAgcmV0dXJuIFsuLi5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mM107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmFjdG9yIGJldHdlZW4gdGhlIGJhc2UgdW5pdCBhbmQgaXRzIHNtYWxsZXN0IHN1YmRpdmlzb25cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0QmFzZUZhY3RvcigpIHtcbiAgICByZXR1cm4gMWU4O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXRDb2luTGlicmFyeSgpIHtcbiAgICByZXR1cm4gdXR4b2xpYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbVxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBwYXJhbT86IHsgYW55Rm9ybWF0OiBib29sZWFuIH0gfCAvKiBsZWdhY3kgcGFyYW1ldGVyICovIGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnYm9vbGVhbicgJiYgcGFyYW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVwcmVjYXRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHMgPSBwYXJhbSAmJiBwYXJhbS5hbnlGb3JtYXQgPyB1bmRlZmluZWQgOiBbJ2RlZmF1bHQnIGFzIGNvbnN0XTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzRm9ybWF0LnRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cyhhZGRyZXNzLCB0aGlzLm5ldHdvcmssIGZvcm1hdHMpO1xuICAgICAgcmV0dXJuIGFkZHJlc3MgPT09IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdCwgdGhpcy5uZXR3b3JrKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmlwMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJsb2NrIGhlaWdodFxuICAgKiBAcGFyYW0gcmVxSWRcbiAgICovXG4gIGFzeW5jIGdldExhdGVzdEJsb2NrSGVpZ2h0KHJlcUlkPzogUmVxdWVzdFRyYWNlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBjaGFpbmhlYWQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3B1YmxpYy9ibG9jay9sYXRlc3QnKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIChjaGFpbmhlYWQgYXMgYW55KS5oZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGN1c3RvbSBjb2luIGxvZ2ljIGFmdGVyIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBCaXRHb1xuICAgKiBAcGFyYW0gcHJlYnVpbGRcbiAgICovXG4gIGFzeW5jIHBvc3RQcm9jZXNzUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJlYnVpbGQudHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhQcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cbiAgICBjb25zdCB0eCA9IGJpdGdvLmlzUHNidChwcmVidWlsZC50eEhleClcbiAgICAgID8gYml0Z28uY3JlYXRlUHNidEZyb21IZXgocHJlYnVpbGQudHhIZXgsIHRoaXMubmV0d29yaylcbiAgICAgIDogdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4ocHJlYnVpbGQudHhIZXgpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHByZWJ1aWxkLmJsb2NrSGVpZ2h0KSkge1xuICAgICAgcHJlYnVpbGQuYmxvY2tIZWlnaHQgPSAoYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja0hlaWdodCgpKSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgdHhIZXg6IHR4LnRvSGV4KCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZpcnN0XG4gICAqIEBwYXJhbSBzZWNvbmRcbiAgICogQHJldHVybnMge0FycmF5fSBBbGwgb3V0cHV0cyB0aGF0IGFyZSBpbiB0aGUgZmlyc3QgYXJyYXkgYnV0IG5vdCBpbiB0aGUgc2Vjb25kXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIG91dHB1dERpZmZlcmVuY2UoZmlyc3Q6IE91dHB1dFtdLCBzZWNvbmQ6IE91dHB1dFtdKTogT3V0cHV0W10ge1xuICAgIGNvbnN0IGtleUZ1bmMgPSAoeyBhZGRyZXNzLCBhbW91bnQgfTogT3V0cHV0KTogc3RyaW5nID0+IGAke2FkZHJlc3N9OiR7YW1vdW50fWA7XG4gICAgY29uc3QgZ3JvdXBlZE91dHB1dHMgPSBfLmdyb3VwQnkoZmlyc3QsIGtleUZ1bmMpO1xuXG4gICAgc2Vjb25kLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBncm91cGVkT3V0cHV0c1trZXlGdW5jKG91dHB1dCldO1xuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGdyb3VwLnBvcCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIF8uZmxhdHRlbihfLnZhbHVlcyhncm91cGVkT3V0cHV0cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBhbiBhZGRyZXNzJyB0eXBlIGJhc2VkIG9uIGl0cyB3aXRuZXNzIGFuZCByZWRlZW0gc2NyaXB0IHByZXNlbmNlXG4gICAqIEBwYXJhbSBhZGRyZXNzRGV0YWlsc1xuICAgKi9cbiAgc3RhdGljIGluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHM6IHsgY2hhaW46IG51bWJlciB9KTogU2NyaXB0VHlwZTJPZjMgfCBudWxsIHtcbiAgICByZXR1cm4gaXNDaGFpbkNvZGUoYWRkcmVzc0RldGFpbHMuY2hhaW4pID8gc2NyaXB0VHlwZUZvckNoYWluKGFkZHJlc3NEZXRhaWxzLmNoYWluKSA6IG51bGw7XG4gIH1cblxuICBjcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgaGV4OiBzdHJpbmdcbiAgKTogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyPihoZXgsIHRoaXMubmV0d29yaywgdGhpcy5hbW91bnRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGFuZCBmaWxsIHRyYW5zYWN0aW9uIGRldGFpbHMgc3VjaCBhcyBpbnRlcm5hbC9jaGFuZ2Ugc3BlbmQsIGV4dGVybmFsIHNwZW5kIChleHBsaWNpdCB2cy4gaW1wbGljaXQpLCBldGMuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uID0ge30sIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nKSAmJiAhXy5pc0Jvb2xlYW4odmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSB2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmc7XG5cbiAgICBjb25zdCBmZXRjaEtleWNoYWlucyA9IGFzeW5jICh3YWxsZXQ6IElXYWxsZXQpOiBQcm9taXNlPFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddPiA9PiB7XG4gICAgICByZXR1cm4gcHJvbWlzZVByb3BzKHtcbiAgICAgICAgdXNlcjogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuVVNFUl0sIHJlcUlkIH0pLFxuICAgICAgICBiYWNrdXA6IHRoaXMua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IHdhbGxldC5rZXlJZHMoKVtLZXlJbmRpY2VzLkJBQ0tVUF0sIHJlcUlkIH0pLFxuICAgICAgICBiaXRnbzogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQklUR09dLCByZXFJZCB9KSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgICBsZXQga2V5Y2hhaW5zOiBWZXJpZmljYXRpb25PcHRpb25zWydrZXljaGFpbnMnXSB8IHVuZGVmaW5lZCA9IHZlcmlmaWNhdGlvbi5rZXljaGFpbnM7XG4gICAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBmZXRjaCBrZXljaGFpbnMgd2l0aG91dCBuZXR3b3JraW5nJyk7XG4gICAgICB9XG4gICAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyh3YWxsZXQpO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zIHx8ICFrZXljaGFpbnMudXNlciB8fCAha2V5Y2hhaW5zLmJhY2t1cCB8fCAha2V5Y2hhaW5zLmJpdGdvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWlucyBhcmUgcmVxdWlyZWQsIGJ1dCBjb3VsZCBub3QgYmUgZmV0Y2hlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWluQXJyYXk6IFRyaXBsZTxLZXljaGFpbj4gPSBba2V5Y2hhaW5zLnVzZXIsIGtleWNoYWlucy5iYWNrdXAsIGtleWNoYWlucy5iaXRnb107XG5cbiAgICBjb25zdCBrZXlTaWduYXR1cmVzID0gXy5nZXQod2FsbGV0LCAnX3dhbGxldC5rZXlTaWduYXR1cmVzJywge30pO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodHhQcmVidWlsZC50eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIC8vIG9idGFpbiBhbGwgb3V0cHV0c1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICB0eEluZm86IHR4UHJlYnVpbGQudHhJbmZvLFxuICAgICAgcHViczoga2V5Y2hhaW5BcnJheS5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgICB9KTtcbiAgICBjb25zdCBhbGxPdXRwdXRzID0gWy4uLmV4cGxhbmF0aW9uLm91dHB1dHMsIC4uLmV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNdO1xuXG4gICAgbGV0IGV4cGVjdGVkT3V0cHV0cztcbiAgICBpZiAodHhQYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGFzc2VydCh0eFBhcmFtcy5yYmZUeElkcy5sZW5ndGggPT09IDEpO1xuXG4gICAgICBjb25zdCB0eFRvQmVSZXBsYWNlZCA9IGF3YWl0IHdhbGxldC5nZXRUcmFuc2FjdGlvbih7IHR4SGFzaDogdHhQYXJhbXMucmJmVHhJZHNbMF0sIGluY2x1ZGVSYmY6IHRydWUgfSk7XG4gICAgICBleHBlY3RlZE91dHB1dHMgPSB0eFRvQmVSZXBsYWNlZC5vdXRwdXRzXG4gICAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LndhbGxldCAhPT0gd2FsbGV0LmlkKCkpIC8vIEZvciBzZWxmLXNlbmRzLCB0aGUgd2FsbGV0SWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgd2FsbGV0J3MgaWRcbiAgICAgICAgLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgYW1vdW50OiBCaWdJbnQob3V0cHV0LnZhbHVlU3RyaW5nKSwgYWRkcmVzczogdGhpcy5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdmVyaWZ5IHRoYXQgZWFjaCByZWNpcGllbnQgZnJvbSB0eFBhcmFtcyBoYXMgdGhlaXIgb3duIG91dHB1dFxuICAgICAgZXhwZWN0ZWRPdXRwdXRzID0gXy5nZXQodHhQYXJhbXMsICdyZWNpcGllbnRzJywgW10gYXMgVHJhbnNhY3Rpb25SZWNpcGllbnRbXSkubWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub3V0cHV0LCBhZGRyZXNzOiB0aGlzLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4ub3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIGFsbE91dHB1dHMpO1xuXG4gICAgLy8gZ2V0IHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSB3YWxsZXQgaWYgbmVlZGVkXG4gICAgbGV0IGN1c3RvbUNoYW5nZTogQ3VzdG9tQ2hhbmdlT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IGN1c3RvbUNoYW5nZVdhbGxldElkID0gdW5kZWZpbmVkIH0gPSB3YWxsZXQuY29pblNwZWNpZmljKCkgfHwge307XG4gICAgaWYgKGN1c3RvbUNoYW5nZVdhbGxldElkKSB7XG4gICAgICAvLyBmZXRjaCBrZXljaGFpbnMgZnJvbSBjdXN0b20gY2hhbmdlIHdhbGxldCBmb3IgZGVyaXZpbmcgYWRkcmVzc2VzLlxuICAgICAgLy8gVGhlc2Uga2V5Y2hhaW5zIHNob3VsZCBiZSBzaWduZWQgYW5kIHRoaXMgc2hvdWxkIGJlIHZlcmlmaWVkIGluIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gd2FsbGV0Ll93YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcztcbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldDogV2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRzKCkuZ2V0KHsgaWQ6IGN1c3RvbUNoYW5nZVdhbGxldElkIH0pO1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5cyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGN1c3RvbUNoYW5nZVdhbGxldCk7XG5cbiAgICAgIGlmICghY3VzdG9tQ2hhbmdlS2V5cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBrZXljaGFpbnMgZm9yIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2VLZXlzLnVzZXIgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyAmJiBjdXN0b21DaGFuZ2VXYWxsZXQpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zOiBbS2V5Y2hhaW4sIEtleWNoYWluLCBLZXljaGFpbl0gPSBbXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwLFxuICAgICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYml0Z28sXG4gICAgICAgIF07XG5cbiAgICAgICAgY3VzdG9tQ2hhbmdlID0ge1xuICAgICAgICAgIGtleXM6IGN1c3RvbUNoYW5nZUtleWNoYWlucyxcbiAgICAgICAgICBzaWduYXR1cmVzOiBbXG4gICAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLnVzZXIsXG4gICAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCxcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYml0Z28sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgICAqIG9yIGV4dGVybmFsIHNwZW5kcyBieSBzZXR0aW5nIHRoZSBcImV4dGVybmFsXCIgcHJvcGVydHkgdG8gdHJ1ZSBvciBmYWxzZSBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYWxsT3V0cHV0cy5tYXAoKGN1cnJlbnRPdXRwdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlT3V0cHV0KHtcbiAgICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICAgIGNvaW46IHRoaXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAga2V5Y2hhaW5BcnJheSxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gYWxsT3V0cHV0RGV0YWlscy5zb21lKFxuICAgICAgKG91dHB1dCkgPT4gb3V0cHV0Lm5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IGNoYW5nZU91dHB1dHMgPSBfLmZpbHRlcihhbGxPdXRwdXREZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcblxuICAgIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG91dHB1dHMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHJlY2lwaWVudHNcbiAgICAvLyBpZGVhbGx5IGNoYW5nZSBvdXRwdXRzIG9yIGEgcGF5Z28gb3V0cHV0IHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkXG4gICAgY29uc3QgaW1wbGljaXRPdXRwdXRzID0gQWJzdHJhY3RVdHhvQ29pbi5vdXRwdXREaWZmZXJlbmNlKGFsbE91dHB1dERldGFpbHMsIGV4cGVjdGVkT3V0cHV0cyk7XG5cbiAgICBjb25zdCBleHBsaWNpdE91dHB1dHMgPSBBYnN0cmFjdFV0eG9Db2luLm91dHB1dERpZmZlcmVuY2UoYWxsT3V0cHV0RGV0YWlscywgaW1wbGljaXRPdXRwdXRzKTtcblxuICAgIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG5vbi13YWxsZXQgb3V0cHV0cyB0aGF0IGhhZCBiZWVuIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAgIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoZXhwbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuXG4gICAgLy8gdGhpcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBub24td2FsbGV0IG91dHB1dCB2YWx1ZXNcbiAgICBjb25zdCBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgICB0aGlzLmFtb3VudFR5cGVcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBhbW91bnQgcGVydGFpbnMgdG8gdmVyaWZ5aW5nIHRoZSBwYXktYXMteW91LWdvLWZlZSBCaXRHb1xuICAgICAqIGF1dG9tYXRpY2FsbHkgYXBwbGllcyB0byB0cmFuc2FjdGlvbnMgc2VuZGluZyBtb25leSBvdXQgb2YgdGhlIHdhbGxldC4gVGhlIGxvZ2ljIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmRcbiAgICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgICAqIHRoYXQgd2FzIHNwZWNpZmllZCBpbXBsaWNpdGx5LiBUbyBwcm90ZWN0IGN1c3RvbWVycyBmcm9tIHBlb3BsZSB0YW1wZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gb3V0cHV0cywgd2VcbiAgICAgKiBkZWZpbmUgYSB0aHJlc2hvbGQgZm9yIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGluIHJlbGF0aW9uIHRvIHRoZSBleHBsaWNpdFxuICAgICAqIGV4dGVybmFsIHNwZW5kLlxuICAgICAqL1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBleHRyYSBhZGRyZXNzZXMgYXJlIGNoYW5nZSBhZGRyZXNzZXNcbiAgICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICAgIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoaW1wbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuICAgIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICAgIHRoaXMuYW1vdW50VHlwZVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5Y2hhaW5zLFxuICAgICAga2V5U2lnbmF0dXJlcyxcbiAgICAgIG91dHB1dHM6IGFsbE91dHB1dERldGFpbHMsXG4gICAgICBtaXNzaW5nT3V0cHV0cyxcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgICBjdXN0b21DaGFuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IHRoZSB3YWxsZXQncyB1c2VyIHByaXZhdGUga2V5IGFuZCB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCBwdWJsaWMga2V5IG1hdGNoZXNcbiAgICogQHBhcmFtIHtWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9uc30gcGFyYW1zXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCB2ZXJpZnlVc2VyUHVibGljS2V5KHBhcmFtczogVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgdHhQYXJhbXMsIGRpc2FibGVOZXR3b3JraW5nIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBrZXljaGFpbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJQdWIgPSB1c2VyS2V5Y2hhaW4ucHViO1xuXG4gICAgLy8gZGVjcnlwdCB0aGUgdXNlciBwcml2YXRlIGtleSwgc28gd2UgY2FuIHZlcmlmeSB0aGF0IHRoZSBjbGFpbWVkIHB1YmxpYyBrZXkgaXMgYSBtYXRjaFxuICAgIGxldCB1c2VyUHJ2ID0gdXNlcktleWNoYWluLnBydjtcbiAgICBpZiAoIXVzZXJQcnYgJiYgdHhQYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCB0eFBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICd1c2VyIHByaXZhdGUga2V5IHVuYXZhaWxhYmxlIGZvciB2ZXJpZmljYXRpb24nO1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyUHJpdmF0ZUtleSA9IGJpcDMyLmZyb21CYXNlNTgodXNlclBydik7XG4gICAgICBpZiAodXNlclByaXZhdGVLZXkudG9CYXNlNTgoKSA9PT0gdXNlclByaXZhdGVLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBwcml2YXRlIGtleSBpcyBvbmx5IHB1YmxpYycpO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJQcml2YXRlS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSAhPT0gdXNlclB1Yikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXIgcHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggcHVibGljIGtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIHByb2R1Y2VkIGJ5IHRoZSB1c2VyIGtleSBvdmVyIHRoZSBiYWNrdXAgYW5kIGJpdGdvIGtleXMuXG4gICAqXG4gICAqIElmIHNldCwgdGhlc2Ugc2lnbmF0dXJlcyBlbnN1cmUgdGhhdCB0aGUgd2FsbGV0IGtleXMgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIHdhbGxldCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge1ZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zfSBwYXJhbXNcbiAgICogQHJldHVybiB7e2JhY2t1cDogYm9vbGVhbiwgYml0Z286IGJvb2xlYW59fVxuICAgKi9cbiAgcHVibGljIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXM6IFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgLy8gZmlyc3QsIGxldCdzIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSB1c2VyIGtleSwgd2hvc2UgcHVibGljIGtleSBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IHZlcmlmaWNhdGlvbnNcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwga2V5Y2hhaW5Ub1ZlcmlmeSwga2V5U2lnbmF0dXJlIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBrZXljaGFpbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5Ub1ZlcmlmeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiB0byB2ZXJpZnkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleVNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXkgc2lnbmF0dXJlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgdXNlciBwdWJsaWMga2V5XG4gICAgYXNzZXJ0KHVzZXJLZXljaGFpbi5wdWIpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IGJpcDMyLmZyb21CYXNlNTgodXNlcktleWNoYWluLnB1YikucHVibGljS2V5O1xuICAgIC8vIER1ZSB0byBpbnRlcmZhY2Ugb2YgYGJpdGNvaW5NZXNzYWdlYCwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBwdWJsaWMga2V5IHRvIGFuIGFkZHJlc3MuXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgYWRkcmVzcyBoYXMgbm8gcmVsYXRpb25zaGlwIHRvIG9uLWNoYWluIHRyYW5zYWN0aW9ucy4gV2UgYXJlXG4gICAgLy8gb25seSBpbnRlcmVzdGVkIGluIHRoZSBhZGRyZXNzIGFzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhcbiAgICAgIHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVibGljS2V5KSxcbiAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbi5wdWJLZXlIYXNoLFxuICAgICAgLy8gd2UgZG8gbm90IHBhc3MgYHRoaXMubmV0d29ya2AgaGVyZSBiZWNhdXNlIGl0IHdvdWxkIGZhaWwgZm9yIHpjYXNoXG4gICAgICAvLyB0aGUgYml0Y29pbk1lc3NhZ2UgbGlicmFyeSBkZWNvZGVzIHRoZSBhZGRyZXNzIGFuZCB0aHJvd3MgYXdheSB0aGUgZmlyc3QgYnl0ZVxuICAgICAgLy8gYmVjYXVzZSB6Y2FzaCBoYXMgYSB0d28tYnl0ZSBwcmVmaXgsIHZlcmlmeSgpIGRlY29kZXMgemNhc2ggYWRkcmVzc2VzIHRvIGFuIGludmFsaWQgcHVia2V5IGhhc2hcbiAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pblxuICAgICk7XG5cbiAgICAvLyBCRy01NzAzOiB1c2UgQlRDIG1haW5uZXQgcHJlZml4IGZvciBhbGwga2V5IHNpZ25hdHVyZSBvcGVyYXRpb25zXG4gICAgLy8gKHRoaXMgbWVhbnMgZG8gbm90IHBhc3MgYSBwcmVmaXggcGFyYW1ldGVyLCBhbmQgbGV0IGl0IHVzZSB0aGUgZGVmYXVsdCBwcmVmaXggaW5zdGVhZClcbiAgICBhc3NlcnQoa2V5Y2hhaW5Ub1ZlcmlmeS5wdWIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYml0Y29pbk1lc3NhZ2UudmVyaWZ5KGtleWNoYWluVG9WZXJpZnkucHViLCBzaWduaW5nQWRkcmVzcywgQnVmZmVyLmZyb20oa2V5U2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKCdlcnJvciB0aHJvd24gZnJvbSBiaXRjb2lubWVzc2FnZSB3aGlsZSB2ZXJpZnlpbmcga2V5IHNpZ25hdHVyZScsIGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgc2lnbmF0dXJlcyBhZ2FpbnN0IHRoZSB1c2VyIHByaXZhdGUga2V5IG92ZXIgdGhlIGNoYW5nZSB3YWxsZXQgZXh0ZW5kZWQga2V5c1xuICAgKiBAcGFyYW0ge1BhcnNlZFRyYW5zYWN0aW9ufSB0eFxuICAgKiBAcGFyYW0ge0tleWNoYWlufSB1c2VyS2V5Y2hhaW5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeUN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgdHg6IFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+LFxuICAgIHVzZXJLZXljaGFpbjogS2V5Y2hhaW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0eC5jdXN0b21DaGFuZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFyc2VkIHRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSB2ZXJpZmljYXRpb24gZGF0YScpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eC5jdXN0b21DaGFuZ2Uua2V5cykgfHwgIUFycmF5LmlzQXJyYXkodHguY3VzdG9tQ2hhbmdlLnNpZ25hdHVyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1c3RvbUNoYW5nZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIGtleXMgb3Igc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5SW5kZXggb2YgW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dKSB7XG4gICAgICBjb25zdCBrZXljaGFpblRvVmVyaWZ5ID0gdHguY3VzdG9tQ2hhbmdlLmtleXNba2V5SW5kZXhdO1xuICAgICAgY29uc3Qga2V5U2lnbmF0dXJlID0gdHguY3VzdG9tQ2hhbmdlLnNpZ25hdHVyZXNba2V5SW5kZXhdO1xuICAgICAgaWYgKCFrZXljaGFpblRvVmVyaWZ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCBjdXN0b20gY2hhbmdlICR7S2V5SW5kaWNlc1trZXlJbmRleF0udG9Mb3dlckNhc2UoKX0ga2V5Y2hhaW4gcHVibGljIGtleWApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZXlTaWduYXR1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIGN1c3RvbSBjaGFuZ2UgJHtLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpfSBrZXljaGFpbiBzaWduYXR1cmVgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMudmVyaWZ5S2V5U2lnbmF0dXJlKHtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpbiBhcyB7IHB1Yjogc3RyaW5nIH0sXG4gICAgICAgICAga2V5Y2hhaW5Ub1ZlcmlmeToga2V5Y2hhaW5Ub1ZlcmlmeSBhcyB7IHB1Yjogc3RyaW5nIH0sXG4gICAgICAgICAga2V5U2lnbmF0dXJlLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgJXMga2V5IHNpZ25hdHVyZSEnLCBLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIGxpbWl0IGZvciBwYXktYXMteW91LWdvIG91dHB1dHNcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBheUdvTGltaXQoYWxsb3dQYXlnb091dHB1dD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIC8vIGFsbG93aW5nIHBheWdvIG91dHB1dHMgbmVlZHMgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHNvIG9ubHkgZGlzYWxsb3cgcGF5Z28gb3V0cHV0cyBpZiB0aGVcbiAgICAvLyByZWxldmFudCB2ZXJpZmljYXRpb24gb3B0aW9uIGlzIGJvdGggc2V0IGFuZCBmYWxzZVxuICAgIGlmICghXy5pc05pbChhbGxvd1BheWdvT3V0cHV0KSAmJiAhYWxsb3dQYXlnb091dHB1dCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIDE1MCBiYXNpcyBwb2ludHMgaXMgdGhlIGFic29sdXRlIHBlcm1pdHRlZCBtYXhpbXVtIGlmIHBheWdvIG91dHB1dHMgYXJlIGFsbG93ZWRcbiAgICByZXR1cm4gMC4wMTU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBzZXJ2ZXJcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4IHByZWJ1aWx0IHRyYW5zYWN0aW9uJ3MgdHhIZXggZm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCBXYWxsZXQgb2JqZWN0IHRvIG9idGFpbiBrZXlzIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uIE9iamVjdCBzcGVjaWZ5aW5nIHNvbWUgdmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgRGlzYWxsb3cgZmV0Y2hpbmcgYW55IGRhdGEgZnJvbSB0aGUgaW50ZXJuZXQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5rZXljaGFpbnMgUGFzcyBrZXljaGFpbnMgbWFudWFsbHkgcmF0aGVyIHRoYW4gZmV0Y2hpbmcgdGhlbSBieSBpZFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5hZGRyZXNzZXMgQWRkcmVzcyBkZXRhaWxzIHRvIHBhc3MgaW4gZm9yIG91dC1vZi1iYW5kIHZlcmlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uID0geyBhbGxvd1BheWdvT3V0cHV0OiB0cnVlIH0sIHJlcUlkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaXNQc2J0ID0gdHhQcmVidWlsZC50eEhleCAmJiBiaXRnby5pc1BzYnQodHhQcmVidWlsZC50eEhleCk7XG4gICAgaWYgKGlzUHNidCAmJiB0eFByZWJ1aWxkLnR4SW5mbz8udW5zcGVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBoYXZlIHVuc3BlbnRzIGluIHR4SW5mbyBmb3IgcHNidCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc2FibGVOZXR3b3JraW5nID0gISF2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmc7XG4gICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb246IFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+ID0gYXdhaXQgdGhpcy5wYXJzZVRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgIHR4UGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldCxcbiAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIHJlcUlkLFxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gcGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zO1xuXG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGNsYWltZWQgdXNlciBwdWJsaWMga2V5IGNvcnJlc3BvbmRzIHRvIHRoZSB3YWxsZXQncyB1c2VyIHByaXZhdGUga2V5XG4gICAgbGV0IHVzZXJQdWJsaWNLZXlWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAvLyB2ZXJpZnkgdGhlIHVzZXIgcHVibGljIGtleSBtYXRjaGVzIHRoZSBwcml2YXRlIGtleSAtIHRoaXMgd2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBtYXRjaFxuICAgICAgdXNlclB1YmxpY0tleVZlcmlmaWVkID0gdGhpcy52ZXJpZnlVc2VyUHVibGljS2V5KHsgdXNlcktleWNoYWluOiBrZXljaGFpbnMudXNlciwgZGlzYWJsZU5ldHdvcmtpbmcsIHR4UGFyYW1zIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IHVzZXIgcHVibGljIGtleSEnLCBlKTtcbiAgICB9XG5cbiAgICAvLyBsZXQncyB2ZXJpZnkgdGhlc2Uga2V5Y2hhaW5zXG4gICAgY29uc3Qga2V5U2lnbmF0dXJlcyA9IHBhcnNlZFRyYW5zYWN0aW9uLmtleVNpZ25hdHVyZXM7XG4gICAgaWYgKCFfLmlzRW1wdHkoa2V5U2lnbmF0dXJlcykpIHtcbiAgICAgIGNvbnN0IHZlcmlmeSA9IChrZXksIHB1YikgPT4ge1xuICAgICAgICBpZiAoIWtleWNoYWlucy51c2VyIHx8ICFrZXljaGFpbnMudXNlci5wdWIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlciBrZXljaGFpbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmlmeUtleVNpZ25hdHVyZSh7XG4gICAgICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnMudXNlciBhcyB7IHB1Yjogc3RyaW5nIH0sXG4gICAgICAgICAga2V5Y2hhaW5Ub1ZlcmlmeToga2V5LFxuICAgICAgICAgIGtleVNpZ25hdHVyZTogcHViLFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBjb25zdCBpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkID0gdmVyaWZ5KGtleWNoYWlucy5iYWNrdXAsIGtleVNpZ25hdHVyZXMuYmFja3VwUHViKTtcbiAgICAgIGNvbnN0IGlzQml0Z29LZXlTaWduYXR1cmVWYWxpZCA9IHZlcmlmeShrZXljaGFpbnMuYml0Z28sIGtleVNpZ25hdHVyZXMuYml0Z29QdWIpO1xuICAgICAgaWYgKCFpc0JhY2t1cEtleVNpZ25hdHVyZVZhbGlkIHx8ICFpc0JpdGdvS2V5U2lnbmF0dXJlVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWNvbmRhcnkgcHVibGljIGtleSBzaWduYXR1cmVzIGludmFsaWQnKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdzdWNjZXNzZnVsbHkgdmVyaWZpZWQgYmFja3VwIGFuZCBiaXRnbyBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH0gZWxzZSBpZiAoIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAvLyB0aGVzZSBrZXlzIHdlcmUgb2J0YWluZWQgb25saW5lIGFuZCB0aGVpciBzaWduYXR1cmVzIHdlcmUgbm90IHZlcmlmaWVkXG4gICAgICAvLyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91c1xuICAgICAgY29uc29sZS5sb2coJ3Vuc2lnbmVkIGtleXMgb2J0YWluZWQgb25saW5lIGFyZSBiZWluZyB1c2VkIGZvciBhZGRyZXNzIHZlcmlmaWNhdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRUcmFuc2FjdGlvbi5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbikge1xuICAgICAgaWYgKCFrZXljaGFpbnMudXNlciB8fCAhdXNlclB1YmxpY0tleVZlcmlmaWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gcmVxdWlyZXMgdmVyaWZpY2F0aW9uIG9mIHVzZXIgcHVibGljIGtleSwgYnV0IGl0IHdhcyB1bmFibGUgdG8gYmUgdmVyaWZpZWQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXNWZXJpZmllZCA9IHRoaXMudmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyhwYXJzZWRUcmFuc2FjdGlvbiwga2V5Y2hhaW5zLnVzZXIpO1xuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd0cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcywgYnV0IHRoZXkgd2VyZSB1bmFibGUgdG8gYmUgdmVyaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWJ1Zygnc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHVzZXIgcHVibGljIGtleSBhbmQgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ubWlzc2luZ091dHB1dHM7XG4gICAgaWYgKG1pc3NpbmdPdXRwdXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgb3V0cHV0cyBpbiB0aGUgcmVjaXBpZW50cyBsaXN0IHRoYXQgaGF2ZSBub3QgbWFkZSBpdCBpbnRvIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgb3V0cHV0cyBtaXNzaW5nIGluIHRyYW5zYWN0aW9uIHByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZW5kZWRFeHRlcm5hbFNwZW5kID0gcGFyc2VkVHJhbnNhY3Rpb24uZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50O1xuXG4gICAgLy8gdGhpcyBpcyBhIGxpbWl0IHdlIGltcG9zZSBmb3IgdGhlIHRvdGFsIHZhbHVlIHRoYXQgaXMgYW1lbmRlZCB0byB0aGUgdHJhbnNhY3Rpb24gYmV5b25kIHdoYXQgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWRcbiAgICBjb25zdCBwYXlBc1lvdUdvTGltaXQgPSBuZXcgQmlnTnVtYmVyKHRoaXMuZ2V0UGF5R29MaW1pdCh2ZXJpZmljYXRpb24uYWxsb3dQYXlnb091dHB1dCkpLm11bHRpcGxpZWRCeShcbiAgICAgIGludGVuZGVkRXh0ZXJuYWxTcGVuZC50b1N0cmluZygpXG4gICAgKTtcblxuICAgIC8qXG4gICAgU29tZSBleHBsYW5hdGlvbiBmb3Igd2h5IHdlJ3JlIGRvaW5nIHdoYXQgd2UncmUgZG9pbmc6XG4gICAgU29tZSBjdXN0b21lcnMgd2lsbCBoYXZlIGFuIG91dHB1dCB0byBCaXRHbydzIFBBWUdvIHdhbGxldCBhZGRlZCB0byB0aGVpciB0cmFuc2FjdGlvbiwgYW5kIHdlIG5lZWQgdG8gYWNjb3VudCBmb3JcbiAgICBpdCBoZXJlLiBUbyBwcm90ZWN0IHNvbWVvbmUgdGFtcGVyaW5nIHdpdGggdGhlIG91dHB1dCB0byBtYWtlIGl0IHNlbmQgbW9yZSB0aGFuIGl0IHNob3VsZCB0byBCaXRHbywgd2UgZGVmaW5lIGFcbiAgICB0aHJlc2hvbGQgZm9yIHRoZSBvdXRwdXQncyB2YWx1ZSBhYm92ZSB3aGljaCB3ZSdsbCB0aHJvdyBhbiBlcnJvciwgYmVjYXVzZSB0aGUgcGF5Z28gb3V0cHV0IHNob3VsZCBuZXZlciBiZSB0aGF0XG4gICAgaGlnaC5cbiAgICAgKi9cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZXh0cmEgYWRkcmVzc2VzIGFyZSBjaGFuZ2UgYWRkcmVzc2VzXG4gICAgLy8gZ2V0IGFsbCB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIHRoZSBzZXJ2ZXIgYWRkZWQgYW5kIGNhbGN1bGF0ZSB0aGVpciB2YWx1ZXNcbiAgICBjb25zdCBub25DaGFuZ2VBbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcnNlZFRyYW5zYWN0aW9uLmltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudC50b1N0cmluZygpKTtcblxuICAgIGRlYnVnKFxuICAgICAgJ0ludGVuZGVkIHNwZW5kIGlzICVzLCBOb24tY2hhbmdlIGFtb3VudCBpcyAlcywgcGF5Z28gbGltaXQgaXMgJXMnLFxuICAgICAgaW50ZW5kZWRFeHRlcm5hbFNwZW5kLnRvU3RyaW5nKCksXG4gICAgICBub25DaGFuZ2VBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIHBheUFzWW91R29MaW1pdC50b1N0cmluZygpXG4gICAgKTtcbiAgICAvLyB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIGNhbiBvbmx5IGJlIEJpdEdvJ3MgcGF5LWFzLXlvdS1nbyBmZWUsIGJ1dCB3ZSBjYW5ub3QgdmVyaWZ5IHRoZSB3YWxsZXQgYWRkcmVzc1xuICAgIGlmIChub25DaGFuZ2VBbW91bnQuZ3QocGF5QXNZb3VHb0xpbWl0KSkge1xuICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgYWRkcmVzc2VzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHNjb3BlIG9mIGludGVuZGVkIHJlY2lwaWVudHMgdGhhdCBhcmUgbm90IGNoYW5nZSBhZGRyZXNzZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJlYnVpbGQgYXR0ZW1wdHMgdG8gc3BlbmQgdG8gdW5pbnRlbmRlZCBleHRlcm5hbCByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsT3V0cHV0cyA9IHBhcnNlZFRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR4UHJlYnVpbGQudHhIZXggbm90IHNldGApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSBpc1BzYnRcbiAgICAgID8gZ2V0UHNidFR4SW5wdXRzKHR4UHJlYnVpbGQudHhIZXgsIHRoaXMubmV0d29yaykubWFwKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IGJpdGdvLnRvVE51bWJlcih2LnZhbHVlLCB0aGlzLmFtb3VudFR5cGUpLFxuICAgICAgICB9KSlcbiAgICAgIDogYXdhaXQgZ2V0VHhJbnB1dHMoeyB0eFByZWJ1aWxkLCBiaXRnbzogdGhpcy5iaXRnbywgY29pbjogdGhpcywgZGlzYWJsZU5ldHdvcmtpbmcsIHJlcUlkIH0pO1xuICAgIC8vIGNvaW5zIChkb2dlKSB0aGF0IGNhbiBleGNlZWQgbnVtYmVyIGxpbWl0cyAoYW5kIHRodXMgd2lsbCB1c2UgYmlnaW50KSB3aWxsIGhhdmUgdGhlIGB2YWx1ZVN0cmluZ2AgZmllbGRcbiAgICBjb25zdCBpbnB1dEFtb3VudCA9IGlucHV0cy5yZWR1Y2UoXG4gICAgICAoc3VtOiBiaWdpbnQsIGkpID0+IHN1bSArIEJpZ0ludCh0aGlzLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gaS52YWx1ZVN0cmluZyA6IGkudmFsdWUpLFxuICAgICAgQmlnSW50KDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBhbGxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBmZWUgPSBpbnB1dEFtb3VudCAtIG91dHB1dEFtb3VudDtcblxuICAgIGlmIChmZWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRlbXB0aW5nIHRvIHNwZW5kICR7b3V0cHV0QW1vdW50fSBzYXRvc2hpcywgd2hpY2ggZXhjZWVkcyB0aGUgaW5wdXQgYW1vdW50ICgke2lucHV0QW1vdW50fSBzYXRvc2hpcykgYnkgJHstZmVlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIGFuIGFkZHJlc3MgaXMgdmFsaWQgYW5kIHRocm93IGFuIGVycm9yIGlmIGl0J3Mgbm90LlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3Mgc3RyaW5nIG9uIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgS2V5Y2hhaW4gb2JqZWN0cyB3aXRoIHhwdWJzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29pblNwZWNpZmljIENvaW4tc3BlY2lmaWMgZGV0YWlscyBmb3IgdGhlIGFkZHJlc3Mgc3VjaCBhcyBhIHdpdG5lc3Mgc2NyaXB0XG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhaW4gRGVyaXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zLmluZGV4IERlcml2YXRpb24gaW5kZXhcbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NFcnJvcn1cbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcn1cbiAgICogQHRocm93cyB7VW5leHBlY3RlZEFkZHJlc3NFcnJvcn1cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBhZGRyZXNzVHlwZSwga2V5Y2hhaW5zLCBjb2luU3BlY2lmaWMsIGNoYWluLCBpbmRleCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgaWYgKChfLmlzVW5kZWZpbmVkKGNoYWluKSAmJiBfLmlzVW5kZWZpbmVkKGluZGV4KSkgfHwgIShfLmlzRmluaXRlKGNoYWluKSAmJiBfLmlzRmluaXRlKGluZGV4KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGludmFsaWQgY2hhaW4gKCR7Y2hhaW59KSBvciBpbmRleCAoJHtpbmRleH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QoY29pblNwZWNpZmljKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzVmVyaWZpY2F0aW9uT2JqZWN0UHJvcGVydHlFcnJvcihcbiAgICAgICAgJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBjb2luU3BlY2lmaWMgZmllbGQgbXVzdCBiZSBhbiBvYmplY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gdGhpcy5nZW5lcmF0ZUFkZHJlc3Moe1xuICAgICAgYWRkcmVzc1R5cGU6IGFkZHJlc3NUeXBlIGFzIFNjcmlwdFR5cGUyT2YzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICB9KTtcblxuICAgIGlmIChleHBlY3RlZEFkZHJlc3MuYWRkcmVzcyAhPT0gYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogZXhwZWN0ZWQgJHtleHBlY3RlZEFkZHJlc3MuYWRkcmVzc30gYnV0IGdvdCAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBjb2luIHN1cHBvcnRzIGEgYmxvY2sgdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3VwcG9ydHNCbG9ja1RhcmdldCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIHVuc3BlbnRUeXBlXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuaXNTdXBwb3J0ZWRTY3JpcHRUeXBlKHRoaXMubmV0d29yaywgYWRkcmVzc1R5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcmV0dXJuIHRydWUgaWZmIGNvaW4gc3VwcG9ydHMgc3BlbmRpbmcgZnJvbSBjaGFpblxuICAgKi9cbiAgc3VwcG9ydHNBZGRyZXNzQ2hhaW4oY2hhaW46IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShjaGFpbikgJiYgdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSk7XG4gIH1cblxuICBrZXlJZHNGb3JTaWduaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRPRE8oQkctMTE0ODcpOiBSZW1vdmUgYWRkcmVzc1R5cGUsIHNlZ3dpdCwgYW5kIGJlY2gzMiBwYXJhbXMgaW4gU0RLdjZcbiAgICogR2VuZXJhdGUgYW4gYWRkcmVzcyBmb3IgYSB3YWxsZXQgYmFzZWQgb24gYSBzZXQgb2YgY29uZmlndXJhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZSB7c3RyaW5nfSAgIERlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgICB7W29iamVjdF19IEFycmF5IG9mIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLnRocmVzaG9sZCAgIHtudW1iZXJ9ICAgTWluaW11bSBudW1iZXIgb2Ygc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluICAgICAgIHtudW1iZXJ9ICAgRGVyaXZhdGlvbiBjaGFpbiAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby91bnNwZW50cy9ibG9iL21hc3Rlci9zcmMvY29kZXMudHMgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3MgdHlwZSBvZiBhIGdpdmVuIGNoYWluIGNvZGUpXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggICAgICAge251bWJlcn0gICBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEBwYXJhbSBwYXJhbXMuc2Vnd2l0ICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXMuYmVjaDMyICAgICAge2Jvb2xlYW59ICBEZXByZWNhdGVkXG4gICAqIEByZXR1cm5zIHt7Y2hhaW46IG51bWJlciwgaW5kZXg6IG51bWJlciwgY29pbjogbnVtYmVyLCBjb2luU3BlY2lmaWM6IHtvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdH19fVxuICAgKi9cbiAgZ2VuZXJhdGVBZGRyZXNzKHBhcmFtczogR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyk6IEFkZHJlc3NEZXRhaWxzIHtcbiAgICBjb25zdCB7IGtleWNoYWlucywgdGhyZXNob2xkLCBjaGFpbiwgaW5kZXgsIHNlZ3dpdCA9IGZhbHNlLCBiZWNoMzIgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICAgIGxldCBkZXJpdmF0aW9uQ2hhaW4gPSBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuICAgIGlmIChfLmlzTnVtYmVyKGNoYWluKSAmJiBfLmlzSW50ZWdlcihjaGFpbikgJiYgaXNDaGFpbkNvZGUoY2hhaW4pKSB7XG4gICAgICBkZXJpdmF0aW9uQ2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk6IFNjcmlwdFR5cGUyT2YzIHtcbiAgICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikpIHtcbiAgICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQm9vbGVhbihzZWd3aXQpICYmIHNlZ3dpdCkge1xuICAgICAgICByZXR1cm4gJ3Ayc2hQMndzaCc7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKGJlY2gzMikgJiYgYmVjaDMyKSB7XG4gICAgICAgIHJldHVybiAncDJ3c2gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdwMnNoJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzVHlwZSA9IHBhcmFtcy5hZGRyZXNzVHlwZSB8fCBjb252ZXJ0RmxhZ3NUb0FkZHJlc3NUeXBlKCk7XG5cbiAgICBpZiAoYWRkcmVzc1R5cGUgIT09IHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGRlcml2YXRpb25DaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBBZGRyZXNzVHlwZUNoYWluTWlzbWF0Y2hFcnJvcihhZGRyZXNzVHlwZSwgZGVyaXZhdGlvbkNoYWluKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZSkpIHtcbiAgICAgIHN3aXRjaCAoYWRkcmVzc1R5cGUpIHtcbiAgICAgICAgY2FzZSAncDJzaCc6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnRlcm5hbCBlcnJvcjogcDJzaCBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZGApO1xuICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgIHRocm93IG5ldyBQMnNoUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ3c2hVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3AydHInOlxuICAgICAgICAgIHRocm93IG5ldyBQMnRyVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlICdwMnRyTXVzaWcyJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ0ck11c2lnMlVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZCBhcyBudW1iZXI7XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkID4ga2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBjYW5ub3QgZXhjZWVkIG51bWJlciBvZiBrZXlzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25JbmRleCA9IDA7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKGluZGV4KSAmJiAoaW5kZXggYXMgbnVtYmVyKSA+IDApIHtcbiAgICAgIGRlcml2YXRpb25JbmRleCA9IGluZGV4IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gJzAvMC8nICsgZGVyaXZhdGlvbkNoYWluICsgJy8nICsgZGVyaXZhdGlvbkluZGV4O1xuICAgIGNvbnN0IGhkTm9kZXMgPSBrZXljaGFpbnMubWFwKCh7IHB1YiB9KSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpO1xuICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gaGROb2Rlcy5tYXAoKGhkTm9kZSkgPT4gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhdGgpKS5wdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgeyBvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgYWRkcmVzcyB9ID0gdGhpcy5jcmVhdGVNdWx0aVNpZ0FkZHJlc3MoXG4gICAgICBhZGRyZXNzVHlwZSxcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCxcbiAgICAgIGRlcml2ZWRLZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzLFxuICAgICAgY2hhaW46IGRlcml2YXRpb25DaGFpbixcbiAgICAgIGluZGV4OiBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgb3V0cHV0U2NyaXB0OiBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICByZWRlZW1TY3JpcHQ6IHJlZGVlbVNjcmlwdCAmJiByZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB3aXRuZXNzU2NyaXB0OiB3aXRuZXNzU2NyaXB0ICYmIHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cy5cbiAgICogQHBhcmFtIHBzYnRIZXggYWxsIE11U2lnMiBpbnB1dHMgc2hvdWxkIGNvbnRhaW4gdXNlciBNdVNpZzIgbm9uY2VcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIHdhbGxldElkOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25Qc2J0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwYXJhbXM6IFNpZ25Qc2J0UmVxdWVzdCA9IHsgcHNidDogcHNidEhleCB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dhbGxldC8nICsgd2FsbGV0SWQgKyAnL3R4L3NpZ25wc2J0JykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgU2lnblRyYW5zYWN0aW9uT3B0aW9uc31cbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0gcGFyYW1zLnR4UHJlYnVpbGQ7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGxldCB0eCA9IGJpdGdvLmlzUHNidCh0eFByZWJ1aWxkLnR4SGV4KVxuICAgICAgPyBiaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eFByZWJ1aWxkLnR4SGV4LCB0aGlzLm5ldHdvcmspXG4gICAgICA6IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4UHJlYnVpbGQudHhIZXgpO1xuXG4gICAgY29uc3QgaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCA9IHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCk7XG5cbiAgICBsZXQgaXNMYXN0U2lnbmF0dXJlID0gZmFsc2U7XG4gICAgaWYgKF8uaXNCb29sZWFuKHBhcmFtcy5pc0xhc3RTaWduYXR1cmUpKSB7XG4gICAgICAvLyBXZSBjYW4gb25seSBiZSB0aGUgZmlyc3Qgc2lnbmF0dXJlIG9uIGEgdHJhbnNhY3Rpb24gd2l0aCB0YXByb290IGtleSBwYXRoIHNwZW5kIGlucHV0cyBiZWNhdXNlXG4gICAgICAvLyB3ZSByZXF1aXJlIHRoZSBzZWNyZXQgbm9uY2UgaW4gdGhlIGNhY2hlIG9mIHRoZSBmaXJzdCBzaWduZXIsIHdoaWNoIGlzIGltcG9zc2libGUgdG8gcmV0cmlldmUgaWZcbiAgICAgIC8vIGRlc2VyaWFsaXplZCBmcm9tIGEgaGV4LlxuICAgICAgaWYgKHBhcmFtcy5pc0xhc3RTaWduYXR1cmUgJiYgaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBiZSBsYXN0IHNpZ25hdHVyZSBvbiBhIHRyYW5zYWN0aW9uIHdpdGgga2V5IHBhdGggc3BlbmQgaW5wdXRzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGJ1aWxkIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIGJ1aWxkSW5jb21wbGV0ZSwgbm8gc2lnbmF0dXJlIHBsYWNlaG9sZGVycyBhcmUgbGVmdCBpbiB0aGUgc2lnIHNjcmlwdFxuICAgICAgaXNMYXN0U2lnbmF0dXJlID0gcGFyYW1zLmlzTGFzdFNpZ25hdHVyZTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTaWduZXJLZXljaGFpbiA9ICgpOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlID0+IHtcbiAgICAgIGNvbnN0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodXNlclBydikgfHwgIV8uaXNTdHJpbmcodXNlclBydikpIHtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHVzZXJQcnYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgdXNlclBydn1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHJ2IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgodXNlclBydiwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICAgIGlmIChzaWduZXJLZXljaGFpbi5pc05ldXRlcmVkKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCB1c2VyIHByaXZhdGUga2V5IGJ1dCByZWNlaXZlZCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgICBkZWJ1ZyhgSGVyZSBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgeHBydiB5b3UgdXNlZCB0byBzaWduOiAke3NpZ25lcktleWNoYWluLm5ldXRlcmVkKCkudG9CYXNlNTgoKX1gKTtcbiAgICAgIHJldHVybiBzaWduZXJLZXljaGFpbjtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0U2lnbmVyTXVzaWdOb25jZVdpdGhPdmVycmlkZSA9IChcbiAgICAgIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gICAgICBzaWduZXJLZXljaGFpbjogdXR4b2xpYi5CSVAzMkludGVyZmFjZSxcbiAgICAgIG5vblNlZ3dpdE92ZXJyaWRlOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICB1dHhvbGliLmJpdGdvLndpdGhVbnNhZmVOb25TZWd3aXQocHNidCwgKCkgPT4gcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHNpZ25lcktleWNoYWluKSwgbm9uU2Vnd2l0T3ZlcnJpZGUpO1xuICAgIH07XG5cbiAgICBsZXQgc2lnbmVyS2V5Y2hhaW46IHV0eG9saWIuQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHggaW5zdGFuY2VvZiBiaXRnby5VdHhvUHNidCAmJiBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5zaWduaW5nU3RlcCkge1xuICAgICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICAgICAgc2lnbmVyS2V5Y2hhaW4gPSBnZXRTaWduZXJLZXljaGFpbigpO1xuICAgICAgICAgIHNldFNpZ25lck11c2lnTm9uY2VXaXRoT3ZlcnJpZGUodHgsIHNpZ25lcktleWNoYWluLCAhIXBhcmFtcy5hbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4KTtcbiAgICAgICAgICBBYnN0cmFjdFV0eG9Db2luLlBTQlRfQ0FDSEUuc2V0KHR4LmdldFVuc2lnbmVkVHgoKS5nZXRJZCgpLCB0eCk7XG4gICAgICAgICAgcmV0dXJuIHsgdHhIZXg6IHR4LnRvSGV4KCkgfTtcbiAgICAgICAgY2FzZSAnY29zaWduZXJOb25jZSc6XG4gICAgICAgICAgYXNzZXJ0KHR4UHJlYnVpbGQud2FsbGV0SWQsICd3YWxsZXRJZCBpcyByZXF1aXJlZCBmb3IgTXVTaWcyIGJpdGdvIG5vbmNlJyk7XG4gICAgICAgICAgcmV0dXJuIHsgdHhIZXg6IChhd2FpdCB0aGlzLnNpZ25Qc2J0KHR4LnRvSGV4KCksIHR4UHJlYnVpbGQud2FsbGV0SWQpKS5wc2J0IH07XG4gICAgICAgIGNhc2UgJ3NpZ25lclNpZ25hdHVyZSc6XG4gICAgICAgICAgY29uc3QgdHhJZCA9IHR4LmdldFVuc2lnbmVkVHgoKS5nZXRJZCgpO1xuICAgICAgICAgIGNvbnN0IHBzYnQgPSBBYnN0cmFjdFV0eG9Db2luLlBTQlRfQ0FDSEUuZ2V0KHR4SWQpO1xuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHBzYnQsXG4gICAgICAgICAgICBgUHNidCBpcyBtaXNzaW5nIGZyb20gdHhDYWNoZSAoY2FjaGUgc2l6ZSAke0Fic3RyYWN0VXR4b0NvaW4uUFNCVF9DQUNIRS5zaXplfSkuXG4gICAgICAgICAgICBUaGlzIG1heSBiZSBkdWUgdG8gdGhlIHJlcXVlc3QgYmVpbmcgcm91dGVkIHRvIGEgZGlmZmVyZW50IEJpdEdvLUV4cHJlc3MgaW5zdGFuY2UgdGhhdCBmb3Igc2lnbmluZyBzdGVwICdzaWduZXJOb25jZScuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgQWJzdHJhY3RVdHhvQ29pbi5QU0JUX0NBQ0hFLmRlbGV0ZSh0eElkKTtcbiAgICAgICAgICB0eCA9IHBzYnQuY29tYmluZSh0eCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSBpcyBub3QgYW4gZXh0ZXJuYWwgc2lnbmVyXG4gICAgICAgICAgYXNzZXJ0KHR4UHJlYnVpbGQud2FsbGV0SWQsICd3YWxsZXRJZCBpcyByZXF1aXJlZCBmb3IgTXVTaWcyIGJpdGdvIG5vbmNlJyk7XG4gICAgICAgICAgc2lnbmVyS2V5Y2hhaW4gPSBnZXRTaWduZXJLZXljaGFpbigpO1xuICAgICAgICAgIHNldFNpZ25lck11c2lnTm9uY2VXaXRoT3ZlcnJpZGUodHgsIHNpZ25lcktleWNoYWluLCAhIXBhcmFtcy5hbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4KTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2lnblBzYnQodHgudG9IZXgoKSwgdHhQcmVidWlsZC53YWxsZXRJZCk7XG4gICAgICAgICAgdHguY29tYmluZShiaXRnby5jcmVhdGVQc2J0RnJvbUhleChyZXNwb25zZS5wc2J0LCB0aGlzLm5ldHdvcmspKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChwYXJhbXMuc2lnbmluZ1N0ZXApIHtcbiAgICAgICAgY2FzZSAnc2lnbmVyTm9uY2UnOlxuICAgICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIG1heSBub3Qga25vdyB3aGV0aGVyIHRoZSB0eEhleCBjb250YWlucyBhIHBzYnQgd2l0aCB0YXByb290IGtleSBwYXRoIHNwZW5kIGlucHV0KHMpLlxuICAgICAgICAgICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgZXJyb3IsIG5vLW9wIGFuZCByZXR1cm4gdGhlIHR4SGV4LiBTbyB0aGF0IHRoZSBjYWxsZXIgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgc2VxdWVuY2UuXG4gICAgICAgICAgICovXG4gICAgICAgICAgcmV0dXJuIHsgdHhIZXg6IHR4LnRvSGV4KCkgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lnbmVyS2V5Y2hhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2lnbmVyS2V5Y2hhaW4gPSBnZXRTaWduZXJLZXljaGFpbigpO1xuICAgIH1cblxuICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbjogYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4gfCBiaXRnby5VdHhvUHNidDtcbiAgICBpZiAodHggaW5zdGFuY2VvZiBiaXRnby5VdHhvUHNidCkge1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5UHNidCh0eCwgc2lnbmVyS2V5Y2hhaW4sIHtcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgICAgICBhbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4OiBwYXJhbXMuYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHguaW5zLmxlbmd0aCAhPT0gdHhQcmVidWlsZC50eEluZm8/LnVuc3BlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggb2YgdW5zcGVudHMgYXJyYXkgc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gaW5wdXRzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyYW1zLnB1YnMgfHwgIWlzVHJpcGxlKHBhcmFtcy5wdWJzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSB4cHViIGFycmF5YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgICBjb25zdCBjb3NpZ25lclB1YiA9IHBhcmFtcy5jb3NpZ25lclB1YiA/PyBwYXJhbXMucHVic1syXTtcbiAgICAgIGNvbnN0IGNvc2lnbmVyS2V5Y2hhaW4gPSBiaXAzMi5mcm9tQmFzZTU4KGNvc2lnbmVyUHViKTtcblxuICAgICAgY29uc3Qgd2FsbGV0U2lnbmVyID0gbmV3IGJpdGdvLldhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+KGtleWNoYWlucywgc2lnbmVyS2V5Y2hhaW4sIGNvc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24odHgsIHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLCB3YWxsZXRTaWduZXIsIHtcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgICAgfSkgYXMgYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbi50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIGEgY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24uIEV4YW1wbGUgdXNlIGNhc2UgaXMgZXhwcmVzcyBleHRlcm5hbCBzaWduZXJcbiAgICogQHBhcmFtIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBjdXN0b20gc2lnbmluZyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzaW5nbGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBzaWduVHJhbnNhY3Rpb25QYXJhbXMgcGFyYW1ldGVycyBmb3IgY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24uIEluY2x1ZGVzIHR4UHJlYnVpbGQgYW5kIHB1YnMgKGZvciBsZWdhY3kgdHggb25seSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbiBhcyBoZXggc3RyaW5nXG4gICAqL1xuICBhc3luYyBzaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlcj4sXG4gICAgc2lnblRyYW5zYWN0aW9uUGFyYW1zOiB7IHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47IHB1YnM/OiBzdHJpbmdbXSB9XG4gICk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eEhleCA9IHNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLnR4SGV4O1xuICAgIGFzc2VydCh0eEhleCwgJ21pc3NpbmcgdHhIZXggcGFyYW1ldGVyJyk7XG5cbiAgICBjb25zdCB0eCA9IGJpdGdvLmlzUHNidCh0eEhleClcbiAgICAgID8gYml0Z28uY3JlYXRlUHNidEZyb21IZXgodHhIZXgsIHRoaXMubmV0d29yaylcbiAgICAgIDogdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhIZXgpO1xuXG4gICAgY29uc3QgaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCA9IHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCk7XG5cbiAgICBpZiAoIWlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsIGNvaW46IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VHhIZXggPSAodjogU2lnbmVkVHJhbnNhY3Rpb24pOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKCd0eEhleCcgaW4gdikge1xuICAgICAgICByZXR1cm4gdi50eEhleDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbm90IGZvdW5kIGluIHNpZ25UcmFuc2FjdGlvbiByZXN1bHQnKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2lnbmVyTm9uY2VUeCA9IGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyxcbiAgICAgIGNvaW46IHRoaXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YnMgfSA9IHNpZ25UcmFuc2FjdGlvblBhcmFtcztcbiAgICBhc3NlcnQocHVicyA9PT0gdW5kZWZpbmVkIHx8IGlzVHJpcGxlKHB1YnMpKTtcblxuICAgIGNvbnN0IGNvc2lnbmVyTm9uY2VUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHB1YnMsXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLCB0eEhleDogZ2V0VHhIZXgoc2lnbmVyTm9uY2VUeCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQsIHR4SGV4OiBnZXRUeEhleChjb3NpZ25lck5vbmNlVHgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lclNpZ25hdHVyZScsXG4gICAgICBjb2luOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB1bnNwZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNCaXRHb1RhaW50ZWRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHVuc3BlbnQ6IFVuc3BlbnQ8VE51bWJlcj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudDxUTnVtYmVyPih1bnNwZW50LCB0aGlzLm5ldHdvcmspO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2gobmV0d29yaykgaW5zdGVhZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRlZmF1bHRTaWdIYXNoVHlwZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRjb2luLnZlcmlmeVNpZ25hdHVyZSgpIGluc3RlYWRcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShcbiAgICB0cmFuc2FjdGlvbjogYW55LFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBhbW91bnQ6IG51bWJlcixcbiAgICB2ZXJpZmljYXRpb25TZXR0aW5nczoge1xuICAgICAgc2lnbmF0dXJlSW5kZXg/OiBudW1iZXI7XG4gICAgICBwdWJsaWNLZXk/OiBzdHJpbmc7XG4gICAgfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh0cmFuc2FjdGlvbi5uZXR3b3JrICE9PSB0aGlzLm5ldHdvcmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmV0d29yayBtaXNtYXRjaGApO1xuICAgIH1cbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby52ZXJpZnlTaWduYXR1cmUodHJhbnNhY3Rpb24sIGlucHV0SW5kZXgsIGFtb3VudCwge1xuICAgICAgc2lnbmF0dXJlSW5kZXg6IHZlcmlmaWNhdGlvblNldHRpbmdzLnNpZ25hdHVyZUluZGV4LFxuICAgICAgcHVibGljS2V5OiB2ZXJpZmljYXRpb25TZXR0aW5ncy5wdWJsaWNLZXkgPyBCdWZmZXIuZnJvbSh2ZXJpZmljYXRpb25TZXR0aW5ncy5wdWJsaWNLZXksICdoZXgnKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXBvc2UgYSByYXcgcHNidC90cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHsgdHhIZXggfSA9IHBhcmFtcztcbiAgICBpZiAodHlwZW9mIHR4SGV4ICE9PSAnc3RyaW5nJyB8fCAhdHhIZXgubWF0Y2goL14oW2EtZjAtOV17Mn0pKyQvaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFuc2FjdGlvbiBoZXgsIG11c3QgYmUgYSB2YWxpZCBoZXggc3RyaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmlzUHNidCh0eEhleCkgPyBleHBsYWluUHNidChwYXJhbXMsIHRoaXMubmV0d29yaykgOiBleHBsYWluVHgocGFyYW1zLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtdWx0aXNpZyBhZGRyZXNzIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbGlzdCBvZiBrZXljaGFpbnMgYW5kIGEgc2lnbmluZyB0aHJlc2hvbGRcbiAgICogQHBhcmFtIGFkZHJlc3NUeXBlXG4gICAqIEBwYXJhbSBzaWduYXR1cmVUaHJlc2hvbGRcbiAgICogQHBhcmFtIGtleXNcbiAgICovXG4gIGNyZWF0ZU11bHRpU2lnQWRkcmVzcyhhZGRyZXNzVHlwZTogU2NyaXB0VHlwZTJPZjMsIHNpZ25hdHVyZVRocmVzaG9sZDogbnVtYmVyLCBrZXlzOiBCdWZmZXJbXSk6IE11bHRpU2lnQWRkcmVzcyB7XG4gICAgY29uc3Qge1xuICAgICAgc2NyaXB0UHViS2V5OiBvdXRwdXRTY3JpcHQsXG4gICAgICByZWRlZW1TY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgIH0gPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhrZXlzLCBhZGRyZXNzVHlwZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3V0cHV0U2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgdGhpcy5uZXR3b3JrKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgYmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgICByZXR1cm4gYmFja3VwS2V5UmVjb3ZlcnkodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGNvaW4gdGhhdCB3YXMgc2VudCB0byB3cm9uZyBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhpZCBUaGUgdHhpZCBvZiB0aGUgZmF1bHR5IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzIGFkZHJlc3MgdG8gc2VuZCByZWNvdmVyZWQgZnVuZHMgdG9cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5Q29pbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5zaWduZWQgcmV0dXJuIGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gKGRlZmF1bHQ9dHJ1ZSlcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnhwcnYgdGhlIHVuZW5jcnlwdGVkIHhwcnYgKHVzZWQgaW5zdGVhZCBvZiB3YWxsZXQgcGFzc3BocmFzZSlcbiAgICogQHBhcmFtIHBhcmFtcy5hcGlLZXkgZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckZyb21Xcm9uZ0NoYWluPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9uc1xuICApOiBQcm9taXNlPENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eGlkLCByZWNvdmVyeUFkZHJlc3MsIHdhbGxldCwgd2FsbGV0UGFzc3BocmFzZSwgeHBydiwgYXBpS2V5IH0gPSBwYXJhbXM7XG5cbiAgICAvLyBwYXJhbXMucmVjb3ZlcnlDb2luIHVzZWQgdG8gYmUgcGFyYW1zLmNvaW4sIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luID0gcGFyYW1zLmNvaW4gfHwgcGFyYW1zLnJlY292ZXJ5Q29pbjtcbiAgICBpZiAoIXJlY292ZXJ5Q29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIG9iamVjdCByZWNvdmVyeUNvaW4nKTtcbiAgICB9XG4gICAgLy8gc2lnbmVkIHNob3VsZCBkZWZhdWx0IHRvIHRydWUsIGFuZCBvbmx5IGJlIGRpc2FibGVkIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIChub3QgdW5kZWZpbmVkKVxuICAgIGNvbnN0IHNpZ25lZCA9IHBhcmFtcy5zaWduZWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlQ29pbkZhbWlseSA9IHRoaXMuZ2V0RmFtaWx5KCk7XG4gICAgY29uc3QgcmVjb3ZlcnlDb2luRmFtaWx5ID0gcmVjb3ZlcnlDb2luLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMgPSBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3Zlcmllc1tzb3VyY2VDb2luRmFtaWx5XTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHN1cHBvcnRlZFJlY292ZXJ5Q29pbnMpIHx8ICFzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zLmluY2x1ZGVzKHJlY292ZXJ5Q29pbkZhbWlseSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3Zlcnkgb2YgJHtzb3VyY2VDb2luRmFtaWx5fSBiYWxhbmNlcyBmcm9tICR7cmVjb3ZlcnlDb2luRmFtaWx5fSB3YWxsZXRzIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlY292ZXJDcm9zc0NoYWluPFROdW1iZXI+KHRoaXMuYml0Z28sIHtcbiAgICAgIHNvdXJjZUNvaW46IHRoaXMsXG4gICAgICByZWNvdmVyeUNvaW4sXG4gICAgICB3YWxsZXRJZDogd2FsbGV0LFxuICAgICAgdHhpZCxcbiAgICAgIHJlY292ZXJ5QWRkcmVzcyxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHNpZ25lZCA/IHdhbGxldFBhc3NwaHJhc2UgOiB1bmRlZmluZWQsXG4gICAgICB4cHJ2OiBzaWduZWQgPyB4cHJ2IDogdW5kZWZpbmVkLFxuICAgICAgYXBpS2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGJpcDMyIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ6IEJ1ZmZlcik6IHsgcHViOiBzdHJpbmc7IHBydjogc3RyaW5nIH0ge1xuICAgIGlmICghc2VlZCkge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgaGFzIGJvdGggYSBub3JtYWwgMjU2IGJpdCBwcml2YXRlIGtleSBhbmQgYSAyNTZcbiAgICAgIC8vIGJpdCBjaGFpbiBjb2RlLCBib3RoIG9mIHdoaWNoIG11c3QgYmUgcmFuZG9tLiA1MTIgYml0cyBpcyB0aGVyZWZvcmUgdGhlXG4gICAgICAvLyBtYXhpbXVtIGVudHJvcHkgYW5kIGdpdmVzIHVzIG1heGltdW0gc2VjdXJpdHkgYWdhaW5zdCBjcmFja2luZy5cbiAgICAgIHNlZWQgPSByYW5kb21CeXRlcyg1MTIgLyA4KTtcbiAgICB9XG4gICAgY29uc3QgZXh0ZW5kZWRLZXkgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBwcnY6IGV4dGVuZGVkS2V5LnRvQmFzZTU4KCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEV4dHJhUHJlYnVpbGRQYXJhbXMoYnVpbGRQYXJhbXM6IEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zICYgeyB3YWxsZXQ6IFdhbGxldCB9KTogUHJvbWlzZTx7XG4gICAgdHhGb3JtYXQ/OiAnbGVnYWN5JyB8ICdwc2J0JztcbiAgICBhZGRyZXNzVHlwZT86IFNjcmlwdFR5cGUyT2YzO1xuICB9PiB7XG4gICAgbGV0IHR4Rm9ybWF0ID0gYnVpbGRQYXJhbXMudHhGb3JtYXQgYXMgJ2xlZ2FjeScgfCAncHNidCcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFkZHJlc3NUeXBlID0gYnVpbGRQYXJhbXMuYWRkcmVzc1R5cGUgYXMgU2NyaXB0VHlwZTJPZjMgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB3YWxsZXRGbGFnTXVzaWdLcCA9IGJ1aWxkUGFyYW1zLndhbGxldC5mbGFnKCdtdXNpZ0twJykgPT09ICd0cnVlJztcblxuICAgIC8vIGlmIHRoZSB0eEZvcm1hdCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGRlZmF1bHQgdG8gcHNidCBmb3IgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXRzIG9yIHRlc3RuZXQgaG90IHdhbGxldHNcbiAgICBpZiAoXG4gICAgICBidWlsZFBhcmFtcy50eEZvcm1hdCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAoYnVpbGRQYXJhbXMud2FsbGV0LnN1YlR5cGUoKSA9PT0gJ2Rpc3RyaWJ1dGVkQ3VzdG9keScgfHxcbiAgICAgICAgKGlzVGVzdG5ldCh0aGlzLm5ldHdvcmspICYmIGJ1aWxkUGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdob3QnKSB8fFxuICAgICAgICAvLyBGSVhNRShCVEMtNzc2KTogZGVmYXVsdCB0byBwc2J0IGZvciBhbGwgbWFpbm5ldCB3YWxsZXRzIGluIHRoZSBmdXR1cmVcbiAgICAgICAgd2FsbGV0RmxhZ011c2lnS3ApXG4gICAgKSB7XG4gICAgICB0eEZvcm1hdCA9ICdwc2J0JztcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgYWRkcmVzc1R5cGUgaXMgbm90IHNwZWNpZmllZCwgd2UgbmVlZCB0byBkZWZhdWx0IHRvIHAydHJNdXNpZzIgZm9yIHRlc3RuZXQgaG90IHdhbGxldHMgZm9yIHN0YWdlZCByb2xsb3V0IG9mIHAydHJNdXNpZzJcbiAgICBpZiAoXG4gICAgICBidWlsZFBhcmFtcy5hZGRyZXNzVHlwZSA9PT0gdW5kZWZpbmVkICYmIC8vIGFkZHJlc3NUeXBlIGlzIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGBjaGFuZ2VBZGRyZXNzYFxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzcyA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBidWlsZFBhcmFtcy53YWxsZXQudHlwZSgpID09PSAnaG90JyAmJlxuICAgICAgLy8gRklYTUUoQlRDLTkyKTogcmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBwMnRyTXVzaWcyIGlzIGZ1bGx5IHJvbGxlZCBvdXRcbiAgICAgICh0aGlzLm5ldHdvcmsgPT09IHV0eG9saWIubmV0d29ya3MudGVzdG5ldCB8fCB3YWxsZXRGbGFnTXVzaWdLcClcbiAgICApIHtcbiAgICAgIGFkZHJlc3NUeXBlID0gJ3AydHJNdXNpZzInO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eEZvcm1hdCxcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICBwcmVDcmVhdGVCaXRHbyhwYXJhbXM6IFByZWNyZWF0ZUJpdEdvT3B0aW9ucyk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5jIHByZXNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZXNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICAgIGtleWNoYWluczogS2V5Y2hhaW5zVHJpcGxldFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRSZWNvdmVyeVByb3ZpZGVyKGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlciB7XG4gICAgcmV0dXJuIGZvckNvaW4odGhpcy5nZXRDaGFpbigpLCBhcGlUb2tlbik7XG4gIH1cbn1cbiJdfQ==
|
|
1020
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkNBQTJDO0FBQzNDLDhDQUEwRTtBQUMxRSxpQ0FBaUM7QUFDakMsb0RBQW9EO0FBQ3BELG1DQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsNEJBQTRCO0FBQzVCLCtDQUFxQztBQUVyQyx5Q0FRb0I7QUFFcEIsOENBNEN5QjtBQUN6QiwrQ0FBaUU7QUFFakUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBR3hDLHlEQUErRDtBQUMvRCxpQ0FBMkU7QUFDM0UscUNBQXlEO0FBQ3pELCtDQUFxRjtBQTJCckYsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsR0FBRyxnQkFBSyxDQUFDO0FBc0V2RixNQUFhLHNCQUF1QixTQUFRLGlCQUFNO0lBR2hELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLFVBQWU7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTkQsd0RBTUM7QUEwSUQsTUFBc0IsZ0JBQWlCLFNBQVEsbUJBQVE7SUFNckQsWUFBc0IsS0FBZ0IsRUFBRSxPQUF3QixFQUFFLGFBQWtDLFFBQVE7UUFDMUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0Q7Z0JBQzdELDZFQUE2RSxDQUNoRixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixD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LHdCQUF3QixDQUM1QixZQUE2QyxFQUM3QyxTQUEyQjtRQUUzQixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFpQjtRQUNuQyxPQUFPLElBQUEsa0JBQU8sRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7QUEzckNILDRDQTRyQ0M7QUExcUNDOzs7Ozs7O0dBT0c7QUFDcUIsMkJBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSwgYml0Z28sIGlzVGVzdG5ldCB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIGJpdGNvaW5NZXNzYWdlIGZyb20gJ2JpdGNvaW5qcy1tZXNzYWdlJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0IHtcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLFxuICBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCxcbiAgZm9yQ29pbixcbiAgcmVjb3ZlckNyb3NzQ2hhaW4sXG4gIFJlY292ZXJ5UHJvdmlkZXIsXG4gIGJhY2t1cEtleVJlY292ZXJ5LFxuICBSZWNvdmVyUGFyYW1zLFxufSBmcm9tICcuL3JlY292ZXJ5JztcblxuaW1wb3J0IHtcbiAgQWRkcmVzc0NvaW5TcGVjaWZpYyxcbiAgQWRkcmVzc1R5cGVDaGFpbk1pc21hdGNoRXJyb3IsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJQmFzZUNvaW4sXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEludmFsaWRBZGRyZXNzVmVyaWZpY2F0aW9uT2JqZWN0UHJvcGVydHlFcnJvcixcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIGlzVHJpcGxlLFxuICBJVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IsXG4gIFAydHJNdXNpZzJVbnN1cHBvcnRlZEVycm9yLFxuICBQMnRyVW5zdXBwb3J0ZWRFcnJvcixcbiAgUDJ3c2hVbnN1cHBvcnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbiBhcyBCYXNlUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlY3JlYXRlQml0R29PcHRpb25zLFxuICBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBwcm9taXNlUHJvcHMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUGFyYW1zIGFzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCBhcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG4gIFdhbGxldERhdGEsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDdXN0b21DaGFuZ2VPcHRpb25zLCBwYXJzZU91dHB1dCB9IGZyb20gJy4vcGFyc2VPdXRwdXQnO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2Mjp1dHhvJyk7XG5cbmltcG9ydCBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcbmltcG9ydCB7IGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQgfSBmcm9tICcuL3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVBzYnQsIHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2lnbic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGV4cGxhaW5Qc2J0LCBleHBsYWluVHgsIGdldFBzYnRUeElucHV0cywgZ2V0VHhJbnB1dHMgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcblxudHlwZSBVdHhvQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+ID0ge1xuICAocGFyYW1zOiB7XG4gICAgY29pbjogSUJhc2VDb2luO1xuICAgIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gICAgcHVicz86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIHNpZ25pbmdTdGVwIGZsYWcgYmVjb21lcyBhcHBsaWNhYmxlIHdoZW4gYm90aCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgICAgKiAxKSBXaGVuIHRoZSBleHRlcm5hbCBleHByZXNzIHNpZ25lciBpcyBhY3RpdmF0ZWRcbiAgICAgKiAyKSBXaGVuIHRoZSBQU0JUIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0LlxuICAgICAqXG4gICAgICogVGhlIHNpZ25pbmcgcHJvY2VzcyBvZiBhIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQgaXMgYSA0LXN0ZXAgc2VxdWVuY2U6XG4gICAgICogaSkgdXNlciBub25jZSBnZW5lcmF0aW9uIC0gc2lnbmVyTm9uY2UgLSB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIHNpZ25UcmFuc2FjdGlvblxuICAgICAqIGlpKSBiaXRnbyBub25jZSBnZW5lcmF0aW9uIC0gY29zaWduZXJOb25jZSAtIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBvbmx5IGNhbGwgdG8gbG9jYWwgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaWlpKSB1c2VyIHNpZ25hdHVyZSAtIHNpZ25lclNpZ25hdHVyZSAtIHRoaXMgaXMgdGhlIHNlY29uZCBjYWxsIHRvIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIHNpZ25UcmFuc2FjdGlvblxuICAgICAqIGl2KSBiaXRnbyBzaWduYXR1cmUgLSBub3QgaW4gc2lnblRyYW5zYWN0aW9uIG1ldGhvZOKAmXMgc2NvcGVcbiAgICAgKlxuICAgICAqIEluIHRoZSBhYnNlbmNlIG9mIHRoaXMgZmxhZywgdGhlIGFmb3JlbWVudGlvbmVkIGZpcnN0IHRocmVlIHNlcXVlbmNlIGlzIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHNpZ25UcmFuc2FjdGlvbiBjYWxsLlxuICAgICAqXG4gICAgICogTk9URTogV2UgbWFrZSBhIHN0cm9uZyBhc3N1bXB0aW9uIHRoYXQgdGhlIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGFuZCBpdHMgY2FsbGVyIHVzZXMgc3RpY2t5IHNlc3Npb25zLFxuICAgICAqIHNpbmNlIFBTQlRzIGFyZSBjYWNoZWQgaW4gc3RlcCAxIHRvIGJlIHVzZWQgaW4gc3RlcCAzIGZvciBNdVNpZzIgdXNlciBzZWN1cmUgbm9uY2UgYWNjZXNzLlxuICAgICAqL1xuICAgIHNpZ25pbmdTdGVwPzogJ3NpZ25lck5vbmNlJyB8ICdzaWduZXJTaWduYXR1cmUnIHwgJ2Nvc2lnbmVyTm9uY2UnO1xuICB9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj47XG59O1xuXG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBpc0NoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluLCBvdXRwdXRTY3JpcHRzIH0gPSBiaXRnbztcbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG5cbnR5cGUgUm9vdFdhbGxldEtleXMgPSBiaXRnby5Sb290V2FsbGV0S2V5cztcblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBZGRyZXNzT3B0aW9ucyBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZyB8IG51bWJlcjtcbiAgZXh0ZXJuYWw/OiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPHN0cmluZywgc3RyaW5nPiB7XG4gIGxvY2t0aW1lOiBudW1iZXI7XG4gIG91dHB1dHM6IE91dHB1dFtdO1xuICBjaGFuZ2VPdXRwdXRzOiBPdXRwdXRbXTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGlucHV0IHNpZ25hdHVyZXMgcGVyIGlucHV0LlxuICAgKi9cbiAgaW5wdXRTaWduYXR1cmVzOiBudW1iZXJbXTtcblxuICAvKipcbiAgICogSGlnaGVzdCBpbnB1dCBzaWduYXR1cmUgY291bnQgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2lnbmF0dXJlczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIC8qKiBNYXBzIHR4aWQgdG8gdHhoZXguIFJlcXVpcmVkIGZvciBvZmZsaW5lIHNpZ25pbmcuICovXG4gIHR4SGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjaGFuZ2VBZGRyZXNzZXM/OiBzdHJpbmdbXTtcbiAgLyoqIHBzYnQgZG9lcyBub3QgcmVxdWlyZSB1bnNwZW50cy4gKi9cbiAgdW5zcGVudHM/OiBVbnNwZW50PFROdW1iZXI+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgZmVlSW5mbz86IHN0cmluZztcbiAgcHVicz86IFRyaXBsZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgdHlwZSBVdHhvTmV0d29yayA9IHV0eG9saWIuTmV0d29yaztcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUGFyYW1zIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgY2hhbmdlQWRkcmVzcz86IHN0cmluZztcbiAgcmJmVHhJZHM/OiBzdHJpbmdbXTtcbn1cblxuLy8gcGFyc2VUcmFuc2FjdGlvbnMnIHJldHVybiB0eXBlIG1ha2VzIHVzZSBvZiBXYWxsZXREYXRhJ3MgdHlwZSBidXQgd2l0aCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzIGFzIHJlcXVpcmVkLlxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdFV0eG9Db2luV2FsbGV0RGF0YSBleHRlbmRzIFdhbGxldERhdGEge1xuICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzOiB7XG4gICAgdXNlcjogc3RyaW5nO1xuICAgIGJhY2t1cDogc3RyaW5nO1xuICAgIGJpdGdvOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFV0eG9Db2luV2FsbGV0IGV4dGVuZHMgV2FsbGV0IHtcbiAgcHVibGljIF93YWxsZXQ6IEFic3RyYWN0VXR4b0NvaW5XYWxsZXREYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHN1cGVyKGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgd2FsbGV0OiBBYnN0cmFjdFV0eG9Db2luV2FsbGV0O1xuICB2ZXJpZmljYXRpb24/OiBWZXJpZmljYXRpb25PcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVBhcnNlZFRyYW5zYWN0aW9uIHtcbiAga2V5Y2hhaW5zOiB7XG4gICAgdXNlcj86IEtleWNoYWluO1xuICAgIGJhY2t1cD86IEtleWNoYWluO1xuICAgIGJpdGdvPzogS2V5Y2hhaW47XG4gIH07XG4gIGtleVNpZ25hdHVyZXM6IHtcbiAgICBiYWNrdXBQdWI/OiBzdHJpbmc7XG4gICAgYml0Z29QdWI/OiBzdHJpbmc7XG4gIH07XG4gIG91dHB1dHM6IE91dHB1dFtdO1xuICBtaXNzaW5nT3V0cHV0czogT3V0cHV0W107XG4gIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBPdXRwdXRbXTtcbiAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IE91dHB1dFtdO1xuICBjaGFuZ2VPdXRwdXRzOiBPdXRwdXRbXTtcbiAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBUTnVtYmVyO1xuICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IFROdW1iZXI7XG4gIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiBib29sZWFuO1xuICBjdXN0b21DaGFuZ2U/OiBDdXN0b21DaGFuZ2VPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlQWRkcmVzc09wdGlvbnMge1xuICBhZGRyZXNzVHlwZT86IFNjcmlwdFR5cGUyT2YzO1xuICBrZXljaGFpbnM6IHtcbiAgICBwdWI6IHN0cmluZztcbiAgICBhc3BLZXlJZD86IHN0cmluZztcbiAgfVtdO1xuICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleD86IG51bWJlcjtcbiAgc2Vnd2l0PzogYm9vbGVhbjtcbiAgYmVjaDMyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGV0YWlscyB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgY29pbjogc3RyaW5nO1xuICBjb2luU3BlY2lmaWM6IEFkZHJlc3NDb2luU3BlY2lmaWM7XG4gIGFkZHJlc3NUeXBlPzogc3RyaW5nO1xufVxuXG50eXBlIFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zICYge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIC8qKlxuICAgICAqIHdhbGxldElkIGlzIHJlcXVpcmVkIGluIGZvbGxvd2luZyAyIHNjZW5hcmlvcy5cbiAgICAgKiAxLiBFeHRlcm5hbCBzaWduZXIgZXhwcmVzcyBtb2RlIGlzIHVzZWQuXG4gICAgICogMi4gYml0Z28gTXVTaWcyIG5vbmNlIGlzIHJlcXVlc3RlZFxuICAgICAqL1xuICAgIHdhbGxldElkPzogc3RyaW5nO1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB9O1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBSZXF1aXJlZCBvbmx5IHdoZW4gdHhQcmVidWlsZC50eEhleCBpcyBub3QgYSBQU0JUICovXG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhbGxvd3Mgc2lnbmluZyBhIG5vbi1zZWd3aXQgaW5wdXQgd2l0aCBhIHdpdG5lc3NVdHhvIGluc3RlYWQgcmVxdWlyaW5nIGEgcHJldmlvdXNcbiAgICogdHJhbnNhY3Rpb24gKG5vbldpdG5lc3NVdHhvKVxuICAgKi9cbiAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gVXR4b0Jhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+ICZcbiAgKFxuICAgIHwge1xuICAgICAgICBwcnY6IHN0cmluZztcbiAgICAgICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZSc7XG4gICAgICB9XG4gICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTaWdBZGRyZXNzIHtcbiAgb3V0cHV0U2NyaXB0OiBCdWZmZXI7XG4gIHJlZGVlbVNjcmlwdD86IEJ1ZmZlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnMge1xuICB0eGlkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xuICB3YWxsZXQ6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgeHBydj86IHN0cmluZztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgY29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHJlY292ZXJ5Q29pbj86IEFic3RyYWN0VXR4b0NvaW47XG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW46IHsgcHViPzogc3RyaW5nIH07XG4gIGtleWNoYWluVG9WZXJpZnk6IHsgcHViPzogc3RyaW5nIH07XG4gIGtleVNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zIHtcbiAgdXNlcktleWNoYWluPzogS2V5Y2hhaW47XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+XG4gIGV4dGVuZHMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogQWJzdHJhY3RVdHhvQ29pbldhbGxldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlcXVlc3Qge1xuICBwc2J0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblBzYnRSZXNwb25zZSB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXR4b0NvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBhbHRTY3JpcHRIYXNoPzogbnVtYmVyO1xuICBwdWJsaWMgc3VwcG9ydEFsdFNjcmlwdERlc3RpbmF0aW9uPzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25ldHdvcms6IHV0eG9saWIuTmV0d29yaztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgaWYgKCF1dHhvbGliLmlzVmFsaWROZXR3b3JrKG5ldHdvcmspKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdpbnZhbGlkIG5ldHdvcms6IHBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIHRoZSBzYW1lIHZlcnNpb24gb2YgJyArXG4gICAgICAgICAgJ0BiaXRnby91dHhvLWxpYiBhcyB0aGlzIGxpYnJhcnkgd2hlbiBpbml0aWFsaXppbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcydcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYW1vdW50VHlwZSA9IGFtb3VudFR5cGU7XG4gICAgdGhpcy5fbmV0d29yayA9IG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogS2V5IFZhbHVlOiBVbnNpZ25lZCB0eCBpZCA9PiBQU0JUXG4gICAqIEl0IGlzIHVzZWQgdG8gY2FjaGUgUFNCVHMgd2l0aCB0YXByb290IGtleSBwYXRoIChNdVNpZzIpIGlucHV0cyBkdXJpbmcgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgaXMgYWN0aXZhdGVkLlxuICAgKiBSZWFzb246IE11U2lnMiBzaWduZXIgc2VjdXJlIG5vbmNlIGlzIGNhY2hlZCBpbiB0aGUgVXR4b1BzYnQgb2JqZWN0LiBJdCB3aWxsIGJlIHJlcXVpcmVkIGR1cmluZyB0aGUgc2lnbmluZyBzdGVwLlxuICAgKiBGb3IgbW9yZSBpbmZvLCBjaGVjayBTaWduVHJhbnNhY3Rpb25PcHRpb25zLnNpZ25pbmdTdGVwXG4gICAqXG4gICAqIFRPRE8gQlRDLTI3NjogVGhpcyBjYWNoZSBtYXkgbmVlZCB0byBiZSBkb25lIHdpdGggTFJVIGxpa2UgbWVtb3J5IHNhZmUgY2FjaGluZyBpZiBtZW1vcnkgaXNzdWVzIGNvbWVzIHVwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUFNCVF9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0PigpO1xuXG4gIGdldCBuZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLl9uZXR3b3JrO1xuICB9XG5cbiAgc3dlZXBXaXRoU2VuZE1hbnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgc3RhdGljIGdldCB2YWxpZEFkZHJlc3NUeXBlcygpOiBTY3JpcHRUeXBlMk9mM1tdIHtcbiAgICByZXR1cm4gWy4uLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmYWN0b3IgYmV0d2VlbiB0aGUgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRCYXNlRmFjdG9yKCkge1xuICAgIHJldHVybiAxZTg7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldENvaW5MaWJyYXJ5KCkge1xuICAgIHJldHVybiB1dHhvbGliO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgdmFsaWRcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHBhcmFtPzogeyBhbnlGb3JtYXQ6IGJvb2xlYW4gfSB8IC8qIGxlZ2FjeSBwYXJhbWV0ZXIgKi8gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdib29sZWFuJyAmJiBwYXJhbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0cyA9IHBhcmFtICYmIHBhcmFtLmFueUZvcm1hdCA/IHVuZGVmaW5lZCA6IFsnZGVmYXVsdCcgYXMgY29uc3RdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGFkZHJlc3MsIHRoaXMubmV0d29yaywgZm9ybWF0cyk7XG4gICAgICByZXR1cm4gYWRkcmVzcyA9PT0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCB0aGlzLm5ldHdvcmspO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXAzMi5mcm9tQmFzZTU4KHB1YikuaXNOZXV0ZXJlZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYmxvY2sgaGVpZ2h0XG4gICAqIEBwYXJhbSByZXFJZFxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocmVxSWQ/OiBSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYWluaGVhZCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcHVibGljL2Jsb2NrL2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gKGNoYWluaGVhZCBhcyBhbnkpLmhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY3VzdG9tIGNvaW4gbG9naWMgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIEJpdEdvXG4gICAqIEBwYXJhbSBwcmVidWlsZFxuICAgKi9cbiAgYXN5bmMgcG9zdFByb2Nlc3NQcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj4+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC50eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHR4ID0gYml0Z28uaXNQc2J0KHByZWJ1aWxkLnR4SGV4KVxuICAgICAgPyBiaXRnby5jcmVhdGVQc2J0RnJvbUhleChwcmVidWlsZC50eEhleCwgdGhpcy5uZXR3b3JrKVxuICAgICAgOiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyPihwcmVidWlsZC50eEhleCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJlYnVpbGQuYmxvY2tIZWlnaHQpKSB7XG4gICAgICBwcmVidWlsZC5ibG9ja0hlaWdodCA9IChhd2FpdCB0aGlzLmdldExhdGVzdEJsb2NrSGVpZ2h0KCkpIGFzIG51bWJlcjtcbiAgICB9XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB0eEhleDogdHgudG9IZXgoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZmlyc3RcbiAgICogQHBhcmFtIHNlY29uZFxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFsbCBvdXRwdXRzIHRoYXQgYXJlIGluIHRoZSBmaXJzdCBhcnJheSBidXQgbm90IGluIHRoZSBzZWNvbmRcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgb3V0cHV0RGlmZmVyZW5jZShmaXJzdDogT3V0cHV0W10sIHNlY29uZDogT3V0cHV0W10pOiBPdXRwdXRbXSB7XG4gICAgY29uc3Qga2V5RnVuYyA9ICh7IGFkZHJlc3MsIGFtb3VudCB9OiBPdXRwdXQpOiBzdHJpbmcgPT4gYCR7YWRkcmVzc306JHthbW91bnR9YDtcbiAgICBjb25zdCBncm91cGVkT3V0cHV0cyA9IF8uZ3JvdXBCeShmaXJzdCwga2V5RnVuYyk7XG5cbiAgICBzZWNvbmQuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3VwZWRPdXRwdXRzW2tleUZ1bmMob3V0cHV0KV07XG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAucG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gXy5mbGF0dGVuKF8udmFsdWVzKGdyb3VwZWRPdXRwdXRzKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGFkZHJlc3MnIHR5cGUgYmFzZWQgb24gaXRzIHdpdG5lc3MgYW5kIHJlZGVlbSBzY3JpcHQgcHJlc2VuY2VcbiAgICogQHBhcmFtIGFkZHJlc3NEZXRhaWxzXG4gICAqL1xuICBzdGF0aWMgaW5mZXJBZGRyZXNzVHlwZShhZGRyZXNzRGV0YWlsczogeyBjaGFpbjogbnVtYmVyIH0pOiBTY3JpcHRUeXBlMk9mMyB8IG51bGwge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShhZGRyZXNzRGV0YWlscy5jaGFpbikgPyBzY3JpcHRUeXBlRm9yQ2hhaW4oYWRkcmVzc0RldGFpbHMuY2hhaW4pIDogbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBoZXg6IHN0cmluZ1xuICApOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KGhleCwgdGhpcy5uZXR3b3JrLCB0aGlzLmFtb3VudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYW5kIGZpbGwgdHJhbnNhY3Rpb24gZGV0YWlscyBzdWNoIGFzIGludGVybmFsL2NoYW5nZSBzcGVuZCwgZXh0ZXJuYWwgc3BlbmQgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCksIGV0Yy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7fSwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cbiAgICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAgIGNvbnN0IGZldGNoS2V5Y2hhaW5zID0gYXN5bmMgKHdhbGxldDogSVdhbGxldCk6IFByb21pc2U8VmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10+ID0+IHtcbiAgICAgIHJldHVybiBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSksXG4gICAgICAgIGJhY2t1cDogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSksXG4gICAgICAgIGJpdGdvOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICAgIGxldCBrZXljaGFpbnM6IFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddIHwgdW5kZWZpbmVkID0gdmVyaWZpY2F0aW9uLmtleWNoYWlucztcbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGZldGNoIGtleWNoYWlucyB3aXRob3V0IG5ldHdvcmtpbmcnKTtcbiAgICAgIH1cbiAgICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHdhbGxldCk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMgfHwgIWtleWNoYWlucy51c2VyIHx8ICFrZXljaGFpbnMuYmFja3VwIHx8ICFrZXljaGFpbnMuYml0Z28pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW5zIGFyZSByZXF1aXJlZCwgYnV0IGNvdWxkIG5vdCBiZSBmZXRjaGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5BcnJheTogVHJpcGxlPEtleWNoYWluPiA9IFtrZXljaGFpbnMudXNlciwga2V5Y2hhaW5zLmJhY2t1cCwga2V5Y2hhaW5zLmJpdGdvXTtcblxuICAgIGNvbnN0IGtleVNpZ25hdHVyZXMgPSBfLmdldCh3YWxsZXQsICdfd2FsbGV0LmtleVNpZ25hdHVyZXMnLCB7fSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4UHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG4gICAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgICBwdWJzOiBrZXljaGFpbkFycmF5Lm1hcCgoaykgPT4gay5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+LFxuICAgIH0pO1xuICAgIGNvbnN0IGFsbE91dHB1dHMgPSBbLi4uZXhwbGFuYXRpb24ub3V0cHV0cywgLi4uZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c107XG5cbiAgICBsZXQgZXhwZWN0ZWRPdXRwdXRzO1xuICAgIGlmICh0eFBhcmFtcy5yYmZUeElkcykge1xuICAgICAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgICAgIGNvbnN0IHR4VG9CZVJlcGxhY2VkID0gYXdhaXQgd2FsbGV0LmdldFRyYW5zYWN0aW9uKHsgdHhIYXNoOiB0eFBhcmFtcy5yYmZUeElkc1swXSwgaW5jbHVkZVJiZjogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdGVkT3V0cHV0cyA9IHR4VG9CZVJlcGxhY2VkLm91dHB1dHNcbiAgICAgICAgLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQud2FsbGV0ICE9PSB3YWxsZXQuaWQoKSkgLy8gRm9yIHNlbGYtc2VuZHMsIHRoZSB3YWxsZXRJZCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSB3YWxsZXQncyBpZFxuICAgICAgICAubWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBhbW91bnQ6IEJpZ0ludChvdXRwdXQudmFsdWVTdHJpbmcpLCBhZGRyZXNzOiB0aGlzLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB2ZXJpZnkgdGhhdCBlYWNoIHJlY2lwaWVudCBmcm9tIHR4UGFyYW1zIGhhcyB0aGVpciBvd24gb3V0cHV0XG4gICAgICBleHBlY3RlZE91dHB1dHMgPSBfLmdldCh0eFBhcmFtcywgJ3JlY2lwaWVudHMnLCBbXSBhcyBUcmFuc2FjdGlvblJlY2lwaWVudFtdKS5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5vdXRwdXQsIGFkZHJlc3M6IHRoaXMuY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gQWJzdHJhY3RVdHhvQ29pbi5vdXRwdXREaWZmZXJlbmNlKGV4cGVjdGVkT3V0cHV0cywgYWxsT3V0cHV0cyk7XG5cbiAgICAvLyBnZXQgdGhlIGtleWNoYWlucyBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIHdhbGxldCBpZiBuZWVkZWRcbiAgICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgICBpZiAoY3VzdG9tQ2hhbmdlV2FsbGV0SWQpIHtcbiAgICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMgPSB3YWxsZXQuX3dhbGxldC5jdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzO1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY3VzdG9tQ2hhbmdlV2FsbGV0KTtcblxuICAgICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFtLZXljaGFpbiwgS2V5Y2hhaW4sIEtleWNoYWluXSA9IFtcbiAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgICAgXTtcblxuICAgICAgICBjdXN0b21DaGFuZ2UgPSB7XG4gICAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMudXNlcixcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLFxuICAgICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnbyxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb3AgdGhyb3VnaCBhbGwgdGhlIG91dHB1dHMgYW5kIGNsYXNzaWZ5IGVhY2ggb2YgdGhlbSBhcyBlaXRoZXIgaW50ZXJuYWwgc3BlbmRzXG4gICAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0IGFsbE91dHB1dERldGFpbHM6IE91dHB1dFtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICAgICAgY29pbjogdGhpcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgICBrZXljaGFpbkFycmF5LFxuICAgICAgICAgIHdhbGxldCxcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24gPSBhbGxPdXRwdXREZXRhaWxzLnNvbWUoXG4gICAgICAob3V0cHV0KSA9PiBvdXRwdXQubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgICApO1xuXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IF8uZmlsdGVyKGFsbE91dHB1dERldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgb3V0cHV0cyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAgIC8vIGlkZWFsbHkgY2hhbmdlIG91dHB1dHMgb3IgYSBwYXlnbyBvdXRwdXQgdGhhdCBtaWdodCBoYXZlIGJlZW4gYWRkZWRcbiAgICBjb25zdCBpbXBsaWNpdE91dHB1dHMgPSBBYnN0cmFjdFV0eG9Db2luLm91dHB1dERpZmZlcmVuY2UoYWxsT3V0cHV0RGV0YWlscywgZXhwZWN0ZWRPdXRwdXRzKTtcblxuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0cyA9IEFic3RyYWN0VXR4b0NvaW4ub3V0cHV0RGlmZmVyZW5jZShhbGxPdXRwdXREZXRhaWxzLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gICAgLy8gdGhlc2UgYXJlIGFsbCB0aGUgbm9uLXdhbGxldCBvdXRwdXRzIHRoYXQgaGFkIGJlZW4gb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiByZWNpcGllbnRzXG4gICAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihleHBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG5cbiAgICAvLyB0aGlzIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG5vbi13YWxsZXQgb3V0cHV0IHZhbHVlc1xuICAgIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICAgIHRoaXMuYW1vdW50VHlwZVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudCBwZXJ0YWlucyB0byB2ZXJpZnlpbmcgdGhlIHBheS1hcy15b3UtZ28tZmVlIEJpdEdvXG4gICAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgICAqIGluIHRoYXQgd2UgY29tcGFyZSB0aGUgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHRoYXQgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyIHRvIHRoZSBwb3J0aW9uXG4gICAgICogdGhhdCB3YXMgc3BlY2lmaWVkIGltcGxpY2l0bHkuIFRvIHByb3RlY3QgY3VzdG9tZXJzIGZyb20gcGVvcGxlIHRhbXBlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBvdXRwdXRzLCB3ZVxuICAgICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAgICogZXh0ZXJuYWwgc3BlbmQuXG4gICAgICovXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAgIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMgPSBfLmZpbHRlcihpbXBsaWNpdE91dHB1dHMsIHsgZXh0ZXJuYWw6IHRydWUgfSk7XG4gICAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvOiBPdXRwdXQpID0+IHN1bSArIEJpZ0ludChvLmFtb3VudCksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgICAgdGhpcy5hbW91bnRUeXBlXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXljaGFpbnMsXG4gICAgICBrZXlTaWduYXR1cmVzLFxuICAgICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICAgIG1pc3NpbmdPdXRwdXRzLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHMsXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbixcbiAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3J5cHQgdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXkgYW5kIHZlcmlmeSB0aGF0IHRoZSBjbGFpbWVkIHB1YmxpYyBrZXkgbWF0Y2hlc1xuICAgKiBAcGFyYW0ge1ZlcmlmeVVzZXJQdWJsaWNLZXlPcHRpb25zfSBwYXJhbXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCB0eFBhcmFtcywgZGlzYWJsZU5ldHdvcmtpbmcgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclB1YiA9IHVzZXJLZXljaGFpbi5wdWI7XG5cbiAgICAvLyBkZWNyeXB0IHRoZSB1c2VyIHByaXZhdGUga2V5LCBzbyB3ZSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGNsYWltZWQgcHVibGljIGtleSBpcyBhIG1hdGNoXG4gICAgbGV0IHVzZXJQcnYgPSB1c2VyS2V5Y2hhaW4ucHJ2O1xuICAgIGlmICghdXNlclBydiAmJiB0eFBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB1c2VyUHJ2ID0gZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHR4UGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgIH1cblxuICAgIGlmICghdXNlclBydikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ3VzZXIgcHJpdmF0ZSBrZXkgdW5hdmFpbGFibGUgZm9yIHZlcmlmaWNhdGlvbic7XG4gICAgICBpZiAoZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJQcml2YXRlS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2KTtcbiAgICAgIGlmICh1c2VyUHJpdmF0ZUtleS50b0Jhc2U1OCgpID09PSB1c2VyUHJpdmF0ZUtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIHByaXZhdGUga2V5IGlzIG9ubHkgcHVibGljJyk7XG4gICAgICB9XG4gICAgICBpZiAodXNlclByaXZhdGVLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpICE9PSB1c2VyUHViKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBwcml2YXRlIGtleSBkb2VzIG5vdCBtYXRjaCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHNpZ25hdHVyZXMgcHJvZHVjZWQgYnkgdGhlIHVzZXIga2V5IG92ZXIgdGhlIGJhY2t1cCBhbmQgYml0Z28ga2V5cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGVzZSBzaWduYXR1cmVzIGVuc3VyZSB0aGF0IHRoZSB3YWxsZXQga2V5cyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgd2FsbGV0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7VmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHt7YmFja3VwOiBib29sZWFuLCBiaXRnbzogYm9vbGVhbn19XG4gICAqL1xuICBwdWJsaWMgdmVyaWZ5S2V5U2lnbmF0dXJlKHBhcmFtczogVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAvLyBmaXJzdCwgbGV0J3MgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHVzZXIga2V5LCB3aG9zZSBwdWJsaWMga2V5IGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgdmVyaWZpY2F0aW9uc1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBrZXljaGFpblRvVmVyaWZ5LCBrZXlTaWduYXR1cmUgfSA9IHBhcmFtcztcbiAgICBpZiAoIXVzZXJLZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyIGtleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpblRvVmVyaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIHRvIHZlcmlmeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICgha2V5U2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSB1c2VyIHB1YmxpYyBrZXlcbiAgICBhc3NlcnQodXNlcktleWNoYWluLnB1Yik7XG4gICAgY29uc3QgcHVibGljS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyS2V5Y2hhaW4ucHViKS5wdWJsaWNLZXk7XG4gICAgLy8gRHVlIHRvIGludGVyZmFjZSBvZiBgYml0Y29pbk1lc3NhZ2VgLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHB1YmxpYyBrZXkgdG8gYW4gYWRkcmVzcy5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyBhZGRyZXNzIGhhcyBubyByZWxhdGlvbnNoaXAgdG8gb24tY2hhaW4gdHJhbnNhY3Rpb25zLiBXZSBhcmVcbiAgICAvLyBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGFkZHJlc3MgYXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCBzaWduaW5nQWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy50b0Jhc2U1OENoZWNrKFxuICAgICAgdXR4b2xpYi5jcnlwdG8uaGFzaDE2MChwdWJsaWNLZXkpLFxuICAgICAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLnB1YktleUhhc2gsXG4gICAgICAvLyB3ZSBkbyBub3QgcGFzcyBgdGhpcy5uZXR3b3JrYCBoZXJlIGJlY2F1c2UgaXQgd291bGQgZmFpbCBmb3IgemNhc2hcbiAgICAgIC8vIHRoZSBiaXRjb2luTWVzc2FnZSBsaWJyYXJ5IGRlY29kZXMgdGhlIGFkZHJlc3MgYW5kIHRocm93cyBhd2F5IHRoZSBmaXJzdCBieXRlXG4gICAgICAvLyBiZWNhdXNlIHpjYXNoIGhhcyBhIHR3by1ieXRlIHByZWZpeCwgdmVyaWZ5KCkgZGVjb2RlcyB6Y2FzaCBhZGRyZXNzZXMgdG8gYW4gaW52YWxpZCBwdWJrZXkgaGFzaFxuICAgICAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luXG4gICAgKTtcblxuICAgIC8vIEJHLTU3MDM6IHVzZSBCVEMgbWFpbm5ldCBwcmVmaXggZm9yIGFsbCBrZXkgc2lnbmF0dXJlIG9wZXJhdGlvbnNcbiAgICAvLyAodGhpcyBtZWFucyBkbyBub3QgcGFzcyBhIHByZWZpeCBwYXJhbWV0ZXIsIGFuZCBsZXQgaXQgdXNlIHRoZSBkZWZhdWx0IHByZWZpeCBpbnN0ZWFkKVxuICAgIGFzc2VydChrZXljaGFpblRvVmVyaWZ5LnB1Yik7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXRjb2luTWVzc2FnZS52ZXJpZnkoa2V5Y2hhaW5Ub1ZlcmlmeS5wdWIsIHNpZ25pbmdBZGRyZXNzLCBCdWZmZXIuZnJvbShrZXlTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2Vycm9yIHRocm93biBmcm9tIGJpdGNvaW5tZXNzYWdlIHdoaWxlIHZlcmlmeWluZyBrZXkgc2lnbmF0dXJlJywgZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIGFnYWluc3QgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgb3ZlciB0aGUgY2hhbmdlIHdhbGxldCBleHRlbmRlZCBrZXlzXG4gICAqIEBwYXJhbSB7UGFyc2VkVHJhbnNhY3Rpb259IHR4XG4gICAqIEBwYXJhbSB7S2V5Y2hhaW59IHVzZXJLZXljaGFpblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdmVyaWZ5Q3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICB0eDogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gICAgdXNlcktleWNoYWluOiBLZXljaGFpblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXR4LmN1c3RvbUNoYW5nZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJzZWQgdHJhbnNhY3Rpb24gaXMgbWlzc2luZyByZXF1aXJlZCBjdXN0b20gY2hhbmdlIHZlcmlmaWNhdGlvbiBkYXRhJyk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR4LmN1c3RvbUNoYW5nZS5rZXlzKSB8fCAhQXJyYXkuaXNBcnJheSh0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tQ2hhbmdlIHByb3BlcnR5IGlzIG1pc3Npbmcga2V5cyBvciBzaWduYXR1cmVzJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXlJbmRleCBvZiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT10pIHtcbiAgICAgIGNvbnN0IGtleWNoYWluVG9WZXJpZnkgPSB0eC5jdXN0b21DaGFuZ2Uua2V5c1trZXlJbmRleF07XG4gICAgICBjb25zdCBrZXlTaWduYXR1cmUgPSB0eC5jdXN0b21DaGFuZ2Uuc2lnbmF0dXJlc1trZXlJbmRleF07XG4gICAgICBpZiAoIWtleWNoYWluVG9WZXJpZnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIGN1c3RvbSBjaGFuZ2UgJHtLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpfSBrZXljaGFpbiBwdWJsaWMga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtleVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSAke0tleUluZGljZXNba2V5SW5kZXhdLnRvTG93ZXJDYXNlKCl9IGtleWNoYWluIHNpZ25hdHVyZWApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy52ZXJpZnlLZXlTaWduYXR1cmUoe1xuICAgICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluIGFzIHsgcHViOiBzdHJpbmcgfSxcbiAgICAgICAgICBrZXljaGFpblRvVmVyaWZ5OiBrZXljaGFpblRvVmVyaWZ5IGFzIHsgcHViOiBzdHJpbmcgfSxcbiAgICAgICAgICBrZXlTaWduYXR1cmUsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgZGVidWcoJ2ZhaWxlZCB0byB2ZXJpZnkgY3VzdG9tIGNoYW5nZSAlcyBrZXkgc2lnbmF0dXJlIScsIEtleUluZGljZXNba2V5SW5kZXhdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2UgbGltaXQgZm9yIHBheS1hcy15b3UtZ28gb3V0cHV0c1xuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGF5R29MaW1pdChhbGxvd1BheWdvT3V0cHV0PzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgLy8gYWxsb3dpbmcgcGF5Z28gb3V0cHV0cyBuZWVkcyB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvciwgc28gb25seSBkaXNhbGxvdyBwYXlnbyBvdXRwdXRzIGlmIHRoZVxuICAgIC8vIHJlbGV2YW50IHZlcmlmaWNhdGlvbiBvcHRpb24gaXMgYm90aCBzZXQgYW5kIGZhbHNlXG4gICAgaWYgKCFfLmlzTmlsKGFsbG93UGF5Z29PdXRwdXQpICYmICFhbGxvd1BheWdvT3V0cHV0KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLy8gMTUwIGJhc2lzIHBvaW50cyBpcyB0aGUgYWJzb2x1dGUgcGVybWl0dGVkIG1heGltdW0gaWYgcGF5Z28gb3V0cHV0cyBhcmUgYWxsb3dlZFxuICAgIHJldHVybiAwLjAxNTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIGludGVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQYXJhbXMgcGFyYW1zIG9iamVjdCBwYXNzZWQgdG8gc2VuZFxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQgcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQudHhIZXggcHJlYnVpbHQgdHJhbnNhY3Rpb24ncyB0eEhleCBmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IFdhbGxldCBvYmplY3QgdG8gb2J0YWluIGtleXMgdG8gdmVyaWZ5IGFnYWluc3RcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24gT2JqZWN0IHNwZWNpZnlpbmcgc29tZSB2ZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBEaXNhbGxvdyBmZXRjaGluZyBhbnkgZGF0YSBmcm9tIHRoZSBpbnRlcm5ldCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmtleWNoYWlucyBQYXNzIGtleWNoYWlucyBtYW51YWxseSByYXRoZXIgdGhhbiBmZXRjaGluZyB0aGVtIGJ5IGlkXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmFkZHJlc3NlcyBBZGRyZXNzIGRldGFpbHMgdG8gcGFzcyBpbiBmb3Igb3V0LW9mLWJhbmQgdmVyaWZpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7IGFsbG93UGF5Z29PdXRwdXQ6IHRydWUgfSwgcmVxSWQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBpc1BzYnQgPSB0eFByZWJ1aWxkLnR4SGV4ICYmIGJpdGdvLmlzUHNidCh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBpZiAoaXNQc2J0ICYmIHR4UHJlYnVpbGQudHhJbmZvPy51bnNwZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGhhdmUgdW5zcGVudHMgaW4gdHhJbmZvIGZvciBwc2J0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSAhIXZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcbiAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbjogUGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4gPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgdHhQYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgd2FsbGV0LFxuICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgcmVxSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBwYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnM7XG5cbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCB1c2VyIHB1YmxpYyBrZXkgY29ycmVzcG9uZHMgdG8gdGhlIHdhbGxldCdzIHVzZXIgcHJpdmF0ZSBrZXlcbiAgICBsZXQgdXNlclB1YmxpY0tleVZlcmlmaWVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHZlcmlmeSB0aGUgdXNlciBwdWJsaWMga2V5IG1hdGNoZXMgdGhlIHByaXZhdGUga2V5IC0gdGhpcyB3aWxsIHRocm93IGlmIHRoZXJlIGlzIG5vIG1hdGNoXG4gICAgICB1c2VyUHVibGljS2V5VmVyaWZpZWQgPSB0aGlzLnZlcmlmeVVzZXJQdWJsaWNLZXkoeyB1c2VyS2V5Y2hhaW46IGtleWNoYWlucy51c2VyLCBkaXNhYmxlTmV0d29ya2luZywgdHhQYXJhbXMgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byB2ZXJpZnkgdXNlciBwdWJsaWMga2V5IScsIGUpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIHZlcmlmeSB0aGVzZSBrZXljaGFpbnNcbiAgICBjb25zdCBrZXlTaWduYXR1cmVzID0gcGFyc2VkVHJhbnNhY3Rpb24ua2V5U2lnbmF0dXJlcztcbiAgICBpZiAoIV8uaXNFbXB0eShrZXlTaWduYXR1cmVzKSkge1xuICAgICAgY29uc3QgdmVyaWZ5ID0gKGtleSwgcHViKSA9PiB7XG4gICAgICAgIGlmICgha2V5Y2hhaW5zLnVzZXIgfHwgIWtleWNoYWlucy51c2VyLnB1Yikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyIGtleWNoYWluJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5S2V5U2lnbmF0dXJlKHtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWlucy51c2VyIGFzIHsgcHViOiBzdHJpbmcgfSxcbiAgICAgICAgICBrZXljaGFpblRvVmVyaWZ5OiBrZXksXG4gICAgICAgICAga2V5U2lnbmF0dXJlOiBwdWIsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGlzQmFja3VwS2V5U2lnbmF0dXJlVmFsaWQgPSB2ZXJpZnkoa2V5Y2hhaW5zLmJhY2t1cCwga2V5U2lnbmF0dXJlcy5iYWNrdXBQdWIpO1xuICAgICAgY29uc3QgaXNCaXRnb0tleVNpZ25hdHVyZVZhbGlkID0gdmVyaWZ5KGtleWNoYWlucy5iaXRnbywga2V5U2lnbmF0dXJlcy5iaXRnb1B1Yik7XG4gICAgICBpZiAoIWlzQmFja3VwS2V5U2lnbmF0dXJlVmFsaWQgfHwgIWlzQml0Z29LZXlTaWduYXR1cmVWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlY29uZGFyeSBwdWJsaWMga2V5IHNpZ25hdHVyZXMgaW52YWxpZCcpO1xuICAgICAgfVxuICAgICAgZGVidWcoJ3N1Y2Nlc3NmdWxseSB2ZXJpZmllZCBiYWNrdXAgYW5kIGJpdGdvIGtleSBzaWduYXR1cmVzJyk7XG4gICAgfSBlbHNlIGlmICghZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgIC8vIHRoZXNlIGtleXMgd2VyZSBvYnRhaW5lZCBvbmxpbmUgYW5kIHRoZWlyIHNpZ25hdHVyZXMgd2VyZSBub3QgdmVyaWZpZWRcbiAgICAgIC8vIHRoaXMgY291bGQgYmUgZGFuZ2Vyb3VzXG4gICAgICBjb25zb2xlLmxvZygndW5zaWduZWQga2V5cyBvYnRhaW5lZCBvbmxpbmUgYXJlIGJlaW5nIHVzZWQgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZFRyYW5zYWN0aW9uLm5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uKSB7XG4gICAgICBpZiAoIWtleWNoYWlucy51c2VyIHx8ICF1c2VyUHVibGljS2V5VmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgdXNlciBwdWJsaWMga2V5LCBidXQgaXQgd2FzIHVuYWJsZSB0byBiZSB2ZXJpZmllZCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlc1ZlcmlmaWVkID0gdGhpcy52ZXJpZnlDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzKHBhcnNlZFRyYW5zYWN0aW9uLCBrZXljaGFpbnMudXNlcik7XG4gICAgICBpZiAoIWN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXNWZXJpZmllZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3RyYW5zYWN0aW9uIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiBvZiBjdXN0b20gY2hhbmdlIGtleSBzaWduYXR1cmVzLCBidXQgdGhleSB3ZXJlIHVuYWJsZSB0byBiZSB2ZXJpZmllZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdzdWNjZXNzZnVsbHkgdmVyaWZpZWQgdXNlciBwdWJsaWMga2V5IGFuZCBjdXN0b20gY2hhbmdlIGtleSBzaWduYXR1cmVzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlzc2luZ091dHB1dHMgPSBwYXJzZWRUcmFuc2FjdGlvbi5taXNzaW5nT3V0cHV0cztcbiAgICBpZiAobWlzc2luZ091dHB1dHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0aGVyZSBhcmUgc29tZSBvdXRwdXRzIGluIHRoZSByZWNpcGllbnRzIGxpc3QgdGhhdCBoYXZlIG5vdCBtYWRlIGl0IGludG8gdGhlIGFjdHVhbCB0cmFuc2FjdGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBvdXRwdXRzIG1pc3NpbmcgaW4gdHJhbnNhY3Rpb24gcHJlYnVpbGQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlbmRlZEV4dGVybmFsU3BlbmQgPSBwYXJzZWRUcmFuc2FjdGlvbi5leHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ7XG5cbiAgICAvLyB0aGlzIGlzIGEgbGltaXQgd2UgaW1wb3NlIGZvciB0aGUgdG90YWwgdmFsdWUgdGhhdCBpcyBhbWVuZGVkIHRvIHRoZSB0cmFuc2FjdGlvbiBiZXlvbmQgd2hhdCB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZFxuICAgIGNvbnN0IHBheUFzWW91R29MaW1pdCA9IG5ldyBCaWdOdW1iZXIodGhpcy5nZXRQYXlHb0xpbWl0KHZlcmlmaWNhdGlvbi5hbGxvd1BheWdvT3V0cHV0KSkubXVsdGlwbGllZEJ5KFxuICAgICAgaW50ZW5kZWRFeHRlcm5hbFNwZW5kLnRvU3RyaW5nKClcbiAgICApO1xuXG4gICAgLypcbiAgICBTb21lIGV4cGxhbmF0aW9uIGZvciB3aHkgd2UncmUgZG9pbmcgd2hhdCB3ZSdyZSBkb2luZzpcbiAgICBTb21lIGN1c3RvbWVycyB3aWxsIGhhdmUgYW4gb3V0cHV0IHRvIEJpdEdvJ3MgUEFZR28gd2FsbGV0IGFkZGVkIHRvIHRoZWlyIHRyYW5zYWN0aW9uLCBhbmQgd2UgbmVlZCB0byBhY2NvdW50IGZvclxuICAgIGl0IGhlcmUuIFRvIHByb3RlY3Qgc29tZW9uZSB0YW1wZXJpbmcgd2l0aCB0aGUgb3V0cHV0IHRvIG1ha2UgaXQgc2VuZCBtb3JlIHRoYW4gaXQgc2hvdWxkIHRvIEJpdEdvLCB3ZSBkZWZpbmUgYVxuICAgIHRocmVzaG9sZCBmb3IgdGhlIG91dHB1dCdzIHZhbHVlIGFib3ZlIHdoaWNoIHdlJ2xsIHRocm93IGFuIGVycm9yLCBiZWNhdXNlIHRoZSBwYXlnbyBvdXRwdXQgc2hvdWxkIG5ldmVyIGJlIHRoYXRcbiAgICBoaWdoLlxuICAgICAqL1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBleHRyYSBhZGRyZXNzZXMgYXJlIGNoYW5nZSBhZGRyZXNzZXNcbiAgICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICAgIGNvbnN0IG5vbkNoYW5nZUFtb3VudCA9IG5ldyBCaWdOdW1iZXIocGFyc2VkVHJhbnNhY3Rpb24uaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LnRvU3RyaW5nKCkpO1xuXG4gICAgZGVidWcoXG4gICAgICAnSW50ZW5kZWQgc3BlbmQgaXMgJXMsIE5vbi1jaGFuZ2UgYW1vdW50IGlzICVzLCBwYXlnbyBsaW1pdCBpcyAlcycsXG4gICAgICBpbnRlbmRlZEV4dGVybmFsU3BlbmQudG9TdHJpbmcoKSxcbiAgICAgIG5vbkNoYW5nZUFtb3VudC50b1N0cmluZygpLFxuICAgICAgcGF5QXNZb3VHb0xpbWl0LnRvU3RyaW5nKClcbiAgICApO1xuICAgIC8vIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgY2FuIG9ubHkgYmUgQml0R28ncyBwYXktYXMteW91LWdvIGZlZSwgYnV0IHdlIGNhbm5vdCB2ZXJpZnkgdGhlIHdhbGxldCBhZGRyZXNzXG4gICAgaWYgKG5vbkNoYW5nZUFtb3VudC5ndChwYXlBc1lvdUdvTGltaXQpKSB7XG4gICAgICAvLyB0aGVyZSBhcmUgc29tZSBhZGRyZXNzZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgaW50ZW5kZWQgcmVjaXBpZW50cyB0aGF0IGFyZSBub3QgY2hhbmdlIGFkZHJlc3Nlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmVidWlsZCBhdHRlbXB0cyB0byBzcGVuZCB0byB1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxPdXRwdXRzID0gcGFyc2VkVHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZC50eEhleCBub3Qgc2V0YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IGlzUHNidFxuICAgICAgPyBnZXRQc2J0VHhJbnB1dHModHhQcmVidWlsZC50eEhleCwgdGhpcy5uZXR3b3JrKS5tYXAoKHYpID0+ICh7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICB2YWx1ZTogYml0Z28udG9UTnVtYmVyKHYudmFsdWUsIHRoaXMuYW1vdW50VHlwZSksXG4gICAgICAgIH0pKVxuICAgICAgOiBhd2FpdCBnZXRUeElucHV0cyh7IHR4UHJlYnVpbGQsIGJpdGdvOiB0aGlzLmJpdGdvLCBjb2luOiB0aGlzLCBkaXNhYmxlTmV0d29ya2luZywgcmVxSWQgfSk7XG4gICAgLy8gY29pbnMgKGRvZ2UpIHRoYXQgY2FuIGV4Y2VlZCBudW1iZXIgbGltaXRzIChhbmQgdGh1cyB3aWxsIHVzZSBiaWdpbnQpIHdpbGwgaGF2ZSB0aGUgYHZhbHVlU3RyaW5nYCBmaWVsZFxuICAgIGNvbnN0IGlucHV0QW1vdW50ID0gaW5wdXRzLnJlZHVjZShcbiAgICAgIChzdW06IGJpZ2ludCwgaSkgPT4gc3VtICsgQmlnSW50KHRoaXMuYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcgPyBpLnZhbHVlU3RyaW5nIDogaS52YWx1ZSksXG4gICAgICBCaWdJbnQoMClcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IGFsbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IGZlZSA9IGlucHV0QW1vdW50IC0gb3V0cHV0QW1vdW50O1xuXG4gICAgaWYgKGZlZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGF0dGVtcHRpbmcgdG8gc3BlbmQgJHtvdXRwdXRBbW91bnR9IHNhdG9zaGlzLCB3aGljaCBleGNlZWRzIHRoZSBpbnB1dCBhbW91bnQgKCR7aW5wdXRBbW91bnR9IHNhdG9zaGlzKSBieSAkey1mZWV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgYW4gYWRkcmVzcyBpcyB2YWxpZCBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QuXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyBUaGUgYWRkcmVzcyBzdHJpbmcgb24gdGhlIG5ldHdvcmtcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyBLZXljaGFpbiBvYmplY3RzIHdpdGggeHB1YnNcbiAgICogQHBhcmFtIHBhcmFtcy5jb2luU3BlY2lmaWMgQ29pbi1zcGVjaWZpYyBkZXRhaWxzIGZvciB0aGUgYWRkcmVzcyBzdWNoIGFzIGEgd2l0bmVzcyBzY3JpcHRcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFpbiBEZXJpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXMuaW5kZXggRGVyaXZhdGlvbiBpbmRleFxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Vycm9yfVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yfVxuICAgKiBAdGhyb3dzIHtVbmV4cGVjdGVkQWRkcmVzc0Vycm9yfVxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGFkZHJlc3NUeXBlLCBrZXljaGFpbnMsIGNvaW5TcGVjaWZpYywgY2hhaW4sIGluZGV4IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAoKF8uaXNVbmRlZmluZWQoY2hhaW4pICYmIF8uaXNVbmRlZmluZWQoaW5kZXgpKSB8fCAhKF8uaXNGaW5pdGUoY2hhaW4pICYmIF8uaXNGaW5pdGUoaW5kZXgpKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogaW52YWxpZCBjaGFpbiAoJHtjaGFpbn0pIG9yIGluZGV4ICgke2luZGV4fSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChjb2luU3BlY2lmaWMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NWZXJpZmljYXRpb25PYmplY3RQcm9wZXJ0eUVycm9yKFxuICAgICAgICAnYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGNvaW5TcGVjaWZpYyBmaWVsZCBtdXN0IGJlIGFuIG9iamVjdCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSB0aGlzLmdlbmVyYXRlQWRkcmVzcyh7XG4gICAgICBhZGRyZXNzVHlwZTogYWRkcmVzc1R5cGUgYXMgU2NyaXB0VHlwZTJPZjMsXG4gICAgICBrZXljaGFpbnMsXG4gICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICBjaGFpbixcbiAgICAgIGluZGV4LFxuICAgIH0pO1xuXG4gICAgaWYgKGV4cGVjdGVkQWRkcmVzcy5hZGRyZXNzICE9PSBhZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBleHBlY3RlZCAke2V4cGVjdGVkQWRkcmVzcy5hZGRyZXNzfSBidXQgZ290ICR7YWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGNvaW4gc3VwcG9ydHMgYSBibG9jayB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdXBwb3J0c0Jsb2NrVGFyZ2V0KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gdW5zcGVudFR5cGVcbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc1R5cGUoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1N1cHBvcnRlZFNjcmlwdFR5cGUodGhpcy5uZXR3b3JrLCBhZGRyZXNzVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEByZXR1cm4gdHJ1ZSBpZmYgY29pbiBzdXBwb3J0cyBzcGVuZGluZyBmcm9tIGNoYWluXG4gICAqL1xuICBzdXBwb3J0c0FkZHJlc3NDaGFpbihjaGFpbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQ2hhaW5Db2RlKGNoYWluKSAmJiB0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUodXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pKTtcbiAgfVxuXG4gIGtleUlkc0ZvclNpZ25pbmcoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT107XG4gIH1cblxuICAvKipcbiAgICogVE9ETyhCRy0xMTQ4Nyk6IFJlbW92ZSBhZGRyZXNzVHlwZSwgc2Vnd2l0LCBhbmQgYmVjaDMyIHBhcmFtcyBpbiBTREt2NlxuICAgKiBHZW5lcmF0ZSBhbiBhZGRyZXNzIGZvciBhIHdhbGxldCBiYXNlZCBvbiBhIHNldCBvZiBjb25maWd1cmF0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3NUeXBlIHtzdHJpbmd9ICAgRGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zLmtleWNoYWlucyAgIHtbb2JqZWN0XX0gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHhwdWJzXG4gICAqIEBwYXJhbSBwYXJhbXMudGhyZXNob2xkICAge251bWJlcn0gICBNaW5pbXVtIG51bWJlciBvZiBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhaW4gICAgICAge251bWJlcn0gICBEZXJpdmF0aW9uIGNoYWluIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL0JpdEdvL3Vuc3BlbnRzL2Jsb2IvbWFzdGVyL3NyYy9jb2Rlcy50cyBmb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgYWRkcmVzcyB0eXBlIG9mIGEgZ2l2ZW4gY2hhaW4gY29kZSlcbiAgICogQHBhcmFtIHBhcmFtcy5pbmRleCAgICAgICB7bnVtYmVyfSAgIERlcml2YXRpb24gaW5kZXhcbiAgICogQHBhcmFtIHBhcmFtcy5zZWd3aXQgICAgICB7Ym9vbGVhbn0gIERlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHBhcmFtcy5iZWNoMzIgICAgICB7Ym9vbGVhbn0gIERlcHJlY2F0ZWRcbiAgICogQHJldHVybnMge3tjaGFpbjogbnVtYmVyLCBpbmRleDogbnVtYmVyLCBjb2luOiBudW1iZXIsIGNvaW5TcGVjaWZpYzoge291dHB1dFNjcmlwdCwgcmVkZWVtU2NyaXB0fX19XG4gICAqL1xuICBnZW5lcmF0ZUFkZHJlc3MocGFyYW1zOiBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zKTogQWRkcmVzc0RldGFpbHMge1xuICAgIGNvbnN0IHsga2V5Y2hhaW5zLCB0aHJlc2hvbGQsIGNoYWluLCBpbmRleCwgc2Vnd2l0ID0gZmFsc2UsIGJlY2gzMiA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gICAgbGV0IGRlcml2YXRpb25DaGFpbiA9IGdldEV4dGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG4gICAgaWYgKF8uaXNOdW1iZXIoY2hhaW4pICYmIF8uaXNJbnRlZ2VyKGNoYWluKSAmJiBpc0NoYWluQ29kZShjaGFpbikpIHtcbiAgICAgIGRlcml2YXRpb25DaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnZlcnRGbGFnc1RvQWRkcmVzc1R5cGUoKTogU2NyaXB0VHlwZTJPZjMge1xuICAgICAgaWYgKGlzQ2hhaW5Db2RlKGNoYWluKSkge1xuICAgICAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNCb29sZWFuKHNlZ3dpdCkgJiYgc2Vnd2l0KSB7XG4gICAgICAgIHJldHVybiAncDJzaFAyd3NoJztcbiAgICAgIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4oYmVjaDMyKSAmJiBiZWNoMzIpIHtcbiAgICAgICAgcmV0dXJuICdwMndzaCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ3Ayc2gnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NUeXBlID0gcGFyYW1zLmFkZHJlc3NUeXBlIHx8IGNvbnZlcnRGbGFnc1RvQWRkcmVzc1R5cGUoKTtcblxuICAgIGlmIChhZGRyZXNzVHlwZSAhPT0gdXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oZGVyaXZhdGlvbkNoYWluKSkge1xuICAgICAgdGhyb3cgbmV3IEFkZHJlc3NUeXBlQ2hhaW5NaXNtYXRjaEVycm9yKGFkZHJlc3NUeXBlLCBkZXJpdmF0aW9uQ2hhaW4pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlKSkge1xuICAgICAgc3dpdGNoIChhZGRyZXNzVHlwZSkge1xuICAgICAgICBjYXNlICdwMnNoJzpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludGVybmFsIGVycm9yOiBwMnNoIHNob3VsZCBhbHdheXMgYmUgc3VwcG9ydGVkYCk7XG4gICAgICAgIGNhc2UgJ3Ayc2hQMndzaCc6XG4gICAgICAgICAgdGhyb3cgbmV3IFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgY2FzZSAncDJ3c2gnOlxuICAgICAgICAgIHRocm93IG5ldyBQMndzaFVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgY2FzZSAncDJ0cic6XG4gICAgICAgICAgdGhyb3cgbmV3IFAydHJVbnN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIGNhc2UgJ3AydHJNdXNpZzInOlxuICAgICAgICAgIHRocm93IG5ldyBQMnRyTXVzaWcyVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc2lnbmF0dXJlVGhyZXNob2xkID0gMjtcbiAgICBpZiAoXy5pc0ludGVnZXIodGhyZXNob2xkKSkge1xuICAgICAgc2lnbmF0dXJlVGhyZXNob2xkID0gdGhyZXNob2xkIGFzIG51bWJlcjtcbiAgICAgIGlmIChzaWduYXR1cmVUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBoYXMgdG8gYmUgcG9zaXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWduYXR1cmVUaHJlc2hvbGQgPiBrZXljaGFpbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhyZXNob2xkIGNhbm5vdCBleGNlZWQgbnVtYmVyIG9mIGtleXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZGVyaXZhdGlvbkluZGV4ID0gMDtcbiAgICBpZiAoXy5pc0ludGVnZXIoaW5kZXgpICYmIChpbmRleCBhcyBudW1iZXIpID4gMCkge1xuICAgICAgZGVyaXZhdGlvbkluZGV4ID0gaW5kZXggYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSAnMC8wLycgKyBkZXJpdmF0aW9uQ2hhaW4gKyAnLycgKyBkZXJpdmF0aW9uSW5kZXg7XG4gICAgY29uc3QgaGROb2RlcyA9IGtleWNoYWlucy5tYXAoKHsgcHViIH0pID0+IGJpcDMyLmZyb21CYXNlNTgocHViKSk7XG4gICAgY29uc3QgZGVyaXZlZEtleXMgPSBoZE5vZGVzLm1hcCgoaGROb2RlKSA9PiBoZE5vZGUuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgocGF0aCkpLnB1YmxpY0tleSk7XG5cbiAgICBjb25zdCB7IG91dHB1dFNjcmlwdCwgcmVkZWVtU2NyaXB0LCB3aXRuZXNzU2NyaXB0LCBhZGRyZXNzIH0gPSB0aGlzLmNyZWF0ZU11bHRpU2lnQWRkcmVzcyhcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgICAgc2lnbmF0dXJlVGhyZXNob2xkLFxuICAgICAgZGVyaXZlZEtleXNcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3MsXG4gICAgICBjaGFpbjogZGVyaXZhdGlvbkNoYWluLFxuICAgICAgaW5kZXg6IGRlcml2YXRpb25JbmRleCxcbiAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICBvdXRwdXRTY3JpcHQ6IG91dHB1dFNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHJlZGVlbVNjcmlwdDogcmVkZWVtU2NyaXB0ICYmIHJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHdpdG5lc3NTY3JpcHQ6IHdpdG5lc3NTY3JpcHQgJiYgd2l0bmVzc1NjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgYWRkcmVzc1R5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbnB1dCBwc2J0IGFkZGVkIHdpdGggZGV0ZXJtaW5pc3RpYyBNdVNpZzIgbm9uY2UgZm9yIGJpdGdvIGtleSBmb3IgZWFjaCBNdVNpZzIgaW5wdXRzLlxuICAgKiBAcGFyYW0gcHNidEhleCBhbGwgTXVTaWcyIGlucHV0cyBzaG91bGQgY29udGFpbiB1c2VyIE11U2lnMiBub25jZVxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICovXG4gIGFzeW5jIHNpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZywgd2FsbGV0SWQ6IHN0cmluZyk6IFByb21pc2U8U2lnblBzYnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHBhcmFtczogU2lnblBzYnRSZXF1ZXN0ID0geyBwc2J0OiBwc2J0SGV4IH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2FsbGV0LycgKyB3YWxsZXRJZCArICcvdHgvc2lnbnBzYnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBwYXJhbXMudHhQcmVidWlsZDtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpIHx8ICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodHhQcmVidWlsZCkgJiYgIV8uaXNPYmplY3QodHhQcmVidWlsZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eFByZWJ1aWxkfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgbGV0IHR4ID0gYml0Z28uaXNQc2J0KHR4UHJlYnVpbGQudHhIZXgpXG4gICAgICA/IGJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4UHJlYnVpbGQudHhIZXgsIHRoaXMubmV0d29yaylcbiAgICAgIDogdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4odHhQcmVidWlsZC50eEhleCk7XG5cbiAgICBjb25zdCBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0ID0gdHggaW5zdGFuY2VvZiBiaXRnby5VdHhvUHNidCAmJiBiaXRnby5pc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KHR4KTtcblxuICAgIGxldCBpc0xhc3RTaWduYXR1cmUgPSBmYWxzZTtcbiAgICBpZiAoXy5pc0Jvb2xlYW4ocGFyYW1zLmlzTGFzdFNpZ25hdHVyZSkpIHtcbiAgICAgIC8vIFdlIGNhbiBvbmx5IGJlIHRoZSBmaXJzdCBzaWduYXR1cmUgb24gYSB0cmFuc2FjdGlvbiB3aXRoIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXRzIGJlY2F1c2VcbiAgICAgIC8vIHdlIHJlcXVpcmUgdGhlIHNlY3JldCBub25jZSBpbiB0aGUgY2FjaGUgb2YgdGhlIGZpcnN0IHNpZ25lciwgd2hpY2ggaXMgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBpZlxuICAgICAgLy8gZGVzZXJpYWxpemVkIGZyb20gYSBoZXguXG4gICAgICBpZiAocGFyYW1zLmlzTGFzdFNpZ25hdHVyZSAmJiBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJlIGxhc3Qgc2lnbmF0dXJlIG9uIGEgdHJhbnNhY3Rpb24gd2l0aCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMnKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYnVpbGQgaXMgY2FsbGVkIGluc3RlYWQgb2YgYnVpbGRJbmNvbXBsZXRlLCBubyBzaWduYXR1cmUgcGxhY2Vob2xkZXJzIGFyZSBsZWZ0IGluIHRoZSBzaWcgc2NyaXB0XG4gICAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFNpZ25lcktleWNoYWluID0gKCk6IHV0eG9saWIuQklQMzJJbnRlcmZhY2UgPT4ge1xuICAgICAgY29uc3QgdXNlclBydiA9IHBhcmFtcy5wcnY7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh1c2VyUHJ2KSB8fCAhXy5pc1N0cmluZyh1c2VyUHJ2KSkge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlclBydikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiB1c2VyUHJ2fWApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25lcktleWNoYWluID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgaWYgKHNpZ25lcktleWNoYWluLmlzTmV1dGVyZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHVzZXIgcHJpdmF0ZSBrZXkgYnV0IHJlY2VpdmVkIHB1YmxpYyBrZXknKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKGBIZXJlIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSB4cHJ2IHlvdSB1c2VkIHRvIHNpZ246ICR7c2lnbmVyS2V5Y2hhaW4ubmV1dGVyZWQoKS50b0Jhc2U1OCgpfWApO1xuICAgICAgcmV0dXJuIHNpZ25lcktleWNoYWluO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRTaWduZXJNdXNpZ05vbmNlV2l0aE92ZXJyaWRlID0gKFxuICAgICAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHNpZ25lcktleWNoYWluOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlLFxuICAgICAgbm9uU2Vnd2l0T3ZlcnJpZGU6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHV0eG9saWIuYml0Z28ud2l0aFVuc2FmZU5vblNlZ3dpdChwc2J0LCAoKSA9PiBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoc2lnbmVyS2V5Y2hhaW4pLCBub25TZWd3aXRPdmVycmlkZSk7XG4gICAgfTtcblxuICAgIGxldCBzaWduZXJLZXljaGFpbjogdXR4b2xpYi5CSVAzMkludGVyZmFjZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0ICYmIGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQpIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICAgIGNhc2UgJ3NpZ25lck5vbmNlJzpcbiAgICAgICAgICBzaWduZXJLZXljaGFpbiA9IGdldFNpZ25lcktleWNoYWluKCk7XG4gICAgICAgICAgc2V0U2lnbmVyTXVzaWdOb25jZVdpdGhPdmVycmlkZSh0eCwgc2lnbmVyS2V5Y2hhaW4sICEhcGFyYW1zLmFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHgpO1xuICAgICAgICAgIEFic3RyYWN0VXR4b0NvaW4uUFNCVF9DQUNIRS5zZXQodHguZ2V0VW5zaWduZWRUeCgpLmdldElkKCksIHR4KTtcbiAgICAgICAgICByZXR1cm4geyB0eEhleDogdHgudG9IZXgoKSB9O1xuICAgICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgICBhc3NlcnQodHhQcmVidWlsZC53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgICByZXR1cm4geyB0eEhleDogKGF3YWl0IHRoaXMuc2lnblBzYnQodHgudG9IZXgoKSwgdHhQcmVidWlsZC53YWxsZXRJZCkpLnBzYnQgfTtcbiAgICAgICAgY2FzZSAnc2lnbmVyU2lnbmF0dXJlJzpcbiAgICAgICAgICBjb25zdCB0eElkID0gdHguZ2V0VW5zaWduZWRUeCgpLmdldElkKCk7XG4gICAgICAgICAgY29uc3QgcHNidCA9IEFic3RyYWN0VXR4b0NvaW4uUFNCVF9DQUNIRS5nZXQodHhJZCk7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgcHNidCxcbiAgICAgICAgICAgIGBQc2J0IGlzIG1pc3NpbmcgZnJvbSB0eENhY2hlIChjYWNoZSBzaXplICR7QWJzdHJhY3RVdHhvQ29pbi5QU0JUX0NBQ0hFLnNpemV9KS5cbiAgICAgICAgICAgIFRoaXMgbWF5IGJlIGR1ZSB0byB0aGUgcmVxdWVzdCBiZWluZyByb3V0ZWQgdG8gYSBkaWZmZXJlbnQgQml0R28tRXhwcmVzcyBpbnN0YW5jZSB0aGF0IGZvciBzaWduaW5nIHN0ZXAgJ3NpZ25lck5vbmNlJy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBBYnN0cmFjdFV0eG9Db2luLlBTQlRfQ0FDSEUuZGVsZXRlKHR4SWQpO1xuICAgICAgICAgIHR4ID0gcHNidC5jb21iaW5lKHR4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbiBleHRlcm5hbCBzaWduZXJcbiAgICAgICAgICBhc3NlcnQodHhQcmVidWlsZC53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgICBzaWduZXJLZXljaGFpbiA9IGdldFNpZ25lcktleWNoYWluKCk7XG4gICAgICAgICAgc2V0U2lnbmVyTXVzaWdOb25jZVdpdGhPdmVycmlkZSh0eCwgc2lnbmVyS2V5Y2hhaW4sICEhcGFyYW1zLmFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHgpO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zaWduUHNidCh0eC50b0hleCgpLCB0eFByZWJ1aWxkLndhbGxldElkKTtcbiAgICAgICAgICB0eC5jb21iaW5lKGJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHJlc3BvbnNlLnBzYnQsIHRoaXMubmV0d29yaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5zaWduaW5nU3RlcCkge1xuICAgICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICAgIGNhc2UgJ2Nvc2lnbmVyTm9uY2UnOlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEluIGNlcnRhaW4gY2FzZXMsIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbWF5IG5vdCBrbm93IHdoZXRoZXIgdGhlIHR4SGV4IGNvbnRhaW5zIGEgcHNidCB3aXRoIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXQocykuXG4gICAgICAgICAgICogSW5zdGVhZCBvZiB0aHJvd2luZyBlcnJvciwgbm8tb3AgYW5kIHJldHVybiB0aGUgdHhIZXguIFNvIHRoYXQgdGhlIGNhbGxlciBjYW4gY2FsbCB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBzZXF1ZW5jZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICByZXR1cm4geyB0eEhleDogdHgudG9IZXgoKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWduZXJLZXljaGFpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaWduZXJLZXljaGFpbiA9IGdldFNpZ25lcktleWNoYWluKCk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBiaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PiB8IGJpdGdvLlV0eG9Qc2J0O1xuICAgIGlmICh0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlQc2J0KHR4LCBzaWduZXJLZXljaGFpbiwge1xuICAgICAgICBpc0xhc3RTaWduYXR1cmUsXG4gICAgICAgIGFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHg6IHBhcmFtcy5hbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eC5pbnMubGVuZ3RoICE9PSB0eFByZWJ1aWxkLnR4SW5mbz8udW5zcGVudHM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCBvZiB1bnNwZW50cyBhcnJheSBzaG91bGQgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiBpbnB1dHMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJhbXMucHVicyB8fCAhaXNUcmlwbGUocGFyYW1zLnB1YnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIHhwdWIgYXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gcGFyYW1zLnB1YnMubWFwKChwdWIpID0+IGJpcDMyLmZyb21CYXNlNTgocHViKSkgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPjtcbiAgICAgIGNvbnN0IGNvc2lnbmVyUHViID0gcGFyYW1zLmNvc2lnbmVyUHViID8/IHBhcmFtcy5wdWJzWzJdO1xuICAgICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgICBjb25zdCB3YWxsZXRTaWduZXIgPSBuZXcgYml0Z28uV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4oa2V5Y2hhaW5zLCBzaWduZXJLZXljaGFpbiwgY29zaWduZXJLZXljaGFpbik7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbih0eCwgdHhQcmVidWlsZC50eEluZm8udW5zcGVudHMsIHdhbGxldFNpZ25lciwge1xuICAgICAgICBpc0xhc3RTaWduYXR1cmUsXG4gICAgICB9KSBhcyBiaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uIHdpdGggYSBjdXN0b20gc2lnbmluZyBmdW5jdGlvbi4gRXhhbXBsZSB1c2UgY2FzZSBpcyBleHByZXNzIGV4dGVybmFsIHNpZ25lclxuICAgKiBAcGFyYW0gY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHNpbmdsZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHNpZ25UcmFuc2FjdGlvblBhcmFtcyBwYXJhbWV0ZXJzIGZvciBjdXN0b20gc2lnbmluZyBmdW5jdGlvbi4gSW5jbHVkZXMgdHhQcmVidWlsZCBhbmQgcHVicyAoZm9yIGxlZ2FjeSB0eCBvbmx5KS5cbiAgICpcbiAgICogQHJldHVybnMgc2lnbmVkIHRyYW5zYWN0aW9uIGFzIGhleCBzdHJpbmdcbiAgICovXG4gIGFzeW5jIHNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogVXR4b0N1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyPixcbiAgICBzaWduVHJhbnNhY3Rpb25QYXJhbXM6IHsgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjsgcHVicz86IHN0cmluZ1tdIH1cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQudHhIZXg7XG4gICAgYXNzZXJ0KHR4SGV4LCAnbWlzc2luZyB0eEhleCBwYXJhbWV0ZXInKTtcblxuICAgIGNvbnN0IHR4ID0gYml0Z28uaXNQc2J0KHR4SGV4KVxuICAgICAgPyBiaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eEhleCwgdGhpcy5uZXR3b3JrKVxuICAgICAgOiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyPih0eEhleCk7XG5cbiAgICBjb25zdCBpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0ID0gdHggaW5zdGFuY2VvZiBiaXRnby5VdHhvUHNidCAmJiBiaXRnby5pc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KHR4KTtcblxuICAgIGlmICghaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcywgY29pbjogdGhpcyB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRUeEhleCA9ICh2OiBTaWduZWRUcmFuc2FjdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoJ3R4SGV4JyBpbiB2KSB7XG4gICAgICAgIHJldHVybiB2LnR4SGV4O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eEhleCBub3QgZm91bmQgaW4gc2lnblRyYW5zYWN0aW9uIHJlc3VsdCcpO1xuICAgIH07XG5cbiAgICBjb25zdCBzaWduZXJOb25jZVR4ID0gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyTm9uY2UnLFxuICAgICAgY29pbjogdGhpcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVicyB9ID0gc2lnblRyYW5zYWN0aW9uUGFyYW1zO1xuICAgIGFzc2VydChwdWJzID09PSB1bmRlZmluZWQgfHwgaXNUcmlwbGUocHVicykpO1xuXG4gICAgY29uc3QgY29zaWduZXJOb25jZVR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHVicyxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQsIHR4SGV4OiBnZXRUeEhleChzaWduZXJOb25jZVR4KSB9LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdjb3NpZ25lck5vbmNlJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZCwgdHhIZXg6IGdldFR4SGV4KGNvc2lnbmVyTm9uY2VUeCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICAgIGNvaW46IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHVuc3BlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0JpdEdvVGFpbnRlZFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4odW5zcGVudDogVW5zcGVudDxUTnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50PFROdW1iZXI+KHVuc3BlbnQsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKSBpbnN0ZWFkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGVmYXVsdFNpZ0hhc2hUeXBlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2godGhpcy5uZXR3b3JrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB1dHhvbGliLmJpdGNvaW4udmVyaWZ5U2lnbmF0dXJlKCkgaW5zdGVhZFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKFxuICAgIHRyYW5zYWN0aW9uOiBhbnksXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGFtb3VudDogbnVtYmVyLFxuICAgIHZlcmlmaWNhdGlvblNldHRpbmdzOiB7XG4gICAgICBzaWduYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICAgIHB1YmxpY0tleT86IHN0cmluZztcbiAgICB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm5ldHdvcmsgIT09IHRoaXMubmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBuZXR3b3JrIG1pc21hdGNoYCk7XG4gICAgfVxuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZSh0cmFuc2FjdGlvbiwgaW5wdXRJbmRleCwgYW1vdW50LCB7XG4gICAgICBzaWduYXR1cmVJbmRleDogdmVyaWZpY2F0aW9uU2V0dGluZ3Muc2lnbmF0dXJlSW5kZXgsXG4gICAgICBwdWJsaWNLZXk6IHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSA/IEJ1ZmZlci5mcm9tKHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSwgJ2hleCcpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcG9zZSBhIHJhdyBwc2J0L3RyYW5zYWN0aW9uIGludG8gdXNlZnVsIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0b3RhbCBhbW91bnRzLFxuICAgKiBjaGFuZ2UgYW1vdW50cywgYW5kIHRyYW5zYWN0aW9uIG91dHB1dHMuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgeyB0eEhleCB9ID0gcGFyYW1zO1xuICAgIGlmICh0eXBlb2YgdHhIZXggIT09ICdzdHJpbmcnIHx8ICF0eEhleC5tYXRjaCgvXihbYS1mMC05XXsyfSkrJC9pKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYW5zYWN0aW9uIGhleCwgbXVzdCBiZSBhIHZhbGlkIGhleCBzdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uaXNQc2J0KHR4SGV4KSA/IGV4cGxhaW5Qc2J0KHBhcmFtcywgdGhpcy5uZXR3b3JrKSA6IGV4cGxhaW5UeChwYXJhbXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG11bHRpc2lnIGFkZHJlc3Mgb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsaXN0IG9mIGtleWNoYWlucyBhbmQgYSBzaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHNpZ25hdHVyZVRocmVzaG9sZFxuICAgKiBAcGFyYW0ga2V5c1xuICAgKi9cbiAgY3JlYXRlTXVsdGlTaWdBZGRyZXNzKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMywgc2lnbmF0dXJlVGhyZXNob2xkOiBudW1iZXIsIGtleXM6IEJ1ZmZlcltdKTogTXVsdGlTaWdBZGRyZXNzIHtcbiAgICBjb25zdCB7XG4gICAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGtleXMsIGFkZHJlc3NUeXBlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRTY3JpcHQsXG4gICAgICByZWRlZW1TY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCB0aGlzLm5ldHdvcmspLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtcyAtIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiBiYWNrdXBLZXlSZWNvdmVyeT4ge1xuICAgIHJldHVybiBiYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgY29pbiB0aGF0IHdhcyBzZW50IHRvIHdyb25nIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eGlkIFRoZSB0eGlkIG9mIHRoZSBmYXVsdHkgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlDb2luIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnNpZ25lZCByZXR1cm4gYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiAoZGVmYXVsdD10cnVlKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMueHBydiB0aGUgdW5lbmNyeXB0ZWQgeHBydiAodXNlZCBpbnN0ZWFkIG9mIHdhbGxldCBwYXNzcGhyYXNlKVxuICAgKiBAcGFyYW0gcGFyYW1zLmFwaUtleSBmb3IgdXR4byBjb2lucyBvdGhlciB0aGFuIFtCVEMsVEJUQ10gdGhpcyBpcyBhIEJsb2NrIENoYWlyIGFwaSBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZWNvdmVyRnJvbVdyb25nQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zXG4gICk6IFByb21pc2U8Q3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXI+IHwgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlcj4+IHtcbiAgICBjb25zdCB7IHR4aWQsIHJlY292ZXJ5QWRkcmVzcywgd2FsbGV0LCB3YWxsZXRQYXNzcGhyYXNlLCB4cHJ2LCBhcGlLZXkgfSA9IHBhcmFtcztcblxuICAgIC8vIHBhcmFtcy5yZWNvdmVyeUNvaW4gdXNlZCB0byBiZSBwYXJhbXMuY29pbiwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWNvdmVyeUNvaW4gPSBwYXJhbXMuY29pbiB8fCBwYXJhbXMucmVjb3ZlcnlDb2luO1xuICAgIGlmICghcmVjb3ZlcnlDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHJlY292ZXJ5Q29pbicpO1xuICAgIH1cbiAgICAvLyBzaWduZWQgc2hvdWxkIGRlZmF1bHQgdG8gdHJ1ZSwgYW5kIG9ubHkgYmUgZGlzYWJsZWQgaWYgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UgKG5vdCB1bmRlZmluZWQpXG4gICAgY29uc3Qgc2lnbmVkID0gcGFyYW1zLnNpZ25lZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VDb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCByZWNvdmVyeUNvaW5GYW1pbHkgPSByZWNvdmVyeUNvaW4uZ2V0RmFtaWx5KCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkUmVjb3ZlcnlDb2lucyA9IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzW3NvdXJjZUNvaW5GYW1pbHldO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3VwcG9ydGVkUmVjb3ZlcnlDb2lucykgfHwgIXN1cHBvcnRlZFJlY292ZXJ5Q29pbnMuaW5jbHVkZXMocmVjb3ZlcnlDb2luRmFtaWx5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBvZiAke3NvdXJjZUNvaW5GYW1pbHl9IGJhbGFuY2VzIGZyb20gJHtyZWNvdmVyeUNvaW5GYW1pbHl9IHdhbGxldHMgaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlcj4odGhpcy5iaXRnbywge1xuICAgICAgc291cmNlQ29pbjogdGhpcyxcbiAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgIHdhbGxldElkOiB3YWxsZXQsXG4gICAgICB0eGlkLFxuICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogc2lnbmVkID8gd2FsbGV0UGFzc3BocmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHhwcnY6IHNpZ25lZCA/IHhwcnYgOiB1bmRlZmluZWQsXG4gICAgICBhcGlLZXksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmlwMzIga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZDogQnVmZmVyKTogeyBwdWI6IHN0cmluZzsgcHJ2OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhidWlsZFBhcmFtczogRXh0cmFQcmVidWlsZFBhcmFtc09wdGlvbnMgJiB7IHdhbGxldDogV2FsbGV0IH0pOiBQcm9taXNlPHtcbiAgICB0eEZvcm1hdD86ICdsZWdhY3knIHwgJ3BzYnQnO1xuICAgIGNoYW5nZUFkZHJlc3NUeXBlPzogU2NyaXB0VHlwZTJPZjNbXSB8IFNjcmlwdFR5cGUyT2YzO1xuICB9PiB7XG4gICAgbGV0IHR4Rm9ybWF0ID0gYnVpbGRQYXJhbXMudHhGb3JtYXQgYXMgJ2xlZ2FjeScgfCAncHNidCcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNoYW5nZUFkZHJlc3NUeXBlID0gYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgYXMgU2NyaXB0VHlwZTJPZjNbXSB8IFNjcmlwdFR5cGUyT2YzIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgd2FsbGV0RmxhZ011c2lnS3AgPSBidWlsZFBhcmFtcy53YWxsZXQuZmxhZygnbXVzaWdLcCcpID09PSAndHJ1ZSc7XG5cbiAgICAvLyBpZiB0aGUgdHhGb3JtYXQgaXMgbm90IHNwZWNpZmllZCwgd2UgbmVlZCB0byBkZWZhdWx0IHRvIHBzYnQgZm9yIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBvciB0ZXN0bmV0IGhvdCB3YWxsZXRzXG4gICAgaWYgKFxuICAgICAgYnVpbGRQYXJhbXMudHhGb3JtYXQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGJ1aWxkUGFyYW1zLndhbGxldC5zdWJUeXBlKCkgPT09ICdkaXN0cmlidXRlZEN1c3RvZHknIHx8XG4gICAgICAgIChpc1Rlc3RuZXQodGhpcy5uZXR3b3JrKSAmJiBidWlsZFBhcmFtcy53YWxsZXQudHlwZSgpID09PSAnaG90JykgfHxcbiAgICAgICAgLy8gRklYTUUoQlRDLTc3Nik6IGRlZmF1bHQgdG8gcHNidCBmb3IgYWxsIG1haW5uZXQgd2FsbGV0cyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIHdhbGxldEZsYWdNdXNpZ0twKVxuICAgICkge1xuICAgICAgdHhGb3JtYXQgPSAncHNidCc7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGFkZHJlc3NUeXBlIGlzIG5vdCBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gZGVmYXVsdCB0byBwMnRyTXVzaWcyIGZvciB0ZXN0bmV0IGhvdCB3YWxsZXRzIGZvciBzdGFnZWQgcm9sbG91dCBvZiBwMnRyTXVzaWcyXG4gICAgaWYgKFxuICAgICAgYnVpbGRQYXJhbXMuYWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJiAvLyBhZGRyZXNzVHlwZSBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgY2hhbmdlQWRkcmVzc2BcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3NUeXBlID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGJ1aWxkUGFyYW1zLmNoYW5nZUFkZHJlc3MgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMud2FsbGV0LnR5cGUoKSA9PT0gJ2hvdCdcbiAgICApIHtcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlID0gWydwMnRyTXVzaWcyJywgJ3AydHInLCAncDJ3c2gnLCAncDJzaFAyd3NoJywgJ3Ayc2gnXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhGb3JtYXQsXG4gICAgICBjaGFuZ2VBZGRyZXNzVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcHJlQ3JlYXRlQml0R28ocGFyYW1zOiBQcmVjcmVhdGVCaXRHb09wdGlvbnMpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhc3luYyBwcmVzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KFxuICAgIHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgICBrZXljaGFpbnM6IEtleWNoYWluc1RyaXBsZXRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gd2FsbGV0UGFyYW1zO1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UmVjb3ZlcnlQcm92aWRlcihhcGlUb2tlbj86IHN0cmluZyk6IFJlY292ZXJ5UHJvdmlkZXIge1xuICAgIHJldHVybiBmb3JDb2luKHRoaXMuZ2V0Q2hhaW4oKSwgYXBpVG9rZW4pO1xuICB9XG59XG4iXX0=
|