@bitgo/sdk-api 1.57.1 → 1.57.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/package.json +3 -3
- package/dist/src/api.js +3 -5
- package/dist/src/bitgoAPI.js +7 -10
- package/dist/src/encrypt.js +4 -4
- package/dist/src/v1/wallet.js +3 -3
- package/package.json +3 -3
package/dist/src/v1/wallet.js
CHANGED
|
@@ -305,8 +305,8 @@ Wallet.prototype.generateAddress = function ({ segwit, path, keychains, threshol
|
|
|
305
305
|
wallet: this.id(),
|
|
306
306
|
};
|
|
307
307
|
const { scriptPubKey: outputScript, redeemScript, witnessScript, } = utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, isSegwit ? 'p2shP2wsh' : 'p2sh');
|
|
308
|
-
addressDetails.witnessScript = witnessScript
|
|
309
|
-
addressDetails.redeemScript = redeemScript
|
|
308
|
+
addressDetails.witnessScript = witnessScript?.toString('hex');
|
|
309
|
+
addressDetails.redeemScript = redeemScript?.toString('hex');
|
|
310
310
|
addressDetails.outputScript = outputScript.toString('hex');
|
|
311
311
|
addressDetails.address = utxolib.address.fromOutputScript(outputScript, (0, sdk_core_1.getNetwork)(network));
|
|
312
312
|
return addressDetails;
|
|
@@ -2242,4 +2242,4 @@ Wallet.prototype.sweep = async function (params) {
|
|
|
2242
2242
|
});
|
|
2243
2243
|
};
|
|
2244
2244
|
module.exports = Wallet;
|
|
2245
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsOENBQStDO0FBQy9DLG9EQUE0QjtBQUU1Qix5REFBMkM7QUFDM0MsOENBQXdDO0FBQ3hDLDhDQU95QjtBQUN6Qix3REFBZ0M7QUFDaEMsb0RBQXVCO0FBQ3ZCLHlDQUE2QztBQUU3QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sRUFBRSxHQUFHLGtCQUFRLENBQUMsU0FBUyxDQUFDO0FBQzlCLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3RHLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV0QyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxNQUFNO0lBQ3BDLHNDQUFzQztJQUNyQyxJQUFJLENBQUMsS0FBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixzQ0FBc0M7SUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDckIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsU0FB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LFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUU3RixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsaUJBQVMsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBXYWxsZXQgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciBmb3IgYSBzcGVjaWZpYyB3YWxsZXRcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2l6ZXMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0TmV0d29yayxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgQmx1ZWJpcmQgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNpZ25Qc2J0UmVxdWVzdCB9IGZyb20gJy4vc2lnblBzYnQnO1xuXG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuY29uc3QgUGVuZGluZ0FwcHJvdmFsID0gcmVxdWlyZSgnLi9wZW5kaW5nYXBwcm92YWwnKTtcblxuY29uc3QgY28gPSBCbHVlYmlyZC5jb3JvdXRpbmU7XG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBnZXRJbnRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gdXR4b2xpYi5iaXRnbztcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFdhbGxldCA9IGZ1bmN0aW9uIChiaXRnbywgd2FsbGV0KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICh0aGlzLmJpdGdvIGFzIGFueSkgPSBiaXRnbztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMua2V5Y2hhaW5zID0gW107XG5cbiAgaWYgKHdhbGxldC5wcml2YXRlKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLmtleWNoYWlucyA9IHdhbGxldC5wcml2YXRlLmtleWNoYWlucztcbiAgfVxufTtcblxuV2FsbGV0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldDtcbn07XG5cbi8vXG4vLyBpZFxuLy8gR2V0IHRoZSBpZCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuaWQ7XG59O1xuXG4vL1xuLy8gbGFiZWxcbi8vIEdldCB0aGUgbGFiZWwgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmxhYmVsO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5iYWxhbmNlO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHVuY29uZmlybWVkIGFuZCBleHRlcm5hbFxuLy9cbldhbGxldC5wcm90b3R5cGUuc3BlbmRhYmxlQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY29uZmlybWVkQmFsYW5jZVxuLy8gR2V0IHRoZSBjb25maXJtZWRCYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybWVkQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY2FuU2VuZEluc3RhbnRcbi8vIFJldHVybnMgaWYgdGhlIHdhbGxldCBjYW4gc2VuZCBpbnN0YW50IHRyYW5zYWN0aW9uc1xuLy8gVGhpcyBpcyBpbXBhY3RlZCBieSB0aGUgY2hvaWNlIG9mIGJhY2t1cCBrZXkgcHJvdmlkZXJcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNhblNlbmRJbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQgJiYgdGhpcy53YWxsZXQuY2FuU2VuZEluc3RhbnQ7XG59O1xuXG4vL1xuLy8gaW5zdGFudCBiYWxhbmNlXG4vLyBHZXQgdGhlIGluc3RhbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyB0aGF0IG1heSBiZSBzcGVudCBpbnN0YW50bHkuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pbnN0YW50QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhblNlbmRJbnN0YW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhbiBpbnN0YW50IHdhbGxldCcpO1xuICB9XG4gIHJldHVybiB0aGlzLndhbGxldC5pbnN0YW50QmFsYW5jZTtcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFNlbmRzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRTZW5kcyBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkU2VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFNlbmRzO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkUmVjZWl2ZXNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFJlY2VpdmVzIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFJlY2VpdmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRSZWNlaXZlcztcbn07XG5cbi8vXG4vLyB0eXBlXG4vLyBHZXQgdGhlIHR5cGUgb2YgdGhpcyB3YWxsZXQsIGUuZy4gJ3NhZmVoZCdcbi8vXG5XYWxsZXQucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC50eXBlO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAoZXh0cmEpIHtcbiAgZXh0cmEgPSBleHRyYSB8fCAnJztcbiAgcmV0dXJuIHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG59O1xuXG4vL1xuLy8gcGVuZGluZ0FwcHJvdmFsc1xuLy8gcmV0dXJucyB0aGUgcGVuZGluZyBhcHByb3ZhbHMgbGlzdCBmb3IgdGhpcyB3YWxsZXQgYXMgcGVuZGluZyBhcHByb3ZhbCBvYmplY3RzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5wZW5kaW5nQXBwcm92YWxzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwoc2VsZi5iaXRnbywgcCwgc2VsZik7XG4gIH0pO1xufTtcblxuLy9cbi8vIGFwcHJvdmFsc1JlcXVpcmVkXG4vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIHRvIGFwcHJvdmUgcGVuZGluZyBhcHByb3ZhbHMgaW52b2x2aW5nIHRoaXMgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkIHx8IDE7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBSZWZldGNoZXMgdGhpcyB3YWxsZXQgYW5kIHJldHVybnMgaXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogQmx1ZWJpcmQ8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgpKVxuICAgICAgLnJlc3VsdCgpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHNlbGYud2FsbGV0ID0gcmVzO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH0pXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdXBkYXRlQXBwcm92YWxzUmVxdWlyZWRcbi8vIFVwZGF0ZXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgb24gYSBwZW5kaW5nIGFwcHJvdmFsIGludm9sdmluZyB0aGlzIHdhbGxldC5cbi8vIFRoZSBhcHByb3ZhbHMgcmVxdWlyZWQgaXMgYnkgZGVmYXVsdCAxLCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGVcbi8vIG51bWJlciBzdWNoIHRoYXQgMSA8PSBhcHByb3ZhbHNSZXF1aXJlZCA8PSB3YWxsZXRBZG1pbnMubGVuZ3RoIC0gMVxuLy9cbldhbGxldC5wcm90b3R5cGUudXBkYXRlQXBwcm92YWxzUmVxdWlyZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjayk6IEJsdWViaXJkPGFueT4ge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoXG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkID09PSB1bmRlZmluZWQgfHxcbiAgICAhXy5pc0ludGVnZXIocGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB8fFxuICAgIHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCA8IDFcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFwcHJvdmFsc1JlcXVpcmVkOiBtdXN0IGJlIGEgbm9uemVybyBwb3NpdGl2ZSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPSB0aGlzLmFwcHJvdmFsc1JlcXVpcmVkKCk7XG4gIGlmIChjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPT09IHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCkge1xuICAgIC8vIG5vLW9wLCBqdXN0IHJldHVybiB0aGUgY3VycmVudCB3YWxsZXRcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLndhbGxldDtcbiAgICB9KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvcnJlY3QgY2hhaW4gZm9yIGNoYW5nZSwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBzZWd3aXRcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRDaGFuZ2VDaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IHVzZVNlZ3dpdENoYW5nZSA9ICEhdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdENoYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2Vnd2l0Q2hhbmdlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgc2Vnd2l0IGlzIGRpc2FibGVkIHRocm91Z2ggdGhlIGNvbnN0YW50cywgc2Vnd2l0IGNoYW5nZSBzaG91bGQgc3RpbGwgbm90IGJlIGNyZWF0ZWRcbiAgICB1c2VTZWd3aXRDaGFuZ2UgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdCAmJiBwYXJhbXMuc2Vnd2l0Q2hhbmdlO1xuICB9XG4gIHJldHVybiB1c2VTZWd3aXRDaGFuZ2UgPyBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFkZHJlc3Ncbi8vIENyZWF0ZXMgYSBuZXcgYWRkcmVzcyBmb3IgdXNlIHdpdGggdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmICh0aGlzLnR5cGUoKSA9PT0gJ3NhZmUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHVzaW5nIGEgbGVnYWN5IHdhbGxldCB0aGF0IGNhbm5vdCBjcmVhdGUgYSBuZXcgYWRkcmVzcycpO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBjbGllbnQtc2lkZSBhZGRyZXNzIHZhbGlkYXRpb24gb24sIGZvciBzYWZldHkuIFVzZSB2YWxpZGF0ZT1mYWxzZSB0byBkaXNhYmxlLlxuICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuXG4gIGNvbnN0IGFsbG93RXhpc3RpbmcgPSBwYXJhbXMuYWxsb3dFeGlzdGluZztcbiAgaWYgKHR5cGVvZiBhbGxvd0V4aXN0aW5nICE9PSAnYm9vbGVhbicpIHtcbiAgICBwYXJhbXMuYWxsb3dFeGlzdGluZyA9IGFsbG93RXhpc3RpbmcgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGlzU2Vnd2l0ID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGNvbnN0IGRlZmF1bHRDaGFpbiA9IGlzU2Vnd2l0ID8gZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2hQMndzaCcpIDogZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcblxuICBsZXQgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiA9PT0gbnVsbCB8fCBjaGFpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2hhaW4gPSBkZWZhdWx0Q2hhaW47XG4gIH1cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy9hZGRyZXNzLycgKyBjaGFpbikpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChhZGRyKSB7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgIHNlbGYudmFsaWRhdGVBZGRyZXNzKGFkZHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgfSlcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYWRkcmVzcyBsb2NhbGx5IHdpdGhvdXQgY2FsbGluZyBzZXJ2ZXJcbiAqIEBwYXJhbSBwYXJhbXNcbiAqXG4gKi9cbldhbGxldC5wcm90b3R5cGUuZ2VuZXJhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHsgc2Vnd2l0LCBwYXRoLCBrZXljaGFpbnMsIHRocmVzaG9sZCB9KSB7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFzZWd3aXQ7XG4gIGxldCBzaWduYXR1cmVUaHJlc2hvbGQgPSAyO1xuICBpZiAoXy5pc0ludGVnZXIodGhyZXNob2xkKSkge1xuICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhyZXNob2xkIGhhcyB0byBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhdGhSZWdleCA9IC9eXFwvMT9bMDFdXFwvXFxkKyQvO1xuICBpZiAoIXBhdGgubWF0Y2gocGF0aFJlZ2V4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgcGF0aDogJyArIHBhdGgpO1xuICB9XG5cbiAgbGV0IHJvb3RLZXlzID0gdGhpcy5rZXljaGFpbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGtleWNoYWlucykpIHtcbiAgICByb290S2V5cyA9IGtleWNoYWlucztcbiAgfVxuXG4gIGNvbnN0IG5ldHdvcmsgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5ldHdvcms7XG5cbiAgY29uc3QgZGVyaXZlZEtleXMgPSByb290S2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICBjb25zdCBoZG5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGsueHB1Yik7XG4gICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBrLnBhdGggKyAoay53YWxsZXRTdWJQYXRoIHx8ICcnKSArIHBhdGg7XG4gICAgcmV0dXJuIGhkbm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChkZXJpdmF0aW9uUGF0aCkpLnB1YmxpY0tleTtcbiAgfSk7XG5cbiAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoQ29tcG9uZW50cyA9IF8ubWFwKHBhdGhDb21wb25lbnRzLCAoY29tcG9uZW50KSA9PiB7XG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbXBvbmVudCwgMTApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHBhdGhEZXRhaWxzID0gXy5maWx0ZXIobm9ybWFsaXplZFBhdGhDb21wb25lbnRzLCBfLmlzSW50ZWdlcik7XG5cbiAgY29uc3QgYWRkcmVzc0RldGFpbHM6IGFueSA9IHtcbiAgICBjaGFpblBhdGg6IHBhdGgsXG4gICAgcGF0aDogcGF0aCxcbiAgICBjaGFpbjogcGF0aERldGFpbHNbMF0sXG4gICAgaW5kZXg6IHBhdGhEZXRhaWxzWzFdLFxuICAgIHdhbGxldDogdGhpcy5pZCgpLFxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICByZWRlZW1TY3JpcHQsXG4gICAgd2l0bmVzc1NjcmlwdCxcbiAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRLZXlzLCBpc1NlZ3dpdCA/ICdwMnNoUDJ3c2gnIDogJ3Ayc2gnKTtcblxuICBhZGRyZXNzRGV0YWlscy53aXRuZXNzU2NyaXB0ID0gd2l0bmVzc1NjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5yZWRlZW1TY3JpcHQgPSByZWRlZW1TY3JpcHQ/LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMub3V0cHV0U2NyaXB0ID0gb3V0cHV0U2NyaXB0LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgZ2V0TmV0d29yayhuZXR3b3JrKSk7XG5cbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzO1xufTtcblxuLy9cbi8vIHZhbGlkYXRlQWRkcmVzc1xuLy8gVmFsaWRhdGVzIGFuIGFkZHJlc3MgYW5kIHBhdGggYnkgY2FsY3VsYXRpbmcgaXQgbG9jYWxseSBmcm9tIHRoZSBrZXljaGFpbiB4cHVic1xuLy9cbldhbGxldC5wcm90b3R5cGUudmFsaWRhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnLCAncGF0aCddLCBbXSk7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFwYXJhbXMud2l0bmVzc1NjcmlwdCAmJiBwYXJhbXMud2l0bmVzc1NjcmlwdC5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGdlbmVyYXRlZEFkZHJlc3MgPSB0aGlzLmdlbmVyYXRlQWRkcmVzcyh7IHBhdGg6IHBhcmFtcy5wYXRoLCBzZWd3aXQ6IGlzU2Vnd2l0IH0pO1xuICBpZiAoZ2VuZXJhdGVkQWRkcmVzcy5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICcgKyBwYXJhbXMuYWRkcmVzcyArICcgdnMuICcgKyBnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MpO1xuICB9XG59O1xuXG4vL1xuLy8gYWRkcmVzc2VzXG4vLyBHZXRzIHRoZSBhZGRyZXNzZXMgb2YgYSBIRCB3YWxsZXQuXG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgbGltaXQ6IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzIHRvIGdldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYWRkcmVzc2VzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gIGlmIChwYXJhbXMuZGV0YWlscykge1xuICAgIHF1ZXJ5LmRldGFpbHMgPSAxO1xuICB9XG5cbiAgY29uc3QgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiAhPT0gbnVsbCAmJiBjaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhaW4pKSB7XG4gICAgICBxdWVyeS5jaGFpbiA9IF8udW5pcShfLmZpbHRlcihjaGFpbiwgXy5pc0ludGVnZXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoYWluICE9PSAwICYmIGNoYWluICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaGFpbiBhcmd1bWVudCwgZXhwZWN0aW5nIDAgb3IgMScpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG4gIH1cbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5za2lwID0gcGFyYW1zLnNraXA7XG4gIH1cbiAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzZXMnKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zdGF0cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9zdGF0cycgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7V2FsbGV0fVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICAvLyB3aGVuIHNldCB0byB0cnVlLCBncGsgcmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHNhZmUgd2FsbGV0c1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5leHRlbmQoe30sIF8ucGljayhwYXJhbXMsIFsnZ3BrJ10pKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMud2FsbGV0ID0gcmVzO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkcmVzc1xuLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBhZGRyZXNzIG9uIGEgSEQgd2FsbGV0LlxuLy8gSW5mb3JtYXRpb24gaW5jbHVkZXMgaW5kZXgsIHBhdGgsIHJlZGVlbVNjcmlwdCwgc2VudCwgcmVjZWl2ZWQsIHR4Q291bnQgYW5kIGJhbGFuY2Vcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBhZGRyZXNzOiB0aGUgYWRkcmVzcyBvbiB0aGlzIHdhbGxldCB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZyZWV6ZSB0aGUgd2FsbGV0IGZvciBhIGR1cmF0aW9uIG9mIGNob2ljZSwgc3RvcHBpbmcgQml0R28gZnJvbSBzaWduaW5nIGFueSB0cmFuc2FjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIGR1cmF0aW9uIHRvIGZyZWV6ZSB0aGUgd2FsbGV0IGZvciBpbiBzZWNvbmRzLCBkZWZhdWx0cyB0byAzNjAwLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmZyZWV6ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb24gLSBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVcbi8vIERlbGV0ZXMgdGhlIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGFiZWxzXG4vLyBMaXN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhZGRyZXNzZXMgaW4gYSBnaXZlbiB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVscyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoJ2xhYmVscycpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVuYW1lIGEgd2FsbGV0XG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgLSBsYWJlbDogdGhlIHdhbGxldCdzIGludGVuZGVkIG5ldyBuYW1lXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNldFdhbGxldE5hbWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodXJsKS5zZW5kKHsgbGFiZWw6IHBhcmFtcy5sYWJlbCB9KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2V0TGFiZWxcbi8vIFNldHMgYSBsYWJlbCBvbiB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVMYWJlbFxuLy8gRGVsZXRlcyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHVybCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVuc3BlbnRzXG4vLyBMaXN0IEFMTCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHBhZ2VkIGxpc3Qgb2YgYWxsIHVuc3BlbnRzXG4vL1xuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBsaW1pdDogIHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuLy8gICBtaW5Db25mOiBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbi8vICAgdGFyZ2V0OiB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4vLyAgIGluc3RhbnQ6IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuLy9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFsbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjb25zdCBnZXRVbnNwZW50c0JhdGNoID0gZnVuY3Rpb24gKHNraXAsIGxpbWl0Pykge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcbiAgICBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LnNraXAgPSBza2lwO1xuICAgIH1cbiAgICBpZiAobGltaXQgJiYgbGltaXQgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnVuc3BlbnRzUGFnZWQocXVlcnlPYmplY3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gVGhlIEFQSSBoYXMgaXRzIG93biBsaW1pdCBoYW5kbGluZy4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdHMgYmlnZ2VyIHRoYW4gNTAwLiBJZiB0aGUgbGltaXRcbiAgICAgIC8vIHNwZWNpZmllZCBoZXJlIGlzIGJpZ2dlciB0aGFuIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBkbyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIG5lY2Vzc2FyeSBsaW1pdCBhZGp1c3RtZW50LlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudW5zcGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlc3VsdC51bnNwZW50c1tpXTtcbiAgICAgICAgYWxsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3VyIGxpbWl0IGFkanVzdG1lbnQgbWFrZXMgc3VyZSB0aGF0IHdlIG5ldmVyIGZldGNoIG1vcmUgdW5zcGVudHMgdGhhbiB3ZSBuZWVkLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGl0IHRoZVxuICAgICAgLy8gbGltaXQsIHdlIGhpdCBpdCBwcmVjaXNlbHlcbiAgICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gcGFyYW1zLmxpbWl0KSB7XG4gICAgICAgIHJldHVybiBhbGxVbnNwZW50czsgLy8gd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYW55IGZ1cnRoZXIgdW5zcGVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG90YWxVbnNwZW50Q291bnQgPSByZXN1bHQudG90YWw7XG4gICAgICAvLyBpZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgU0RLIGluZGljYXRlcyB0aGF0IHRoZXJlIGhhcyBiZWVuIGEgbGltaXQsIHdlIG5lZWQgdG8gZmV0Y2ggYW5vdGhlciBiYXRjaFxuICAgICAgaWYgKCFwYXJhbXMudGFyZ2V0ICYmIHRvdGFsVW5zcGVudENvdW50ICYmIHRvdGFsVW5zcGVudENvdW50ID4gYWxsVW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgLy8gbGV0J3MganVzdCBvZmZzZXQgdGhlIGN1cnJlbnQgc2tpcCBieSB0aGUgY291bnRcbiAgICAgICAgY29uc3QgbmV3U2tpcCA9IHNraXAgKyByZXN1bHQuY291bnQ7XG4gICAgICAgIGxldCBuZXdMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobGltaXQgPiAwKSB7XG4gICAgICAgICAgLy8gd2Ugc2V0IHRoZSBuZXcgbGltaXQgdG8gYmUgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgbWlzc2luZyB1bnNwZW50cyB0byBoaXQgb3VyIG93biBsaW1pdFxuICAgICAgICAgIG5ld0xpbWl0ID0gbGltaXQgLSBhbGxVbnNwZW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2gobmV3U2tpcCwgbmV3TGltaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsVW5zcGVudHM7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2goMCwgcGFyYW1zLmxpbWl0KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogTGlzdCB0aGUgdW5zcGVudHMgKHBhZ2VkKSBmb3IgYSBnaXZlbiB3YWxsZXQsIHJldHVybmluZyB0aGUgcmVzdWx0IGFzIGFuIG9iamVjdCBvZiB1bnNwZW50cywgY291bnQsIHNraXAgYW5kIHRvdGFsXG4gKiBUaGlzIG1ldGhvZCBtYXkgbm90IHJldHVybiBhbGwgdGhlIHVuc3BlbnRzIGFzIHRoZSBsaXN0IGlzIHBhZ2VkIGJ5IHRoZSBBUElcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMubGltaXQgdGhlIG9wdGlvbmFsIGxpbWl0IG9mIHVuc3BlbnRzIHRvIGNvbGxlY3QgaW4gQlRDXG4gKiBAcGFyYW0gcGFyYW1zLnNraXAgaW5kZXggaW4gbGlzdCBvZiB1bnNwZW50cyB0byBzdGFydCBwYWdpbmcgZnJvbVxuICogQHBhcmFtIHBhcmFtcy5taW5Db25maXJtcyBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0IHRoZSBhbW91bnQgb2YgYnRjIHRvIGZpbmQgdG8gc3BlbmRcbiAqIEBwYXJhbSBwYXJhbXMuaW5zdGFudCBvbmx5IGZpbmQgaW5zdGFudCB0cmFuc2FjdGlvbnMgKG11c3Qgc3BlY2lmeSBhIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgZGVzaXJlZCBudW1iZXIgb2YgdW5zcGVudHMgdG8gaGF2ZSBpbiB0aGUgd2FsbGV0IGFmdGVyIHRoZSB0eCBnb2VzIHRocm91Z2ggKHJlcXVpcmVzIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMubWluU2l6ZSBtaW5pbXVtIHVuc3BlbnQgc2l6ZSBpbiBzYXRvc2hpc1xuICogQHBhcmFtIHBhcmFtcy5zZWd3aXQgcmVxdWVzdCBzZWd3aXQgdW5zcGVudHMgKGRlZmF1bHRzIHRvIHRydWUgaWYgdW5kZWZpbmVkKVxuICogQHBhcmFtIHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCBhbGxvdyBzZWd3aXQgdW5zcGVudHMgZm9yIGxlZGdlciBkZXZpY2VzIChkZWZhdWx0cyB0byBmYWxzZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnVuc3BlbnRzUGFnZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2tpcCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSAmJiAhXy5pc051bWJlcihwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RhbnQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFyZ2V0V2FsbGV0VW5zcGVudHMgZmxhZyAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pblNpemUpICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5TaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogbWluU2l6ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdvbmx5IG9uZSBvZiBpbnN0YW50IGFuZCBtaW5Db25maXJtcyBtYXkgYmUgZGVmaW5lZCcpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldFdhbGxldFVuc3BlbnRzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgdGFyZ2V0Jyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQ6IGFsbG93TGVkZ2VyU2Vnd2l0IG11c3QgYmUgYSBib29sZWFuJyk7XG4gIH1cblxuICBjb25zdCBxdWVyeU9iamVjdCA9IF8uY2xvbmVEZWVwKHBhcmFtcyk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgLy8gc2tpcCBhbmQgbGltaXQgYXJlIHVuYXZhaWxhYmxlIHdoZW4gYSB0YXJnZXQgaXMgc3BlY2lmaWVkXG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LnNraXA7XG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LmxpbWl0O1xuICB9XG5cbiAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gdHJ1ZTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gcGFyYW1zLnNlZ3dpdDtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3QuYWxsb3dMZWRnZXJTZWd3aXQgPSBwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQ7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25zXG4vLyBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgICAgVE9ETzogIEFkZCBpdGVyYXRvcnMgZm9yIHN0YXJ0L2NvdW50L2V0Y1xuV2FsbGV0LnByb3RvdHlwZS50cmFuc2FjdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ3NraXA9JyArIHBhcmFtcy5za2lwKTtcbiAgfVxuICBpZiAocGFyYW1zLm1pbkhlaWdodCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkhlaWdodCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5IZWlnaHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtaW5IZWlnaHQ9JyArIHBhcmFtcy5taW5IZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWF4SGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4SGVpZ2h0KSB8fCBwYXJhbXMubWF4SGVpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heEhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtYXhIZWlnaHQ9JyArIHBhcmFtcy5tYXhIZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWluQ29uZmlybXMpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykgfHwgcGFyYW1zLm1pbkNvbmZpcm1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkNvbmZpcm1zPScgKyBwYXJhbXMubWluQ29uZmlybXMpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY29tcGFjdCkpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jb21wYWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvbXBhY3QgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnY29tcGFjdD0nICsgcGFyYW1zLmNvbXBhY3QpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eCcgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25cbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IElEIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvJyArIHBhcmFtcy5pZCk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcG9sbEZvclRyYW5zYWN0aW9uXG4vLyBQb2xsIGEgdHJhbnNhY3Rpb24gdW50aWwgc3VjY2Vzc2Z1bCBvciB0aW1lcyBvdXRcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGlkOiB0aGUgdHhpZFxuLy8gICBkZWxheTogZGVsYXkgYmV0d2VlbiBwb2xscyBpbiBtcyAoZGVmYXVsdDogMTAwMClcbi8vICAgdGltZW91dDogdGltZW91dCBpbiBtcyAoZGVmYXVsdDogMTAwMDApXG5XYWxsZXQucHJvdG90eXBlLnBvbGxGb3JUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHBhcmFtcy5kZWxheSAmJiAhXy5pc051bWJlcihwYXJhbXMuZGVsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRlbGF5IHBhcmFtZXRlcicpO1xuICB9XG4gIGlmIChwYXJhbXMudGltZW91dCAmJiAhXy5pc051bWJlcihwYXJhbXMudGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGltZW91dCBwYXJhbWV0ZXInKTtcbiAgfVxuICBwYXJhbXMuZGVsYXkgPSBwYXJhbXMuZGVsYXkgfHwgMTAwMDtcbiAgcGFyYW1zLnRpbWVvdXQgPSBwYXJhbXMudGltZW91dCB8fCAxMDAwMDtcblxuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgZG9OZXh0UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZlxuICAgICAgLmdldFRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0IHx8IG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnQudmFsdWVPZigpID4gcGFyYW1zLnRpbWVvdXQpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsdWViaXJkLmRlbGF5KHBhcmFtcy5kZWxheSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRvTmV4dFBvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZG9OZXh0UG9sbCgpO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0V2FsbGV0VHJhbnNhY3Rpb25CeVNlcXVlbmNlSWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvc2VxdWVuY2UvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBLZXkgY2hhaW5zXG4vLyBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbi8vIFRoZSB1c2VyIGtleSBjaGFpbiBpcyB0eXBpY2FsbHkgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIGhhcyB0aGUgZW5jcnlwdGVkIHhwcml2IHN0b3JlZCBvbiBCaXRHby5cbi8vIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuV2FsbGV0LnByb3RvdHlwZS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHRyeUtleUNoYWluID0gY28oZnVuY3Rpb24qIChpbmRleCkge1xuICAgICAgaWYgKCFzZWxmLmtleWNoYWlucyB8fCBpbmRleCA+PSBzZWxmLmtleWNoYWlucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgeHB1Yjogc2VsZi5rZXljaGFpbnNbaW5kZXhdLnhwdWIgfTtcblxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSB5aWVsZCBzZWxmLmJpdGdvLmtleWNoYWlucygpLmdldChwYXJhbXMpO1xuICAgICAgLy8gSWYgd2UgZmluZCB0aGUgeHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoID0gc2VsZi5rZXljaGFpbnNbaW5kZXhdLnBhdGg7XG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVUcmFuc2FjdGlvblxuLy8gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gKHVuc2lnbmVkKS4gVG8gc2lnbiBpdCwgZG8gc2lnblRyYW5zYWN0aW9uXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gb2JqZWN0IG9mIHJlY2lwaWVudCBhZGRyZXNzZXMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4ge2FkZHJlc3M6MTUwMCwgYWRkcmVzczI6MTUwMH1cbi8vICAgZmVlICAgICAgLSB0aGUgYmxvY2tjaGFpbiBmZWUgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIGZlZVJhdGUgIC0gdGhlIGZlZSBwZXIga2IgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIG1pbkNvbmZpcm1zIC0gbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdG8gdXNlIHdoZW4gZ2F0aGVyaW5nIHVuc3BlbnRzXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQgLSBmb3JjZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSBsYXN0IG91dHB1dCAob3B0aW9uYWwpXG4vLyAgIG5vU3BsaXRDaGFuZ2UgLSBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbi8vICAgY2hhbmdlQWRkcmVzcyAtIG92ZXJyaWRlIHRoZSBjaGFuZ2UgYWRkcmVzcyAob3B0aW9uYWwpXG4vLyAgIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIGNoYW5nZSBhZGRyZXNzZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB7IHRyYW5zYWN0aW9uSGV4OiBzdHJpbmcsIHVuc3BlbnRzOiBbaW5wdXRzXSwgZmVlOiBzYXRvc2hpcyB9KVxuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoXG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpKSB8fFxuICAgICghXy5pc1N0cmluZyhwYXJhbXMuY2hhbmdlQWRkcmVzcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmNoYW5nZUFkZHJlc3MpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLnZhbGlkYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMudmFsaWRhdGUpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMud2FsbGV0ID0gdGhpcztcblxuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgaWYgKHBhcmFtcy5wc2J0KSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeSgoKSA9PiBzaWduUHNidFJlcXVlc3QocGFyYW1zKSkubm9kZWlmeShjYWxsYmFjayk7XG4gIH1cblxuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSGV4J10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuXG4gIGlmICgoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhcGFyYW1zLmtleWNoYWluLnhwcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5zaWduaW5nS2V5KSkge1xuICAgIC8vIGFsbG93IHBhc3NpbmcgaW4gYSBXSUYgcHJpdmF0ZSBrZXkgZm9yIGxlZ2FjeSBzYWZlIHdhbGxldCBzdXBwb3J0XG4gICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGtleWNoYWluIG9iamVjdCB3aXRoIHhwcnYgb3Igc2lnbmluZ0tleSBXSUYnKTtcbiAgICBlcnJvci5jb2RlID0gJ21pc3Npbmdfa2V5Y2hhaW5fb3Jfc2lnbmluZ0tleSc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwYXJhbXMudmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcbiAgcGFyYW1zLmJpdGdvID0gdGhpcy5iaXRnbztcbiAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4OiByZXN1bHQudHJhbnNhY3Rpb25IZXgsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRcbi8vIFNlbmQgYSB0cmFuc2FjdGlvbiB0byB0aGUgQml0Y29pbiBuZXR3b3JrIHZpYSBCaXRHby5cbi8vIE9uZSBvZiB0aGUga2V5cyBpcyB0eXBpY2FsbHkgc2lnbmVkLCBhbmQgQml0R28gd2lsbCBzaWduIHRoZSBvdGhlciAoaWYgYXBwcm92ZWQpIGFuZCByZWxheSBpdCB0byB0aGUgUDJQIG5ldHdvcmsuXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB0eCAgLSB0aGUgaGV4IGVuY29kZWQsIHNpZ25lZCB0cmFuc2FjdGlvbiB0byBzZW5kXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4J10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3R4L3NlbmQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICBpZiAoYm9keS5wZW5kaW5nQXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAncGVuZGluZ0FwcHJvdmFsJyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkub3RwKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZChib2R5LCB7IHN0YXR1czogJ290cCcgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2FjY2VwdGVkJyxcbiAgICAgICAgdHg6IGJvZHkudHJhbnNhY3Rpb24sXG4gICAgICAgIGhhc2g6IGJvZHkudHJhbnNhY3Rpb25IYXNoLFxuICAgICAgICBpbnN0YW50OiBib2R5Lmluc3RhbnQsXG4gICAgICAgIGluc3RhbnRJZDogYm9keS5pbnN0YW50SWQsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTaGFyZSB0aGUgd2FsbGV0IHdpdGggYW4gZXhpc3RpbmcgQml0R28gdXNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSByZWNpcGllbnQncyB1c2VyIGlkLCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHVzZXIgcmVjb3JkIGluIG91ciBkYXRhYmFzZS5cbiAqIEBwYXJhbSB7a2V5Y2hhaW59IGtleWNoYWluIFRoZSBrZXljaGFpbiB0byBiZSBzaGFyZWQgd2l0aCB0aGUgcmVjaXBpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb25zIEEgY29tbWEtc2VwYXJhdGVkIHZhbHVlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgcmVjaXBpZW50J3MgcGVybWlzc2lvbnMgaWYgdGhlIHNoYXJlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhpcyBzaGFyZS5cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zLmtleWNoYWluLnhwdWIgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHhwdWIsIGVuY3J5cHRlZFhwcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVJbnZpdGVcbi8vIGludml0ZSBhIG5vbiBCaXRHbyBjdXN0b21lciB0byBqb2luIGEgd2FsbGV0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBlbWFpbCAtIHRoZSByZWNpcGllbnQncyBlbWFpbCBhZGRyZXNzXG4vLyAgIHBlcm1pc3Npb25zIC0gdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUludml0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICB0b0VtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgfTtcblxuICBpZiAocGFyYW1zLm1lc3NhZ2UpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ludml0ZScpKS5zZW5kKG9wdGlvbnMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXRcbi8vIGNvbmZpcm0gbXkgaW52aXRlIG9uIHRoaXMgd2FsbGV0IHRvIGEgcmVjaXBpZW50IHdobyBoYXNcbi8vIHN1YnNlcXVlbnRseSBzaWduZWQgdXAgYnkgY3JlYXRpbmcgdGhlIGFjdHVhbCB3YWxsZXQgc2hhcmVcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHdhbGxldEludml0ZUlkIC0gdGhlIHdhbGxldCBpbnZpdGUgaWRcbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHJlcXVpcmVkIGlmIHRoZSB3YWxsZXQgc2hhcmUgc3VjY2VzcyBpcyBleHBlY3RlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNvbmZpcm1JbnZpdGVBbmRTaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRJbnZpdGVJZCddLCBbJ3dhbGxldFBhc3NwaHJhc2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC53YWxsZXRzKClcbiAgICAubGlzdEludml0ZXMoKVxuICAgIC50aGVuKGZ1bmN0aW9uIChpbnZpdGVzKSB7XG4gICAgICBjb25zdCBvdXRnb2luZyA9IGludml0ZXMub3V0Z29pbmc7XG4gICAgICBjb25zdCBpbnZpdGUgPSBfLmZpbmQob3V0Z29pbmcsIGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgcmV0dXJuIG91dC5pZCA9PT0gcGFyYW1zLndhbGxldEludml0ZUlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoIWludml0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBpbnZpdGUgbm90IGZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVtYWlsOiBpbnZpdGUudG9FbWFpbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IGludml0ZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLm1lc3NhZ2UsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGYuc2hhcmVXYWxsZXQob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kQ29pbnNcbi8vIFNlbmQgY29pbnMgdG8gYSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZyb20gdGhpcyB3YWxsZXQgdXNpbmcgdGhlIHVzZXIga2V5LlxuLy8gMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHhwcml2XG4vLyAyLiBEZWNyeXB0cyB1c2VyIGtleVxuLy8gMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuLy8gNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbi8vIDMuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGFkZHJlc3MgLSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuLy8gICBhbW91bnQgLSB0aGUgYW1vdW50IGluIHNhdG9zaGlzIHRvIGJlIHNlbnRcbi8vICAgbWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRDb2lucyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gIHBhcmFtcy5yZWNpcGllbnRzW3BhcmFtcy5hZGRyZXNzXSA9IHBhcmFtcy5hbW91bnQ7XG5cbiAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kTWFueVxuLy8gU2VuZCBjb2lucyB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgZnJvbSB0aGlzIHdhbGxldCB1c2luZyB0aGUgdXNlciBrZXkuXG4vLyAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHByaXZcbi8vIDIuIERlY3J5cHRzIHVzZXIga2V5XG4vLyAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4vLyA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuLy8gMy4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgdHJhdmVsSW5mbzogb2JqZWN0IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kTWFueSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpbnN0YW50IC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICB9XG5cbiAgbGV0IGJpdGdvRmVlO1xuICBsZXQgdHJhdmVsSW5mb3M7XG4gIGxldCBmaW5hbFJlc3VsdDtcbiAgbGV0IHVuc3BlbnRzVXNlZDtcblxuICBjb25zdCBhY2NlcHRlZEJ1aWxkUGFyYW1zID0gW1xuICAgICdudW1CbG9ja3MnLFxuICAgICdmZWVSYXRlJyxcbiAgICAnbWluQ29uZmlybXMnLFxuICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICd0YXJnZXRXYWxsZXRVbnNwZW50cycsXG4gICAgJ21lc3NhZ2UnLFxuICAgICdtaW5WYWx1ZScsXG4gICAgJ21heFZhbHVlJyxcbiAgICAnbm9TcGxpdENoYW5nZScsXG4gICAgJ2NvbW1lbnQnLFxuICBdO1xuICBjb25zdCBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIGFjY2VwdGVkQnVpbGRQYXJhbXMpO1xuXG4gIC8vIEdldCB0aGUgdXNlciBrZXljaGFpblxuICBjb25zdCByZXRQcm9taXNlID0gdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgICAgLy8gU2VuZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIGJpdGdvRmVlID0gdHJhbnNhY3Rpb24uYml0Z29GZWU7XG4gICAgICB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgICAgdW5zcGVudHNVc2VkID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG4gICAgICByZXR1cm4gc2VsZi5zZW5kVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eDogdHJhbnNhY3Rpb24udHgsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICAgIG90cDogcGFyYW1zLm90cCxcbiAgICAgICAgLy8gVGhlIGJlbG93IHBhcmFtcyBhcmUgZm9yIGxvZ2dpbmcgb25seSwgYW5kIGRvIG5vdCBpbXBhY3QgdGhlIEFQSSBjYWxsXG4gICAgICAgIGVzdGltYXRlZFNpemU6IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemUsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChyZXN1bHQudHgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICBjb25zdCBpbnB1dHNTdW0gPSBfLnN1bUJ5KHVuc3BlbnRzVXNlZCwgJ3ZhbHVlJyk7XG4gICAgICBjb25zdCBvdXRwdXRzU3VtID0gXy5zdW1CeSh0eC5vdXRzLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IGZlZVVzZWQgPSBpbnB1dHNTdW0gLSBvdXRwdXRzU3VtO1xuICAgICAgaWYgKGlzTmFOKGZlZVVzZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVVc2VkJyk7XG4gICAgICB9XG4gICAgICAocmVzdWx0LmZlZSA9IGZlZVVzZWQpLCAocmVzdWx0LmZlZVJhdGUgPSAoZmVlVXNlZCAqIDEwMDApIC8gdHgudmlydHVhbFNpemUoKSk7XG4gICAgICByZXN1bHQudHJhdmVsSW5mb3MgPSB0cmF2ZWxJbmZvcztcbiAgICAgIGlmIChiaXRnb0ZlZSkge1xuICAgICAgICByZXN1bHQuYml0Z29GZWUgPSBiaXRnb0ZlZTtcbiAgICAgIH1cbiAgICAgIGZpbmFsUmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAvLyBIYW5kbGUgc2VuZGluZyB0cmF2ZWwgaW5mb3MgaWYgdGhleSBleGlzdCwgYnV0IG1ha2Ugc3VyZSB3ZSBuZXZlciBmYWlsIGhlcmUuXG4gICAgICAvLyBFcnJvciBvciByZXN1bHQgKHdpdGggcG9zc2libGUgc3ViLWVycm9ycykgd2lsbCBiZSBwcm92aWRlZCBpbiB0cmF2ZWxSZXN1bHRcbiAgICAgIGlmICh0cmF2ZWxJbmZvcyAmJiB0cmF2ZWxJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gc2VsZlxuICAgICAgICAgICAgLnBvbGxGb3JUcmFuc2FjdGlvbih7IGlkOiByZXN1bHQuaGFzaCB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5iaXRnby50cmF2ZWxSdWxlKCkuc2VuZE1hbnkocmVzdWx0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHJlcztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAvLyBjYXRjaCBhc3luYyBlcnJvcnNcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0geyBlcnJvcjogZXJyLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBjYXRjaCBzeW5jaHJvbm91cyBlcnJvcnNcbiAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluYWxSZXN1bHQ7XG4gICAgfSk7XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHJldFByb21pc2UpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBBY2NlbGVyYXRlIGEgc3R1Y2sgdHJhbnNhY3Rpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKS5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHN0dWNrIHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIG5vIHVuY29uZmlybWVkIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gSW5wdXQgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50cmFuc2FjdGlvbklEIC0gSUQgb2YgdHJhbnNhY3Rpb24gdG8gYWNjZWxlcmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gTmV3IGVmZmVjdGl2ZSBmZWUgcmF0ZSBmb3Igc3R1Y2sgdHJhbnNhY3Rpb24gKHNhdCBwZXIgMTAwMCBieXRlcylcbiAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIC0gTWF4aW11bSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSBmcm9tIHRoZSB3YWxsZXQgdG8gY292ZXIgYW55IGNoaWxkIGZlZXMgdGhhdCB0aGUgcGFyZW50IHVuc3BlbnQgb3V0cHV0IGNhbm5vdCBjb3Zlci4gRGVmYXVsdHMgdG8gMTAwLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2Ugd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgd2FsbGV0IHByaXZhdGUga2V5LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIFRoZSBwcml2YXRlIGtleSBmb3IgdGhlIHdhbGxldC4gT25lIG9mIGVpdGhlciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgaXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMgUmVzdWx0IG9mIHNlbmRUcmFuc2FjdGlvbigpIG9uIHRoZSBjaGlsZCB0cmFuc2FjdGlvblxuICovXG5XYWxsZXQucHJvdG90eXBlLmFjY2VsZXJhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIGFjY2VsZXJhdGVUcmFuc2FjdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVzdGltYXRlIGEgdHJhbnNhY3Rpb25zIHNpemUgaW4gdmlydHVhbCBieXRlcy5cbiAgICogQWN0dWFsIHRyYW5zYWN0aW9ucyBtYXkgYmUgc2xpZ2h0bHkgZmV3ZXIgdmlydHVhbCBieXRlcywgZHVlIHRvXG4gICAqIHRoZSBmYWN0IHRoYXQgdmFsaWQgRUNTREEgc2lnbmF0dXJlcyBoYXZlIGEgdmFyaWFibGUgbGVuZ3RoXG4gICAqIGJldHdlZW4gOCBhbmQgNzMgdmlydHVhbCBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cy5zZWd3aXQgVGhlIG51bWJlciBvZiBzZWd3aXQgaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyU0ggVGhlIG51bWJlciBvZiBQMlNIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cy5QMlBLSCBUaGUgbnVtYmVyIG9mIFAyUEtIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNvbnN0IGVzdGltYXRlVHhWU2l6ZSA9IChpbnB1dHMpID0+IHtcbiAgICBjb25zdCBzZWd3aXQgPSBpbnB1dHMuc2Vnd2l0IHx8IDA7XG4gICAgY29uc3QgUDJTSCA9IGlucHV0cy5QMlNIIHx8IDA7XG4gICAgY29uc3QgUDJQS0ggPSBpbnB1dHMuUDJQS0ggfHwgMDtcblxuICAgIGNvbnN0IGNoaWxkRmVlSW5mbyA9IFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8oe1xuICAgICAgblAyc2hJbnB1dHM6IFAyU0gsXG4gICAgICBuUDJwa2hJbnB1dHM6IFAyUEtILFxuICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0LFxuICAgICAgbk91dHB1dHM6IDEsXG4gICAgICBmZWVSYXRlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoaWxkRmVlSW5mby5zaXplO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGF0IHNob3VsZCBiZSBwYWlkIGluIGZlZXMgYnkgdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXRzIHRvIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiB3aGljaCBhcmUgcGFzc2VkIHRvIGVzdGltYXRlVHhWU2l6ZVxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIGZlZVJhdGUgVGhlIG5ldyBmZWUgcmF0ZSB3aGljaCBzaG91bGQgYmUgcGFpZCBieSB0aGUgY29tYmluZWQgQ1BGUCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBjaGlsZCB0eCBzaG91bGQgcGF5IGluIGZlZXNcbiAgICovXG4gIGNvbnN0IGVzdGltYXRlQ2hpbGRGZWUgPSAoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGUgfSkgPT4ge1xuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBtb3JlIHdlICpzaG91bGQqIGhhdmUgcGFpZCBpbiBwYXJlbnQgZmVlcyxcbiAgICAvLyBoYWQgdGhlIHBhcmVudCBiZWVuIG9yaWdpbmFsbHkgc2VudCB3aXRoIHRoZSBuZXcgZmVlIHJhdGVcbiAgICBjb25zdCBhZGRpdGlvbmFsUGFyZW50RmVlID0gXy5jZWlsKChwYXJlbnRWU2l6ZSAqIGZlZVJhdGUpIC8gMTAwMCkgLSBwYXJlbnRGZWU7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggd2Ugd291bGQgcGF5IGluIGZlZXMgZm9yIHRoZSBjaGlsZCxcbiAgICAvLyBpZiBpdCB3ZXJlIG9ubHkgcGF5aW5nIGZvciBpdHNlbGYgYXQgdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGNoaWxkRmVlID0gKGVzdGltYXRlVHhWU2l6ZShpbnB1dHMpICogZmVlUmF0ZSkgLyAxMDAwO1xuXG4gICAgcmV0dXJuIF8uY2VpbChjaGlsZEZlZSArIGFkZGl0aW9uYWxQYXJlbnRGZWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSB0byBwYXkgdGhlIGNoaWxkIHR4IGZlZXMuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRoZSBwYXJlbnQgdHggb3V0cHV0IGlzIG5vdCBzdWZmaWNpZW50IHRvXG4gICAqIGNvdmVyIHRoZSB0b3RhbCBmZWVzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjaGlsZCB0eC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRPdXRwdXRWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggd2UgYXJlIHVzaW5nIGFzIGFuIGlucHV0IHRvIHRoZSBjaGlsZCB0eFxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIG1heFVuc3BlbnRzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRpdGlvbmFsIHVuc3BlbnRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlc1xuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UsIHRoZSB1cGRhdGVkIG51bWJlciBvZiBzYXRvc2hpcyB3aGljaCBzaG91bGQgYmUgcGFpZCBieVxuICAgKiAgICAgICAgICB0aGUgY2hpbGQgdHgsIGFuZCB0aGUgdXBkYXRlZCBpbnB1dHMgZm9yIHRoZSBjaGlsZCB0eC5cbiAgICovXG4gIGNvbnN0IGZpbmRBZGRpdGlvbmFsVW5zcGVudHMgPSAoeyBpbnB1dHMsIHBhcmVudE91dHB1dFZhbHVlLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBtYXhVbnNwZW50cyB9KSA9PiB7XG4gICAgcmV0dXJuIGNvKGZ1bmN0aW9uKiBjb0ZpbmRBZGRpdGlvbmFsVW5zcGVudHMoKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsVW5zcGVudHM6IGFueVtdID0gW107XG5cbiAgICAgIC8vIGFzayB0aGUgc2VydmVyIGZvciBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIGNoaWxkIGZlZSwgYXNzdW1pbmdcbiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGRvbmUgd2l0aG91dCBhZGRpdGlvbmFsIHVuc3BlbnRzICh3aGljaCBpcyBub3QgcG9zc2libGUsXG4gICAgICAvLyBzaW5jZSBpZiB0aGF0IHdlcmUgdGhlIGNhc2UsIGZpbmRBZGRpdGlvbmFsVW5zcGVudHMgd291bGQgbm90IGhhdmUgYmVlblxuICAgICAgLy8gY2FsbGVkIGluIHRoZSBmaXJzdCBwbGFjZS4gVGhpcyB3aWxsIGJlIGNvcnJlY3RlZCBiZWZvcmUgcmV0dXJuaW5nKVxuICAgICAgbGV0IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlID0gZXN0aW1hdGVDaGlsZEZlZSh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUgfSk7XG4gICAgICBsZXQgdW5jb3ZlcmVkQ2hpbGRGZWUgPSBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSAtIHBhcmVudE91dHB1dFZhbHVlO1xuXG4gICAgICB3aGlsZSAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwICYmIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGggPCBtYXhVbnNwZW50cykge1xuICAgICAgICAvLyB0cnkgdG8gZ2V0IGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgcmVzdCBvZiB0aGUgY2hpbGQgZmVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICAgIGNvbnN0IHVuc3BlbnRzID0gKHlpZWxkIHRoaXMudW5zcGVudHMoe1xuICAgICAgICAgIG1pbkNvbmZpcm1zOiAxLFxuICAgICAgICAgIHRhcmdldDogdW5jb3ZlcmVkQ2hpbGRGZWUsXG4gICAgICAgICAgbGltaXQ6IG1heFVuc3BlbnRzIC0gYWRkaXRpb25hbFVuc3BlbnRzLmxlbmd0aCxcbiAgICAgICAgfSkpIGFzIGFueTtcblxuICAgICAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gbm8gbW9yZSB1bnNwZW50cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSA9IDA7XG5cbiAgICAgICAgLy8gY29uc3VtZSBhbGwgdW5zcGVudHMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciwgZXZlbiBpZiB3ZSBkb24ndCBuZWVkXG4gICAgICAgIC8vIGFsbCBvZiB0aGVtIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgc2VydmVyIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIGVub3VnaCB1bnNwZW50IHZhbHVlIHRvIGVuc3VyZSB0aGF0IHRoZSBtaW5pbXVtIGNoYW5nZSBhbW91bnRcbiAgICAgICAgLy8gaXMgYWNoaWV2ZWQgZm9yIHRoZSBjaGlsZCB0eCwgYW5kIHdlIGNhbid0IGxlYXZlIG91dCB0aG9zZSB1bnNwZW50c1xuICAgICAgICAvLyBvciBlbHNlIHRoZSBtaW5pbXVtIGNoYW5nZSBhbW91bnQgY29uc3RyYWludCBjb3VsZCBiZSB2aW9sYXRlZFxuICAgICAgICBfLmZvckVhY2godW5zcGVudHMsICh1bnNwZW50KSA9PiB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBjaGlsZCB0eCBpbnB1dHNcbiAgICAgICAgICBjb25zdCB1bnNwZW50Q2hhaW4gPSBnZXRDaGFpbih1bnNwZW50KTtcbiAgICAgICAgICBpZiAoaXNDaGFpbkNvZGUodW5zcGVudENoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudENoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgICAgICAgIGlucHV0cy5zZWd3aXQrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRzLlAyU0grKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRpdGlvbmFsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgICAgICBhZGRpdGlvbmFsVW5zcGVudFZhbHVlICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlID0gZXN0aW1hdGVDaGlsZEZlZSh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUgfSk7XG4gICAgICAgIHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZSAtIGFkZGl0aW9uYWxVbnNwZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmNvdmVyZWRDaGlsZEZlZSA+IDApIHtcbiAgICAgICAgLy8gVW5hYmxlIHRvIGZpbmQgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN1ZmZpY2llbnQgY29uZmlybWVkIHVuc3BlbnRzIGF2YWlsYWJsZSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvdW5kIGVub3VnaCB1bnNwZW50c1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkaXRpb25hbDogYWRkaXRpb25hbFVuc3BlbnRzLFxuICAgICAgICBuZXdDaGlsZEZlZTogY3VycmVudENoaWxkRmVlRXN0aW1hdGUsXG4gICAgICAgIG5ld0lucHV0czogaW5wdXRzLFxuICAgICAgfTtcbiAgICB9KS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgZnVsbCBjb3B5IChpbmNsdWRpbmcgd2l0bmVzcyBkYXRhKSBvZiBhbiBhcmJpdHJhcnkgdHggdXNpbmcgb25seSB0aGUgdHggaWQuXG4gICAqXG4gICAqIFdlIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIHNlcnZpY2UgZm9yIHRoaXMgKGN1cnJlbnRseSBibG9ja3N0cmVhbS5pbmZvKSwgc2luY2VcbiAgICogdGhlIHYxIGluZGV4ZXIgc2VydmljZSAoYmFzZWQgb24gYml0Y29pbmopIGRvZXMgbm90IGhhdmUgc2Vnd2l0IHN1cHBvcnQgYW5kXG4gICAqIGRvZXMgbm90IHJldHVybiBhbnkgc2Vnd2l0IHJlbGF0ZWQgZmllbGRzIGluIHRoZSB0eCBoZXguXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRUeElkIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZ2V0IHRoZSBmdWxsIGhleCBvZlxuICAgKiBAcmV0dXJucyB7Qmx1ZWJpcmQ8YW55Pn0gVGhlIGZ1bGwgaGV4IGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQgfTogeyBwYXJlbnRUeElkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhwbG9yZXJCYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tzZWxmLmJpdGdvLmdldEVudigpXS5idGNFeHBsb3JlckJhc2VVcmw7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5nZXQoYCR7ZXhwbG9yZXJCYXNlVXJsfS90eC8ke3BhcmVudFR4SWR9L2hleGApO1xuXG4gICAgaWYgKCFyZXN1bHQudGV4dCB8fCAhLyhbYS1mMC05XXsyfSkrLy50ZXN0KHJlc3VsdC50ZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZSBwYXJlbnQgdHggaGV4LiBSZWNlaXZlZCAnJHtfLnRydW5jYXRlKHJlc3VsdC50ZXh0LCB7IGxlbmd0aDogMTAwIH0pfScgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjaGFpbiBmcm9tIGFuIHVuc3BlbnQgb3IgdHggb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0T3JVbnNwZW50IFRoZSBvdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBjaGFpbiBzaG91bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2hhaW4gZm9yIHRoZSBnaXZlbiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKi9cbiAgY29uc3QgZ2V0Q2hhaW4gPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgaWYgKG91dHB1dE9yVW5zcGVudC5jaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LmNoYWluO1xuICAgIH1cblxuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfLnRvTnVtYmVyKG91dHB1dE9yVW5zcGVudC5jaGFpblBhdGguc3BsaXQoJy8nKVsxXSk7XG4gICAgfVxuXG4gICAgLy8gbm8gd2F5IHRvIHRlbGwgdGhlIGNoYWluLCBsZXQncyBqdXN0IGJsb3cgdXAgbm93IGluc3RlYWRcbiAgICAvLyBvZiBibG93aW5nIHVwIGxhdGVyIHdoZW4gdGhlIHVuZGVmaW5lZCByZXR1cm4gdmFsdWUgaXMgdXNlZC5cbiAgICAvLyBOb3RlOiBmb3IgdW5zcGVudHMgdGhlIGZpZWxkIHRvIHVzZSBpcyAnYWRkcmVzcycsIGJ1dCBmb3Igb3V0cHV0c1xuICAgIC8vIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FjY291bnQnXG4gICAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBnZXQgY2hhaW4gZm9yIG91dHB1dCBvbiBhY2NvdW50ICR7b3V0cHV0T3JVbnNwZW50LmFjY291bnQgfHwgb3V0cHV0T3JVbnNwZW50LmFkZHJlc3N9YCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCB2YWx1ZSBjb250cmlidXRpb24gYW4gb3V0cHV0IG9yIHVuc3BlbnQgd2lsbFxuICAgKiBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC4gRWFjaCB0eXBlIG9mIG91dHB1dCBvciB1bnNwZW50XG4gICAqIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBjb250cmlidXRpb24gc2luY2UgZWFjaCB0eXBlIGhhcyBhIGRpZmZlcmVudCBudW1iZXJcbiAgICogb2YgdmlydHVhbCBieXRlcywgYW5kIHRodXMgd2lsbCBjYXVzZSBhIGRpZmZlcmVudCBmZWUgdG8gYmUgcGFpZC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBPdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBlZmZlY3RpdmUgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGFjdHVhbCBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCB0aGlzIHVuc3BlbnQgb3Igb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gYSB0cmFuc2FjdGlvbiwgd2VyZSBpdCB0byBiZSB1c2VkLlxuICAgKi9cbiAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgY29uc3QgY2hhaW4gPSBnZXRDaGFpbihvdXRwdXRPclVuc3BlbnQpO1xuICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSBpcyBpbiBieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGtCXG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gICAgfVxuICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQudmFsdWUgLSAoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvcm91dGluZSB3aGljaCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBhY2NlbGVyYXRlVHJhbnNhY3Rpb24gYWxnb3JpdGhtXG4gICAqXG4gICAqIERlc2NyaWJlZCBhdCBhIGhpZ2ggbGV2ZWwsIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAgICogMSkgRmluZCBhcHByb3ByaWF0ZSBvdXRwdXQgZnJvbSBwYXJlbnQgdHJhbnNhY3Rpb24gdG8gdXNlIGFzIGNoaWxkIHRyYW5zYWN0aW9uIGlucHV0XG4gICAqIDIpIEZpbmQgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXQuIElmIG5vdCBmb3VuZCwgcmV0dXJuIHRvIHN0ZXAgMS5cbiAgICogMykgRGV0ZXJtaW5lIGlmIHBhcmVudCB0cmFuc2FjdGlvbiB1bnNwZW50IGNhbiBjb3ZlciBlbnRpcmUgY2hpbGQgZmVlLCBwbHVzIG1pbmltdW0gY2hhbmdlXG4gICAqIDQpIElmIHllcywgZ28gdG8gc3RlcCA2XG4gICAqIDUpIE90aGVyd2lzZSwgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIGZyb20gdGhlIHdhbGxldCB0byB1c2UgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVcbiAgICogNikgQ3JlYXRlIGFuZCBzaWduIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiwgdXNpbmcgdGhlIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXRcbiAgICogICAgKGFuZCwgaWYgbmVjZXNzYXJ5LCBhZGRpdGlvbmFsIHdhbGxldCB1bnNwZW50cykgYXMgaW5wdXRzXG4gICAqIDcpIEJyb2FkY2FzdCB0aGUgbmV3IGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqL1xuICByZXR1cm4gY28oZnVuY3Rpb24qIGNvQWNjZWxlcmF0ZVRyYW5zYWN0aW9uKCk6IGFueSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25JRCddLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgLy8gdmFsaWRhdGUgZmVlIHJhdGVcbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNGaW5pdGUocGFyYW1zLmZlZVJhdGUpIHx8IHBhcmFtcy5mZWVSYXRlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgZm9yIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1heFVuc3BlbnRzXG4gICAgaWYgKHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYnkgZGVmYXVsdCwgdXNlIGF0IG1vc3QgMTAwIGFkZGl0aW9uYWwgdW5zcGVudHMgKG5vdCBpbmNsdWRpbmcgdGhlIHVuc3BlbnQgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eClcbiAgICAgIHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPSAxMDA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzKSB8fCBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdFeHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlciBmb3IgcGFyYW1ldGVyOiBtYXhBZGRpdGlvbmFsVW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHBhcmVudFR4ID0geWllbGQgdGhpcy5nZXRUcmFuc2FjdGlvbih7IGlkOiBwYXJhbXMudHJhbnNhY3Rpb25JRCB9KTtcbiAgICBpZiAocGFyZW50VHguY29uZmlybWF0aW9ucyA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtwYXJhbXMudHJhbnNhY3Rpb25JRH0gaXMgYWxyZWFkeSBjb25maXJtZWQgYW5kIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgb3V0cHV0cyBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggYXJlIHRvIG91ciB3YWxsZXRcbiAgICBjb25zdCB3YWxsZXRPdXRwdXRzID0gXy5maWx0ZXIocGFyZW50VHgub3V0cHV0cywgKG91dHB1dCkgPT4gb3V0cHV0LmlzTWluZSk7XG5cbiAgICBpZiAod2FsbGV0T3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGNvbnRhaW5zIG5vIG91dHB1dHMgdG8gdGhpcyB3YWxsZXQsIGFuZCB0aHVzIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGFuIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgd2l0aCBsYXJnZXN0IGVmZmVjdGl2ZSB2YWx1ZSxcbiAgICAvLyBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgdW5zcGVudC5cbiAgICAvLyBBbiBvdXRwdXQgY291bGQgYmUgc3BlbnQgYWxyZWFkeSBpZiB0aGUgb3V0cHV0IHdhcyB1c2VkIGluIGFcbiAgICAvLyBjaGlsZCB0eCB3aGljaCBpdHNlbGYgaGFzIGJlY29tZSBzdHVjayBkdWUgdG8gbG93IGZlZXMgYW5kIGlzXG4gICAgLy8gYWxzbyB1bmNvbmZpcm1lZC5cbiAgICBjb25zdCBzb3J0ZWRPdXRwdXRzID0gXy5zb3J0Qnkod2FsbGV0T3V0cHV0cywgZWZmZWN0aXZlVmFsdWUpO1xuICAgIGxldCBwYXJlbnRVbnNwZW50VG9Vc2U7XG4gICAgbGV0IG91dHB1dFRvVXNlO1xuXG4gICAgd2hpbGUgKHNvcnRlZE91dHB1dHMubGVuZ3RoID4gMCAmJiBwYXJlbnRVbnNwZW50VG9Vc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0cHV0VG9Vc2UgPSBzb3J0ZWRPdXRwdXRzLnBvcCgpO1xuXG4gICAgICAvLyBmaW5kIHRoZSB1bnNwZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIG91dHB1dFxuICAgICAgLy8gVE9ETzogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzIHVuc3BlbnQ/XG4gICAgICAvLyBUT0RPOiBUaGUgYmVzdCB3ZSBjYW4gZG8gaGVyZSBpcyBzZXQgbWluU2l6ZSA9IG1heFNpemUgPSBvdXRwdXRUb1VzZS52YWx1ZVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHVuc3BlbnRzUmVzdWx0ID0geWllbGQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgIG1pblNpemU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBtYXhTaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJlbnRVbnNwZW50VG9Vc2UgPSBfLmZpbmQodW5zcGVudHNSZXN1bHQsICh1bnNwZW50KSA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIHR4aWRcbiAgICAgICAgaWYgKHVuc3BlbnQudHhfaGFzaCAhPT0gcGFyYW1zLnRyYW5zYWN0aW9uSUQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBzdXJlIHVuc3BlbnQgaGFzIGNvcnJlY3Qgdl9vdXQgaW5kZXhcbiAgICAgICAgcmV0dXJuIHVuc3BlbnQudHhfb3V0cHV0X24gPT09IG91dHB1dFRvVXNlLnZvdXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdW5zcGVudCBvdXRwdXQgZnJvbSBwYXJlbnQgdHggdG8gdXNlIGFzIGNoaWxkIGlucHV0YCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBmdWxsIGhleCBmb3IgdGhlIHBhcmVudCB0eCBhbmQgZGVjb2RlIGl0IHRvIGdldCBpdHMgdnNpemVcbiAgICBjb25zdCBwYXJlbnRUeEhleCA9IHlpZWxkIGdldFBhcmVudFR4SGV4KHsgcGFyZW50VHhJZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgY29uc3QgZGVjb2RlZFBhcmVudCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHBhcmVudFR4SGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGNvbnN0IHBhcmVudFZTaXplID0gZGVjb2RlZFBhcmVudC52aXJ0dWFsU2l6ZSgpO1xuXG4gICAgLy8gbWFrZSBzdXJlIGlkIGZyb20gZGVjb2RlZCB0eCBhbmQgZ2l2ZW4gdHggaWQgbWF0Y2hcbiAgICAvLyB0aGlzIHNob3VsZCBjYXRjaCBwcm9ibGVtcyBlbWFuYXRpbmcgZnJvbSB0aGUgdXNlIG9mIGFuIGV4dGVybmFsIHNlcnZpY2VcbiAgICAvLyBmb3IgZ2V0dGluZyB0aGUgY29tcGxldGUgcGFyZW50IHR4IGhleFxuICAgIGlmIChkZWNvZGVkUGFyZW50LmdldElkKCkgIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWNvZGVkIHRyYW5zYWN0aW9uIGlkIGlzICR7ZGVjb2RlZFBhcmVudC5nZXRJZCgpfSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gdHhpZCAke3BhcmFtcy50cmFuc2FjdGlvbklEfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIG5ldyBmZWUgcmF0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHBhcmVudCdzIGN1cnJlbnQgZmVlIHJhdGVcbiAgICAvLyB2aXJ0dWFsU2l6ZSBpcyByZXR1cm5lZCBpbiB2Ynl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrdkJcbiAgICBjb25zdCBwYXJlbnRSYXRlID0gKDEwMDAgKiBwYXJlbnRUeC5mZWUpIC8gcGFyZW50VlNpemU7XG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlIDw9IHBhcmVudFJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBsb3dlciBmZWUgcmF0ZSEgKFBhcmVudCB0eCBmZWUgcmF0ZSBpcyAke3BhcmVudFJhdGV9IHNhdC9rQiwgYW5kIHJlcXVlc3RlZCBmZWUgcmF0ZSB3YXMgJHtwYXJhbXMuZmVlUmF0ZX0gc2F0L2tCKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHBhcmVudCBvdXRwdXQgY2FuIGNvdmVyIGNoaWxkIGZlZVxuICAgIGNvbnN0IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID1cbiAgICAgIGlzQ2hhaW5Db2RlKG91dHB1dFRvVXNlLmNoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4ob3V0cHV0VG9Vc2UuY2hhaW4pID09PSAncDJzaFAyd3NoJztcblxuICAgIGxldCBjaGlsZElucHV0cyA9IHtcbiAgICAgIHNlZ3dpdDogaXNQYXJlbnRPdXRwdXRTZWd3aXQgPyAxIDogMCxcbiAgICAgIFAyU0g6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMCA6IDEsXG4gICAgfTtcblxuICAgIGxldCBjaGlsZEZlZSA9IGVzdGltYXRlQ2hpbGRGZWUoe1xuICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUsXG4gICAgICBwYXJlbnRWU2l6ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc3BlbnRzVG9Vc2UgPSBbcGFyZW50VW5zcGVudFRvVXNlXTtcblxuICAgIC8vIHRyeSB0byBnZXQgdGhlIG1pbiBjaGFuZ2Ugc2l6ZSBmcm9tIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDAuMSBCVENcbiAgICAvLyBUT0RPOiBtaW5DaGFuZ2VTaXplIGlzIG5vdCBjdXJyZW50bHkgYSBjb25zdGFudCBkZWZpbmVkIG9uIHRoZSBjbGllbnQgYW5kIHNob3VsZCBiZSBhZGRlZFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgbWluQ2hhbmdlU2l6ZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluQ2hhbmdlU2l6ZSB8fCAxZTc7XG5cbiAgICBpZiAob3V0cHV0VG9Vc2UudmFsdWUgPCBjaGlsZEZlZSArIG1pbkNoYW5nZVNpemUpIHtcbiAgICAgIC8vIHBhcmVudCBvdXRwdXQgY2Fubm90IGNvdmVyIGNoaWxkIGZlZSBwbHVzIHRoZSBtaW5pbXVtIGNoYW5nZSxcbiAgICAgIC8vIG11c3QgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBkaWZmZXJlbmNlXG4gICAgICBjb25zdCB7IGFkZGl0aW9uYWwsIG5ld0NoaWxkRmVlLCBuZXdJbnB1dHMgfSA9IHlpZWxkIGZpbmRBZGRpdGlvbmFsVW5zcGVudHMoe1xuICAgICAgICBpbnB1dHM6IGNoaWxkSW5wdXRzLFxuICAgICAgICBwYXJlbnRPdXRwdXRWYWx1ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgICBtYXhVbnNwZW50czogcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgcGFyZW50VlNpemUsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkRmVlID0gbmV3Q2hpbGRGZWU7XG4gICAgICBjaGlsZElucHV0cyA9IG5ld0lucHV0cztcbiAgICAgIHVuc3BlbnRzVG9Vc2UucHVzaCguLi5hZGRpdGlvbmFsKTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdHkgY2hlY2sgdGhlIGZlZSByYXRlIHdlJ3JlIHBheWluZyBmb3IgdGhlIGNvbWJpbmVkIHR4XG4gICAgLy8gdG8gbWFrZSBzdXJlIGl0J3MgdW5kZXIgdGhlIG1heCBmZWUgcmF0ZS4gT25seSB0aGUgY2hpbGQgdHhcbiAgICAvLyBjYW4gYnJlYWsgdGhpcyBsaW1pdCwgYnV0IHRoZSBjb21iaW5lZCB0eCBzaGFsbCBub3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1heEZlZVJhdGUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1heEZlZVJhdGU7XG4gICAgY29uc3QgY2hpbGRWU2l6ZSA9IGVzdGltYXRlVHhWU2l6ZShjaGlsZElucHV0cyk7XG4gICAgY29uc3QgY29tYmluZWRWU2l6ZSA9IGNoaWxkVlNpemUgKyBwYXJlbnRWU2l6ZTtcbiAgICBjb25zdCBjb21iaW5lZEZlZSA9IHBhcmVudFR4LmZlZSArIGNoaWxkRmVlO1xuICAgIC8vIGNvbWJpbmVkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjb21iaW5lZEZlZVJhdGUgPSAoMTAwMCAqIGNvbWJpbmVkRmVlKSAvIGNvbWJpbmVkVlNpemU7XG5cbiAgICBpZiAoY29tYmluZWRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gY2Fubm90IGJlIGFjY2VsZXJhdGVkLiBDb21iaW5lZCBmZWUgcmF0ZSBvZiAke2NvbWJpbmVkRmVlUmF0ZX0gc2F0L2tCIGV4Y2VlZHMgbWF4aW11bSBmZWUgcmF0ZSBvZiAke21heEZlZVJhdGV9IHNhdC9rQmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgbmV3IGNoYW5nZSBhZGRyZXNzIGFuZCBkZXRlcm1pbmUgY2hhbmdlIGFtb3VudC5cbiAgICAvLyB0aGUgdHggYnVpbGRlciB3aWxsIHJlamVjdCB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyByZWNpcGllbnRzLFxuICAgIC8vIGFuZCBzdWNoIHplcm8tb3V0cHV0IHRyYW5zYWN0aW9ucyBhcmUgZm9yYmlkZGVuIGJ5IHRoZSBCaXRjb2luIHByb3RvY29sLFxuICAgIC8vIHNvIHdlIG5lZWQgYXQgbGVhc3QgYSBzaW5nbGUgcmVjaXBpZW50IGZvciB0aGUgY2hhbmdlIHdoaWNoIHdvbid0IGJlIHBydW5lZC5cbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBfLnN1bUJ5KHVuc3BlbnRzVG9Vc2UsICh1bnNwZW50KSA9PiB1bnNwZW50LnZhbHVlKSAtIGNoaWxkRmVlO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSB0aGlzLmdldENoYW5nZUNoYWluKHt9KTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSB5aWVsZCB0aGlzLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4gfSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGNoaWxkIHR4IGFuZCBicm9hZGNhc3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHR4ID0geWllbGQgdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdW5zcGVudHM6IHVuc3BlbnRzVG9Vc2UsXG4gICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmVlOiBjaGlsZEZlZSxcbiAgICAgIGJpdGdvRmVlOiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICB9LFxuICAgICAgeHBydjogcGFyYW1zLnhwcnYsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIC8vIGNoaWxkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjaGlsZEZlZVJhdGUgPSAoMTAwMCAqIGNoaWxkRmVlKSAvIGNoaWxkVlNpemU7XG4gICAgaWYgKGNoaWxkRmVlUmF0ZSA+IG1heEZlZVJhdGUpIHtcbiAgICAgIC8vIGNvbWJpbmVkIHR4IGlzIHdpdGhpbiBtYXggZmVlIHJhdGUgbGltaXRzLCBidXQgdGhlIGNoaWxkIHR4IGlzIG5vdC5cbiAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byB1c2UgdGhlIGlnbm9yZU1heEZlZVJhdGUgZmxhZyB0byBnZXQgdGhlIGNoaWxkIHR4IHRvIGJlIGFjY2VwdGVkXG4gICAgICB0eC5pZ25vcmVNYXhGZWVSYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbih0eCk7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uXG4vLyBJTlRFUk5BTCBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHNpZ24gYSB0cmFuc2FjdGlvblxuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBhcnJheSBvZiB7IGFkZHJlc3MsIGFtb3VudCB9IHRvIHNlbmQgdG9cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZHluYW1pY0ZlZUNvbmZpcm1UYXJnZXQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBjb25maXJtVGFyZ2V0IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaW5zdGFudCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKHlpZWxkIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuICAgIGNvbnN0IGZlZSA9IHRyYW5zYWN0aW9uLmZlZTtcbiAgICBjb25zdCBmZWVSYXRlID0gdHJhbnNhY3Rpb24uZmVlUmF0ZTtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZTtcbiAgICBjb25zdCBiaXRnb0ZlZSA9IHRyYW5zYWN0aW9uLmJpdGdvRmVlO1xuICAgIGNvbnN0IHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgY29uc3QgdW5zcGVudHMgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcblxuICAgIC8vIFNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCBrZXljaGFpbiA9IHlpZWxkIHRoaXMuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbihwYXJhbXMpO1xuICAgICAgdHJhbnNhY3Rpb24ua2V5Y2hhaW4gPSBrZXljaGFpbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSAnbm9fZW5jcnlwdGVkX2tleWNoYWluX29uX3dhbGxldCcpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBzYWZlIHdhbGxldCwgc28gbGV0J3MgcmV0cmlldmUgdGhlIHByaXZhdGUga2V5IGluZm9cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICB5aWVsZCB0aGlzLnJlZnJlc2goeyBncGs6IHRydWUgfSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qgc2FmZVVzZXJLZXkgPSBfLmdldCh0aGlzLndhbGxldCwgJ3ByaXZhdGUudXNlclByaXZLZXknKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHNhZmVVc2VyS2V5KSAmJiBfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICB0cmFuc2FjdGlvbi5zaWduaW5nS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogc2FmZVVzZXJLZXkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmZlZVNpbmdsZUtleVdJRiA9IHBhcmFtcy5mZWVTaW5nbGVLZXlXSUY7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHJlc3VsdCwge1xuICAgICAgZmVlLFxuICAgICAgZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWUsXG4gICAgICB0cmF2ZWxJbmZvcyxcbiAgICAgIGVzdGltYXRlZFNpemUsXG4gICAgICB1bnNwZW50cyxcbiAgICB9KTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluXG4vLyBJTlRFUk5BTCBmdW5jdGlvbiB0byBnZXQgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHNpZ25pbmcuXG4vLyBDYWxsZXIgbXVzdCBwcm92aWRlciBlaXRoZXIgYSBrZXljaGFpbiwgb3Igd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGFzIGEgc3RyaW5nXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBrZXljaGFpbiB3aXRoIHhwcnYsIGl0IGlzIHNpbXBseSByZXR1cm5lZC5cbi8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGVuY3J5cHRlZCB4cHJ2ICh3YWxsZXRQYXNzcGhyYXNlKSwgdGhlbiBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBkZWNyeXB0XG4vLyBPdGhlcndpc2UgaWYgdGhlIHhwcnYgaXMgcHJvdmlkZWQsIGZldGNoIHRoZSBrZXljaGFpbiBvYmplY3QgYW5kIGF1Z21lbnQgaXQgd2l0aCB0aGUgeHBydi5cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBrZXljaGFpbiAtIGtleWNoYWluIHdpdGggeHBydlxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyBSZXR1cm5zOlxuLy8gICBLZXljaGFpbiBvYmplY3QgY29udGFpbmluZyB4cHJ2LCB4cHViIGFuZCBwYXRoc1xuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAvLyBJZiBrZXljaGFpbiB3aXRoIHhwcnYgaXMgYWxyZWFkeSBwcm92aWRlZCwgdXNlIGl0XG4gIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgJiYgcGFyYW1zLmtleWNoYWluLnhwcnYpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShwYXJhbXMua2V5Y2hhaW4pO1xuICB9XG5cbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgaWYgKChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiBwYXJhbXMueHBydikgfHwgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiAhcGFyYW1zLnhwcnYpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZXhhY3RseSBvbmUgb2YgeHBydiBvciB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYSB3YWxsZXQgcGFzc3BocmFzZVxuICBpZiAocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleWNoYWluLnhwdWIgJiYgYmlwMzIuZnJvbUJhc2U1OChrZXljaGFpbi54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgIT09IGtleWNoYWluLnhwdWIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkIHhwdWIgZG9lcyBub3QgbWF0Y2ggc3RvcmVkIHhwdWInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENhbGxlciBwcm92aWRlZCBhbiB4cHJ2IC0gdmFsaWRhdGUgYW5kIGNvbnN0cnVjdCBrZXljaGFpbiBvYmplY3RcbiAgbGV0IHhwdWI7XG4gIHRyeSB7XG4gICAgeHB1YiA9IGJpcDMyLmZyb21CYXNlNTgocGFyYW1zLnhwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSB4cHJ2Jyk7XG4gIH1cblxuICBpZiAoeHB1YiA9PT0gcGFyYW1zLnhwcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwcnYgcHJvdmlkZWQgd2FzIG5vdCBhIHByaXZhdGUga2V5IChmb3VuZCB4cHViIGluc3RlYWQpJyk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRYcHVicyA9IF8ubWFwKHNlbGYua2V5Y2hhaW5zLCAneHB1YicpO1xuICBpZiAoIV8uaW5jbHVkZXMod2FsbGV0WHB1YnMsIHhwdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBrZXljaGFpbiBvbiB0aGlzIHdhbGxldCEnKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW4gb2JqZWN0IGZyb20gYml0Z28gdG8gZmluZCB0aGUgcGF0aCBhbmQgKHBvdGVudGlhbCkgd2FsbGV0IHN0cnVjdHVyZVxuICByZXR1cm4gc2VsZi5iaXRnb1xuICAgIC5rZXljaGFpbnMoKVxuICAgIC5nZXQoeyB4cHViOiB4cHViIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBrZXljaGFpbi54cHJ2ID0gcGFyYW1zLnhwcnY7XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFRha2VzIGEgd2FsbGV0J3MgdW5zcGVudHMgYW5kIGZhbnMgdGhlbSBvdXQgaW50byBhIGxhcmdlciBudW1iZXIgb2YgZXF1YWxseSBzaXplZCB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogIHRhcmdldDogc2V0IGhvdyBtYW55IHVuc3BlbnRzIHlvdSB3YW50IHRvIGhhdmUgaW4gdGhlIGVuZFxuICogIG1pbkNvbmZpcm1zOiBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0aGUgdW5zcGVudHMgbXVzdCBoYXZlXG4gKiAgeHBydjogcHJpdmF0ZSBrZXkgdG8gc2lnbiB0cmFuc2FjdGlvblxuICogIHdhbGxldFBhc3NwaHJhc2U6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIHdhbGxldCdzIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLmZhbk91dFVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBCbHVlYmlyZC5jb3JvdXRpbmUoZnVuY3Rpb24qICgpIHtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBpbnB1dHMgZm9yIGZhbm91dCB0cmFuc2FjdGlvblxuICAgIC8vICh3aGVuIGZhbm5pbmcgb3V0LCB3ZSB0YWtlIGFsbCB0aGUgdW5zcGVudHMgYW5kIG1ha2UgYSBiaWdnZXIgbnVtYmVyIG9mIG91dHB1dHMpXG4gICAgY29uc3QgTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCA9IDgwO1xuICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dHMgZm9yIGZhbm91dCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UID0gMzAwO1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuICAgIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IHR3bywgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAyIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0ID4gTUFYX0ZBTk9VVF9PVVRQVVRfQ09VTlQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFuIG91dCB0YXJnZXQgdG9vIGhpZ2gnKTtcbiAgICB9XG5cbiAgICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gICAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pbkNvbmZpcm1zID0gMTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWluQ29uZmlybXMgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciA+PSAwJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3BsaXQgYSBuYXR1cmFsIG51bWJlciBOIGludG8gbiBhbG1vc3QgZXF1YWxseSBzaXplZCAowrExKSBuYXR1cmFsIG51bWJlcnMuXG4gICAgICogSW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBzaXplcyBvZiB0aGUgcGFydHMsIHdlIGNhbGN1bGF0ZSBmbG9vcihOL24pLCBhbmQgdGh1cyBoYXZlIHRoZSBiYXNlIHNpemUgb2YgYWxsIHBhcnRzLlxuICAgICAqIElmIE4gJSBuICE9PSAwLCB0aGlzIGxlYXZlcyB1cyB3aXRoIGEgcmVtYWluZGVyIHIgd2hlcmUgciA8IG4uIFdlIGRpc3RyaWJ1dGUgciBlcXVhbGx5IGFtb25nIHRoZSBuIHBhcnRzIGJ5XG4gICAgICogYWRkaW5nIDEgdG8gdGhlIGZpcnN0IHIgcGFydHMuXG4gICAgICogQHBhcmFtIHRvdGFsXG4gICAgICogQHBhcmFtIHBhcnRDb3VudFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBjb25zdCBzcGxpdE51bWJlckludG9DbG9zZU5hdHVyYWxOdW1iZXJzID0gZnVuY3Rpb24gKHRvdGFsLCBwYXJ0Q291bnQpIHtcbiAgICAgIGNvbnN0IHBhcnRTaXplID0gTWF0aC5mbG9vcih0b3RhbCAvIHBhcnRDb3VudCk7XG4gICAgICBjb25zdCByZW1haW5kZXIgPSB0b3RhbCAtIHBhcnRTaXplICogcGFydENvdW50O1xuICAgICAgLy8gaW5pdGlhbGl6ZSBwbGFjZWhvbGRlciBhcnJheVxuICAgICAgY29uc3QgYWxtb3N0RXF1YWxQYXJ0cyA9IG5ldyBBcnJheShwYXJ0Q291bnQpO1xuICAgICAgLy8gZmlsbCB0aGUgZmlyc3QgcmVtYWluZGVyIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplKzFcbiAgICAgIF8uZmlsbChhbG1vc3RFcXVhbFBhcnRzLCBwYXJ0U2l6ZSArIDEsIDAsIHJlbWFpbmRlcik7XG4gICAgICAvLyBmaWxsIHRoZSByZW1haW5pbmcgcGFydHMgd2l0aCB0aGUgdmFsdWUgcGFydFNpemVcbiAgICAgIF8uZmlsbChhbG1vc3RFcXVhbFBhcnRzLCBwYXJ0U2l6ZSwgcmVtYWluZGVyKTtcbiAgICAgIC8vIGFzc2VydCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsbW9zdCBlcXVhbCBwYXJ0c1xuICAgICAgLy8gVE9ETzogYWRkIGNoZWNrIGZvciB0aGUgYmlnZ2VzdCBkZXZpYXRpb24gYmV0d2VlbiBhbnkgdHdvIHBhcnRzIGFuZCBtYWtlIHN1cmUgaXQncyA8PSAxXG4gICAgICBpZiAoXyhhbG1vc3RFcXVhbFBhcnRzKS5zdW0oKSAhPT0gdG90YWwgfHwgXyhhbG1vc3RFcXVhbFBhcnRzKS5zaXplKCkgIT09IHBhcnRDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnQgc3VtIG9yIHBhcnQgY291bnQgbWlzbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhbG1vc3RFcXVhbFBhcnRzO1xuICAgIH07XG5cbiAgICAvLyBmaXJzdCwgbGV0J3MgdGFrZSBhbGwgdGhlIHdhbGxldCdzIHVuc3BlbnRzICh3aXRoIG1pbiBjb25maXJtcyBpZiBuZWNlc3NhcnkpXG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoeWllbGQgc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KSkgYXMgYW55O1xuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVuc3BlbnRzIHRvIGJyYW5jaCBvdXQnKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA+PSB0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFuIG91dCB0YXJnZXQgaGFzIHRvIGJlIGJpZ2dlciB0aGFuIGN1cnJlbnQgbnVtYmVyIG9mIHVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gd2UgaGF2ZSBhdCB0aGUgdmVyeSBtaW5pbXVtIDgxIGlucHV0cywgYW5kIDgxIG91dHB1dHMuIFRoYXQgdHJhbnNhY3Rpb24gd2lsbCBiZSBiaWdcbiAgICAvLyBpbiB0aGUgbWVkaXVtIHJ1biwgdGhpcyBhbGdvcml0aG0gY291bGQgYmUgcmV3b3JrZWQgdG8gb25seSB3b3JrIHdpdGggYSBzdWJzZXQgb2YgdGhlIHRyYW5zYWN0aW9uc1xuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPiBNQVhfRkFOT1VUX0lOUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBpcyBhbGwgdGhlIG1vbmV5IHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSB3YWxsZXRcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oYWxsVW5zcGVudHMpLm1hcCgndmFsdWUnKS5zdW0oKTtcblxuICAgIC8vIGluIG9yZGVyIHRvIG5vdCBtb2RpZnkgdGhlIHBhcmFtcyBvYmplY3QsIHdlIGNyZWF0ZSBhIGNvcHlcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gYWxsVW5zcGVudHM7XG4gICAgdHhQYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuXG4gICAgLy8gY3JlYXRlIHRhcmdldCBhbW91bnQgb2YgbmV3IGFkZHJlc3NlcyBmb3IgdGhpcyB3YWxsZXRcbiAgICBjb25zdCBuZXdBZGRyZXNzUHJvbWlzZXMgPSBfLnJhbmdlKHRhcmdldCkubWFwKCgpID0+XG4gICAgICBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSlcbiAgICApO1xuICAgIGNvbnN0IG5ld0FkZHJlc3NlcyA9IHlpZWxkIEJsdWViaXJkLmFsbChuZXdBZGRyZXNzUHJvbWlzZXMpO1xuICAgIC8vIGxldCdzIGZpbmQgYSBuaWNlLCBlcXVhbCBkaXN0cmlidXRpb24gb2Ygb3VyIFNhdG9zaGlzIGFtb25nIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgY29uc3Qgc3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhncm9zc0Ftb3VudCwgdGFyZ2V0KTtcbiAgICAvLyBtYXAgdGhlIG5ld2x5IGNyZWF0ZWQgYWRkcmVzc2VzIHRvIHRoZSBhbG1vc3QgY29tcG9uZW50cyBhbW91bnRzIHdlIGp1c3QgY2FsY3VsYXRlZFxuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHNwbGl0QW1vdW50cyk7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG4gICAgLy8gYXR0ZW1wdCB0byBjcmVhdGUgYSB0cmFuc2FjdGlvbi4gQXMgaXQgaXMgYSB3YWxsZXQtc3dlZXBpbmcgdHJhbnNhY3Rpb24gd2l0aCBubyBmZWUsIHdlIGV4cGVjdCBpdCB0byBmYWlsXG4gICAgdHJ5IHtcbiAgICAgIHlpZWxkIHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBhcyBleHBlY3RlZCwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIGRpZCBpbmRlZWQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZlZXNcbiAgICAgIC8vIHRoZSBlcnJvciBzdWdnZXN0cyBhIGZlZSB2YWx1ZSB3aGljaCB3ZSB0aGVuIHVzZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBob3dldmVyLCBsZXQncyBtYWtlIHN1cmUgaXQgd2Fzbid0IHNvbWV0aGluZyBlbHNlXG4gICAgICBpZiAoIWVycm9yLmZlZSAmJiAoIWVycm9yLnJlc3VsdCB8fCAhZXJyb3IucmVzdWx0LmZlZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIGVycm9yIGRvZXMgbm90IGNvbnRhaW4gYSBmZWUgcHJvcGVydHksIGl0IGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgaGFzIGdvbmUgYXdyeSwgYW5kIHdlIHRocm93IGl0XG4gICAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2VGZWUgPSBlcnJvci5mZWUgfHwgZXJyb3IucmVzdWx0LmZlZTtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgdG90YWxGZWUgKz0gZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudDtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5lZWQgdG8gY2xlYXIgdGhlc2Ugb3V0IHNpbmNlIG9ubHkgMSBtYXkgYmUgc2V0XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlO1xuICAgICAgdHhQYXJhbXMub3JpZ2luYWxGZWVSYXRlID0gdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldDtcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGJhc2VGZWU7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgZXF1YWwgZGlzdHJpYnV0aW9uLCB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBmZWUgZnJvbSB0aGUgY3VtdWxhdGl2ZSBmdW5kc1xuICAgICAgLy8gaW4gY2FzZSBzb21lIHVuc3BlbnRzIGdvdCBwcnVuZWQsIHdlIG5lZWQgdG8gdXNlIGVycm9yLnJlc3VsdC5hdmFpbGFibGVcbiAgICAgIGNvbnN0IG5ldEFtb3VudCA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSB0b3RhbEZlZTsgLy8gYWZ0ZXIgZmVlc1xuICAgICAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgY29uc3QgcmVtYWluaW5nU3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhuZXRBbW91bnQsIHRhcmdldCk7XG4gICAgICAvLyBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBhZ2FpbiBtYXBwZWQgdG8gdGhlIG5ldyBhZGRyZXNzZXNcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHJlbWFpbmluZ1NwbGl0QW1vdW50cyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB0aW1lLCB0aGUgdHJhbnNhY3Rpb24gY3JlYXRpb24gc2hvdWxkIHdvcmtcbiAgICBsZXQgZmFub3V0VHg7XG4gICAgdHJ5IHtcbiAgICAgIGZhbm91dFR4ID0geWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKGZhbm91dFR4KS5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfSkoKS5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmFuIG91dCBvciBjb2FsZXNjZSBhIHdhbGxldCdzIHVuc3BlbnRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtSZXF1ZXN0fFByb21pc2UuPFQ+fCp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUucmVncm91cFVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb25zdCB0YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuICBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBzZWxmLnVuc3BlbnRzKHsgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zIH0pLnRoZW4oZnVuY3Rpb24gKHVuc3BlbnRzKSB7XG4gICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdW5zcGVudHM7XG4gICAgfSBlbHNlIGlmICh1bnNwZW50cy5sZW5ndGggPiB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNvbnNvbGlkYXRlVW5zcGVudHMocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIGlmICh1bnNwZW50cy5sZW5ndGggPCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBzZWxmLmZhbk91dFVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnNvbGlkYXRlIGEgd2FsbGV0J3MgdW5zcGVudHMgaW50byBmZXdlciB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogIHRhcmdldDogc2V0IGhvdyBtYW55IHVuc3BlbnRzIHlvdSB3YW50IHRvIGhhdmUgaW4gdGhlIGVuZFxuICogIG1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uOiBzZXQgaG93IG1hbnkgbWF4aW11bSBpbnB1dHMgYXJlIHRvIGJlIHBlcm1pdHRlZCBwZXIgY29uc29saWRhdGlvbiBiYXRjaFxuICogIHhwcnY6IHByaXZhdGUga2V5IHRvIHNpZ24gdHJhbnNhY3Rpb25cbiAqICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXQgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSB3YWxsZXQncyBwcml2YXRlIGtleVxuICogIG1heEl0ZXJhdGlvbkNvdW50OiBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB1bnRpbCBmdW5jdGlvbiBzdG9wc1xuICogIHByb2dyZXNzQ2FsbGJhY2s6IG1ldGhvZCB0byBiZSBjYWxsZWQgd2l0aCBvYmplY3Qgb3V0bGluaW5nIGN1cnJlbnQgcHJvZ3Jlc3MgZGV0YWlsc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jb25zb2xpZGF0ZVVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGFyZ2V0ID0gMTtcbiAgfSBlbHNlIGlmICghXy5pc051bWJlcih0YXJnZXQpIHx8IHRhcmdldCA8IDEgfHwgdGFyZ2V0ICUgMSAhPT0gMCkge1xuICAgIC8vIHRoZSB0YXJnZXQgbXVzdCBiZSBkZWZpbmVkLCBiZSBhIG51bWJlciwgYmUgYXQgbGVhc3Qgb25lLCBhbmQgYmUgYSBuYXR1cmFsIG51bWJlclxuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5tYXhTaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5tYXhTaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWF4U2l6ZSBzaG91bGQgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWluU2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluU2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pblNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBtYXhpbXVtIG51bWJlciBvZiBpbnB1dHMgcGVyIHRyYW5zYWN0aW9uIGZvciBjb25zb2xpZGF0aW9uXG4gIGNvbnN0IE1BWF9JTlBVVF9DT1VOVCA9IDIwMDtcbiAgbGV0IG1heElucHV0Q291bnQgPSBwYXJhbXMubWF4SW5wdXRDb3VudFBlckNvbnNvbGlkYXRpb247XG4gIGlmIChtYXhJbnB1dENvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBudWxsIG9yIHVuaWRlbnRpZmllZCwgYmVjYXVzZSBlcXVhbGl0eSB0byB6ZXJvIHJldHVybnMgdHJ1ZSBpbiBpZighIGNsYXVzZVxuICAgIG1heElucHV0Q291bnQgPSBNQVhfSU5QVVRfQ09VTlQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBtYXhJbnB1dENvdW50ICE9PSAnbnVtYmVyJyB8fCBtYXhJbnB1dENvdW50IDwgMiB8fCBtYXhJbnB1dENvdW50ICUgMSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSBjb25zb2xpZGF0aW9uIGlucHV0IGNvdW50IG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMicpO1xuICB9IGVsc2UgaWYgKG1heElucHV0Q291bnQgPiBNQVhfSU5QVVRfQ09VTlQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gJyArIE1BWF9JTlBVVF9DT1VOVCk7XG4gIH1cblxuICBjb25zdCBtYXhJdGVyYXRpb25Db3VudCA9IHBhcmFtcy5tYXhJdGVyYXRpb25Db3VudCB8fCAtMTtcbiAgaWYgKFxuICAgIChwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgJiYgKCFfLmlzTnVtYmVyKG1heEl0ZXJhdGlvbkNvdW50KSB8fCBtYXhJdGVyYXRpb25Db3VudCA8IDEpKSB8fFxuICAgIG1heEl0ZXJhdGlvbkNvdW50ICUgMSAhPT0gMFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gaXRlcmF0aW9uIGNvdW50IG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMScpO1xuICB9XG5cbiAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICBpZiAobWluQ29uZmlybXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG1pbkNvbmZpcm1zID0gMTtcbiAgfVxuICBpZiAoIV8uaXNOdW1iZXIobWluQ29uZmlybXMpIHx8IG1pbkNvbmZpcm1zIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluQ29uZmlybXMgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBlcXVhbCB0byBvciBiaWdnZXIgdGhhbiAwJyk7XG4gIH1cblxuICBsZXQgbWluU2l6ZSA9IHBhcmFtcy5taW5TaXplIHx8IDA7XG4gIGlmIChwYXJhbXMuZmVlUmF0ZSkge1xuICAgIC8vIGZlZSByYXRlIGlzIGluIHNhdG9zaGlzIHBlciBrQiwgaW5wdXQgc2l6ZSBpbiBieXRlc1xuICAgIGNvbnN0IGZlZUJhc2VkTWluU2l6ZSA9IE1hdGguY2VpbCgoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDApO1xuICAgIGlmIChwYXJhbXMubWluU2l6ZSAmJiBtaW5TaXplIDwgZmVlQmFzZWRNaW5TaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVkIG1pblNpemUgdG9vIGxvdyBkdWUgdG8gdG9vIGhpZ2ggZmVlIHJhdGUnKTtcbiAgICB9XG4gICAgbWluU2l6ZSA9IE1hdGgubWF4KGZlZUJhc2VkTWluU2l6ZSwgbWluU2l6ZSk7XG5cbiAgICBpZiAoIXBhcmFtcy5taW5TaXplKSB7XG4gICAgICAvLyBmZWUgcmF0ZS1iYXNlZCBtaW4gc2l6ZSBuZWVkcyBubyBsb2dnaW5nIGlmIGl0IHdhcyBzZXQgZXhwbGljaXRseVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdPbmx5IGNvbnNvbGlkYXRpbmcgdW5zcGVudHMgbGFyZ2VyIHRoYW4gJyArXG4gICAgICAgICAgbWluU2l6ZSArXG4gICAgICAgICAgJyBzYXRvc2hpcyB0byBhdm9pZCB3YXN0aW5nIG1vbmV5IG9uIGZlZXMuIFRvIGNvbnNvbGlkYXRlIHNtYWxsZXIgdW5zcGVudHMsIHVzZSBhIGxvd2VyIGZlZSByYXRlLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGl0ZXJhdGlvbkNvdW50ID0gMDtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgbGV0IGNvbnNvbGlkYXRpb25JbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9uZSBiYXRjaCBvZiB1cCB0byBNQVhfSU5QVVRfQ09VTlQgdW5zcGVudHMuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgY29uc3QgcnVuTmV4dENvbnNvbGlkYXRpb24gPSBjbyhmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM6IGFueVtdID0gW107XG4gICAgbGV0IGlzRmluYWxDb25zb2xpZGF0aW9uID0gZmFsc2U7XG4gICAgaXRlcmF0aW9uQ291bnQrKztcbiAgICAvKlxuICAgICBXZSB0YWtlIGEgbWF4aW11bSBvZiB1bnNwZW50QnVsa1NpemVMaW1pdCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3dpcGUgdGhlIHdhbGxldFxuICAgICBjbGVhbiBvZiBhbGwgZXhjZXNzaXZlIHVuc3BlbnRzLCBzbyB3ZSBhZGQgMSB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnQgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuICAgICBJbiBjYXNlIHRoZXJlIGFyZSBldmVuIG1vcmUgdW5zcGVudHMgdGhhbiB0aGF0LCB0byBtYWtlIHRoZSBjb25zb2xpZGF0aW9uIGFzIGZhc3QgYXMgcG9zc2libGUsIHdlIGV4cGFuZCBvdXJcbiAgICAgc2VsZWN0aW9uIHRvIGluY2x1ZGUgYXMgbWFueSBhcyB0aGUgbWF4aW11bSBwZXJtaXNzaWJsZSBudW1iZXIgb2YgaW5wdXRzIHBlciBjb25zb2xpZGF0aW9uIGJhdGNoLlxuICAgICBTaG91bGQgdGhlIHRhcmdldCBudW1iZXIgb2YgdW5zcGVudHMgYmUgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIGlmIGlucHV0cyBwZXIgY29uc29saWRhdGlvbixcbiAgICAgd2Ugc3RpbGwgd2FudCB0byBmZXRjaCB0aGVtIGFsbCBzaW1wbHkgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBjb25zb2xpZGF0aW9uIGNhbiBiZSBwZXJmb3JtZWRcbiAgICAgYXQgYWxsLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIG51bWJlciBvZiBhbGwgdW5zcGVudHMgYmVpbmcgaGlnaGVyIHRoYW4gdGhlIHRhcmdldC5cbiAgICAgSW4gdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgdW5zcGVudHMgdmVyc2lvbiBTREssIHdlIHdpbGwga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIGZldGNoXG4gICAgIHRoZW0sIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoaXMgbWV0aG9kLlxuICAgICAqL1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHtcbiAgICAgIGxpbWl0OiB0YXJnZXQgKyBtYXhJbnB1dENvdW50LFxuICAgICAgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zLFxuICAgICAgbWluU2l6ZTogbWluU2l6ZSxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMubWF4U2l6ZSkge1xuICAgICAgcXVlcnlQYXJhbXMubWF4U2l6ZSA9IHBhcmFtcy5tYXhTaXplO1xuICAgIH1cbiAgICBjb25zdCBhbGxVbnNwZW50cyA9ICh5aWVsZCBzZWxmLnVuc3BlbnRzKHF1ZXJ5UGFyYW1zKSkgYXMgYW55O1xuICAgIC8vIHRoaXMgY29uc29saWRhdGlvbiBpcyBlc3NlbnRpYWxseSBqdXN0IGEgd2FzdGUgb2YgbW9uZXlcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDw9IHRhcmdldCkge1xuICAgICAgaWYgKGl0ZXJhdGlvbkNvdW50IDw9IDEpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uLCBzbyB0aGUgbWV0aG9kIGlzIGluY29ycmVjdFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zld2VyIHVuc3BlbnRzIHRoYW4gY29uc29saWRhdGlvbiB0YXJnZXQuIFVzZSBmYW5PdXRVbnNwZW50cyBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaXQncyBhIGxhdGVyIGl0ZXJhdGlvbiwgc28gdGhlIHRhcmdldCBtYXkgaGF2ZSBiZWVuIHN1cnBhc3NlZCAoZHVlIHRvIGNvbmZpcm1hdGlvbnMgaW4gdGhlIGJhY2tncm91bmQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbFVuc3BlbnRzQ291bnQgPSBhbGxVbnNwZW50cy5sZW5ndGg7XG5cbiAgICAvLyBob3cgbWFueSBvZiB0aGUgdW5zcGVudHMgZG8gd2Ugd2FudCB0byBjb25zb2xpZGF0ZT9cbiAgICAvLyB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgY29uc29saWRhdGVkIGJsb2NrIGJlY29tZXMgYSBuZXcgdW5zcGVudCBsYXRlclxuICAgIGxldCB0YXJnZXRJbnB1dENvdW50ID0gYWxsVW5zcGVudHNDb3VudCAtIHRhcmdldCArIDE7XG4gICAgdGFyZ2V0SW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIGFsbFVuc3BlbnRzLmxlbmd0aCk7XG5cbiAgICAvLyBpZiB0aGUgdGFyZ2V0SW5wdXRDb3VudCByZXF1aXJlcyBtb3JlIGlucHV0cyB0aGFuIHdlIGFsbG93IHBlciBiYXRjaCwgd2UgcmVkdWNlIHRoZSBudW1iZXJcbiAgICBjb25zdCBpbnB1dENvdW50ID0gTWF0aC5taW4odGFyZ2V0SW5wdXRDb3VudCwgbWF4SW5wdXRDb3VudCk7XG5cbiAgICAvLyBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiBpbnB1dHMgbGVmdCB0byBjb2FsZXNjZSBlcXVhbHMgdGhlIG51bWJlciB3ZSB3aWxsIGNvYWxlc2NlIGluIHRoaXMgaXRlcmF0aW9uXG4gICAgLy8gb3IgaWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG1hdGNoZXMgdGhlIG1heGltdW0gcGVybWl0dGVkIG51bWJlclxuICAgIGlzRmluYWxDb25zb2xpZGF0aW9uID0gaW5wdXRDb3VudCA9PT0gdGFyZ2V0SW5wdXRDb3VudCB8fCBpdGVyYXRpb25Db3VudCA9PT0gbWF4SXRlcmF0aW9uQ291bnQ7XG5cbiAgICBjb25zdCBjdXJyZW50Q2h1bmsgPSBhbGxVbnNwZW50cy5zcGxpY2UoMCwgaW5wdXRDb3VudCk7XG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBzZWxmLmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgY29uc3QgbmV3QWRkcmVzcyA9ICh5aWVsZCBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4sIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KSkgYXMgYW55O1xuICAgIGNvbnN0IHR4UGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBuZXdBZGRyZXNzO1xuICAgIC8vIHRoZSB0b3RhbCBhbW91bnQgdGhhdCB3ZSBhcmUgY29uc29saWRhdGluZyB3aXRoaW4gdGhpcyBiYXRjaFxuICAgIGNvbnN0IGdyb3NzQW1vdW50ID0gXyhjdXJyZW50Q2h1bmspLm1hcCgndmFsdWUnKS5zdW0oKTsgLy8gYmVmb3JlIGZlZXNcblxuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gY3VycmVudENodW5rO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBncm9zc0Ftb3VudDtcbiAgICB0eFBhcmFtcy5ub1NwbGl0Q2hhbmdlID0gdHJ1ZTtcblxuICAgIGlmICh0eFBhcmFtcy51bnNwZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb25lJyk7XG4gICAgfVxuXG4gICAgLy8gbGV0J3MgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyB0cmFuc2FjdGlvbi4gV2UgZXhwZWN0IGl0IHRvIGZhaWwgYmVjYXVzZSBubyBmZWUgaXMgc2V0LlxuICAgIHRyeSB7XG4gICAgICB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdGhpcyBlcnJvciBzaG91bGQgb2NjdXIgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kc1xuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgYml0Z29GZWUgPSAwO1xuICAgICAgbGV0IHRvdGFsRmVlID0gYmFzZUZlZTtcbiAgICAgIGlmIChlcnJvci5yZXN1bHQuYml0Z29GZWUgJiYgZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudCkge1xuICAgICAgICBiaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHRvdGFsRmVlICs9IGJpdGdvRmVlO1xuICAgICAgICB0eFBhcmFtcy5iaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIG5ldCBhbW91bnQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBtaW5pbXVtIG91dHB1dCBzaXplXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBNYXRoLm1heChlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWUsIHNlbGYuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluT3V0cHV0U2l6ZSk7XG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG5cbiAgICAgIC8vIHdlIHNldCB0aGUgZmVlIGV4cGxpY2l0bHlcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSBuZXRBbW91bnQgLSBiaXRnb0ZlZTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbbmV3QWRkcmVzcy5hZGRyZXNzXSA9IG5ldEFtb3VudDtcbiAgICB9XG4gICAgLy8gdGhpcyB0cmFuc2FjdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbm8gaXNzdWVzLCBiZWNhdXNlIGFuIGFwcHJvcHJpYXRlIGZlZSBpcyBzZXRcbiAgICBsZXQgc2VudFR4O1xuICAgIHRyeSB7XG4gICAgICBzZW50VHggPSB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaChzZW50VHgpO1xuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnByb2dyZXNzQ2FsbGJhY2spKSB7XG4gICAgICBwYXJhbXMucHJvZ3Jlc3NDYWxsYmFjayh7XG4gICAgICAgIHR4aWQ6IHNlbnRUeC5oYXNoLFxuICAgICAgICBkZXN0aW5hdGlvbjogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogZ3Jvc3NBbW91bnQsXG4gICAgICAgIGZlZTogc2VudFR4LmZlZSxcbiAgICAgICAgaW5wdXRDb3VudDogaW5wdXRDb3VudCxcbiAgICAgICAgaW5kZXg6IGNvbnNvbGlkYXRpb25JbmRleCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uSW5kZXgrKztcbiAgICBpZiAoIWlzRmluYWxDb25zb2xpZGF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGxhc3QgY29uc29saWRhdGlvbiBoYXMgbm90IHlldCBicm91Z2h0IHRoZSB1bnNwZW50cyBjb3VudCBkb3duIHRvIHRoZSB0YXJnZXQgdW5zcGVudCBjb3VudFxuICAgICAgLy8gdGhlcmVmb3JlLCB3ZSBwcm9jZWVkIGJ5IGNvbnNvbGlkYXRpbmcgeWV0IGFub3RoZXIgYmF0Y2hcbiAgICAgIC8vIGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSB3YWl0IDEgc2Vjb25kIHNvIHRoYXQgdGhlIG5ld2x5IGNyZWF0ZWQgdW5zcGVudCB3aWxsIGJlIGZldGNoZWQgaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgIHlpZWxkIEJsdWViaXJkLmRlbGF5KDEwMDApO1xuICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKC4uLigoeWllbGQgcnVuTmV4dENvbnNvbGlkYXRpb24oKSkgYXMgYW55KSk7XG4gICAgfVxuICAgIC8vIHRoaXMgaXMgdGhlIGZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24uIFdlIHJldHVybiBhbGwgdGhlIG9uZXMgd2UndmUgaGFkIHNvIGZhclxuICAgIHJldHVybiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zO1xuICB9KTtcblxuICByZXR1cm4gcnVuTmV4dENvbnNvbGlkYXRpb24oKVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdEb25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnNoYXJlV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBzaGFyaW5nO1xuICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gIHJldHVybiB0aGlzLmJpdGdvXG4gICAgLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBzaGFyaW5nID0gcmVzdWx0O1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAga2V5Y2hhaW4ueHBydiA9IHNlbGYuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFhwcnYgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3RW5jcnlwdGVkWHBydiA9IHNlbGYuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi54cHJ2IH0pO1xuXG4gICAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgICAgeHB1Yjoga2V5Y2hhaW4ueHB1YixcbiAgICAgICAgICAgICAgZW5jcnlwdGVkWHBydjogbmV3RW5jcnlwdGVkWHBydixcbiAgICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgICAgdG9QdWJLZXk6IHNoYXJpbmcucHVia2V5LFxuICAgICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgICAgIHVzZXI6IGFueTtcbiAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgcmVzaGFyZTogYm9vbGVhbjtcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICBkaXNhYmxlRW1haWw6IGFueTtcbiAgICAgICAga2V5Y2hhaW4/OiBhbnk7XG4gICAgICAgIHNraXBLZXljaGFpbj86IGJvb2xlYW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgICByZXNoYXJlOiBwYXJhbXMucmVzaGFyZSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIH07XG4gICAgICBpZiAoc2hhcmVkS2V5Y2hhaW4pIHtcbiAgICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnJlbW92ZVVzZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlciddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy51cmwoJy91c2VyLycgKyBwYXJhbXMudXNlcikpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KClcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeScpKS5zZW5kKCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5nZXRQb2xpY3lTdGF0dXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcG9saWN5L3N0YXR1cycpKS5zZW5kKCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zZXRQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5saXN0V2ViaG9va3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2ltdWxhdGUgd2FsbGV0IHdlYmhvb2ssIGN1cnJlbnRseSBmb3Igd2ViaG9va3Mgb2YgdHlwZSB0cmFuc2FjdGlvbiBhbmQgcGVuZGluZyBhcHByb3ZhbFxuICogQHBhcmFtIHBhcmFtc1xuICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKTogaWQgb2YgdGhlIHdlYmhvb2sgdG8gYmUgc2ltdWxhdGVkXG4gKiAtIHR4SGFzaCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciB0cmFuc2FjdGlvbiB3ZWJob29rcykgaGFzaCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zYWN0aW9uXG4gKiAtIHBlbmRpbmdBcHByb3ZhbElkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgYXBwcm92YWwgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgcGVuZGluZyBhcHByb3ZhbFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5zaW11bGF0ZVdlYmhvb2sgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHhIYXNoJywgJ3BlbmRpbmdBcHByb3ZhbElkJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBoYXNUeEhhc2ggPSAhIXBhcmFtcy50eEhhc2g7XG4gIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG5cbiAgaWYgKChoYXNUeEhhc2ggJiYgaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHx8ICghaGFzVHhIYXNoICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhhc2ggb3IgcGVuZGluZ0FwcHJvdmFsSWQsIGJ1dCBub3QgYm90aCcpO1xuICB9XG5cbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAvLyBidXQgdGhlIHNlcnZlciB0YWtlcyBjYXJlIG9mIHRoYXRcblxuICAvLyBvbmx5IHRha2UgdGhlIHR4SGFzaCBhbmQgcGVuZGluZ0FwcHJvdmFsSWQgcHJvcGVydGllc1xuICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHhIYXNoJywgJ3BlbmRpbmdBcHByb3ZhbElkJ10pO1xuXG4gIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmFkZFdlYmhvb2sgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5lc3RpbWF0ZUZlZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMuYW1vdW50ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIGFtb3VudCBhcyB3ZWxsIGFzIHJlY2lwaWVudHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWNpcGllbnRzIG11c3QgYmUgYXJyYXkgb2YgeyBhZGRyZXNzOiBhYmMsIGFtb3VudDogMTAwMDAwIH0gb2JqZWN0cycpO1xuICB9XG4gIGlmIChwYXJhbXMuYW1vdW50ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3QgcmVjaXBpZW50cyA9IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdO1xuXG4gIGlmIChwYXJhbXMuYW1vdW50KSB7XG4gICAgLy8gb25seSB0aGUgYW1vdW50IHdhcyBwYXNzZWQgaW4sIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGZhbHNlIHJlY2lwaWVudCB0byBydW4gY3JlYXRlVHJhbnNhY3Rpb24gd2l0aFxuICAgIHJlY2lwaWVudHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZW52XS5zaWduaW5nQWRkcmVzcywgLy8gYW55IGFkZHJlc3Mgd2lsbCBkb1xuICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgdHJhbnNhY3Rpb25QYXJhbXMuYW1vdW50ID0gdW5kZWZpbmVkO1xuICB0cmFuc2FjdGlvblBhcmFtcy5yZWNpcGllbnRzID0gcmVjaXBpZW50cztcblxuICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvblBhcmFtcykudGhlbihmdW5jdGlvbiAodHgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXN0aW1hdGVkU2l6ZTogdHguZXN0aW1hdGVkU2l6ZSxcbiAgICAgIGZlZTogdHguZmVlLFxuICAgICAgZmVlUmF0ZTogdHguZmVlUmF0ZSxcbiAgICB9O1xuICB9KTtcbn07XG5cbi8vIE5vdCBmdWxseSBpbXBsZW1lbnRlZCAvIHJlbGVhc2VkIG9uIFNESy4gVGVzdGluZyBmb3Igbm93LlxuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmRlbGV0ZVBvbGljeVJ1bGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0Qml0R29GZWVcbi8vIEdldCB0aGUgcmVxdWlyZWQgb24tdHJhbnNhY3Rpb24gQml0R28gZmVlXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRCaXRHb0ZlZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQnKTtcbiAgfVxuICBpZiAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0YW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9iaWxsaW5nL2ZlZScpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qXG4gKiBAcGFyYW1zXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSBvZiB3YWxsZXQgdXNlZCB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQga2V5c1xuICogIHVuc3BlbnRzOiBhcnJheSBvZiB1bnNwZW50cyB0byByZWNvdmVyXG4gKiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb24gYWRkcmVzcyB0byByZWNvdmVyIGZ1bmRzIHRvXG4gKiAgZmVlUmF0ZTogZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqICB1c2VyS2V5OiBlbmNyeXB0ZWQgdXNlciBrZXlcbiAqICBiYWNrdXBLZXk6IGVuY3J5cHRlZCBiYWNrdXAga2V5XG4gKiAqL1xuV2FsbGV0LnByb3RvdHlwZS5yZWNvdmVyID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdW5zcGVudHMnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVSYXRlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXknKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiYWNrdXBLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBCaWdJbnQodXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHBhcmFtcy51bnNwZW50cykpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTaXplID0gVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPVxuICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy51bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlVHhGZWUgPSBCaWdJbnQoYXBwcm94aW1hdGVTaXplICogcGFyYW1zLmZlZVJhdGUpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZVR4RmVlO1xuICBjb25zdCByZWNpcGllbnRzID0gW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogTnVtYmVyKHJlY292ZXJ5QW1vdW50KSB9XTtcblxuICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICByZWNpcGllbnRzLFxuICAgIGZlZTogTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpLFxuICB9KTtcblxuICBjb25zdCBwYXJzZWRVbnNpZ25lZFR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgodW5zaWduZWRUeC50cmFuc2FjdGlvbkhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHguaW5zLmxlbmd0aCA9PT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCk7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lm91dHMubGVuZ3RoID09PSAxKTtcbiAgYXNzZXJ0KF8uc3VtQnkocGFyYW1zLnVuc3BlbnRzLCAndmFsdWUnKSAtIF8uc3VtQnkocGFyc2VkVW5zaWduZWRUeC5vdXRzLCAndmFsdWUnKSA9PT0gTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpKTtcblxuICBjb25zdCBwbGFpblVzZXJLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMudXNlcktleSB9KTtcbiAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oeyAuLi51bnNpZ25lZFR4LCBzaWduaW5nS2V5OiBwbGFpblVzZXJLZXkgfSk7XG5cbiAgY29uc3QgcGxhaW5CYWNrdXBLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMuYmFja3VwS2V5IH0pO1xuICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgLi4udW5zaWduZWRUeCxcbiAgICB0cmFuc2FjdGlvbkhleDogaGFsZlNpZ25lZFR4LnR4LFxuICAgIHNpZ25pbmdLZXk6IHBsYWluQmFja3VwS2V5LFxuICB9KTtcbiAgcmV0dXJuIGZ1bGxTaWduZWRUeC50eDtcbn07XG5cbi8qXG4gKiBAcGFyYW1zXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSBvZiB3YWxsZXQgdXNlZCB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQga2V5c1xuICogIHVuc3BlbnRzOiBhcnJheSBvZiB1bnNwZW50cyB0byByZWNvdmVyXG4gKiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb24gYWRkcmVzcyB0byByZWNvdmVyIGZ1bmRzIHRvXG4gKiAgZmVlUmF0ZTogZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqICB1c2VyS2V5OiBlbmNyeXB0ZWQgdXNlciBrZXlcbiAqICovXG5XYWxsZXQucHJvdG90eXBlLnN3ZWVwID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdW5zcGVudHMnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVSYXRlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBCaWdJbnQodXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHBhcmFtcy51bnNwZW50cykpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTaXplID0gVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPVxuICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy51bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlVHhGZWUgPSBCaWdJbnQoYXBwcm94aW1hdGVTaXplICogcGFyYW1zLmZlZVJhdGUpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZVR4RmVlO1xuICBjb25zdCByZWNpcGllbnRzID0gW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogTnVtYmVyKHJlY292ZXJ5QW1vdW50KSB9XTtcblxuICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICByZWNpcGllbnRzLFxuICAgIGZlZTogTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpLFxuICB9KTtcblxuICBjb25zdCBwYXJzZWRVbnNpZ25lZFR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgodW5zaWduZWRUeC50cmFuc2FjdGlvbkhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHguaW5zLmxlbmd0aCA9PT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCk7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lm91dHMubGVuZ3RoID09PSAxKTtcbiAgYXNzZXJ0KF8uc3VtQnkocGFyYW1zLnVuc3BlbnRzLCAndmFsdWUnKSAtIF8uc3VtQnkocGFyc2VkVW5zaWduZWRUeC5vdXRzLCAndmFsdWUnKSA9PT0gTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpKTtcblxuICBjb25zdCBwbGFpblVzZXJLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMudXNlcktleSB9KTtcbiAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oeyAuLi51bnNpZ25lZFR4LCBzaWduaW5nS2V5OiBwbGFpblVzZXJLZXkgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFRyYW5zYWN0aW9uKHtcbiAgICB0eDogaGFsZlNpZ25lZFR4LnR4LFxuICAgIHN1cHByZXNzQnJvYWRjYXN0OiB0cnVlLFxuICAgIG90cDogcGFyYW1zLm90cCxcbiAgfSk7XG59O1xuXG5leHBvcnQgPSBXYWxsZXQ7XG4iXX0=
|
|
2245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsOENBQStDO0FBQy9DLG9EQUE0QjtBQUU1Qix5REFBMkM7QUFDM0MsOENBQXdDO0FBQ3hDLDhDQU95QjtBQUN6Qix3REFBZ0M7QUFDaEMsb0RBQXVCO0FBQ3ZCLHlDQUE2QztBQUU3QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sRUFBRSxHQUFHLGtCQUFRLENBQUMsU0FBUyxDQUFDO0FBQzlCLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3RHLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV0QyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssRUFBRSxNQUFNO0lBQ3BDLHNDQUFzQztJQUNyQyxJQUFJLENBQUMsS0FBYSxHQUFHLEtBQUssQ0FBQztJQUM1QixzQ0FBc0M7SUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDckIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQzVDLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRztJQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLEtBQUs7QUFDTCw2QkFBNkI7QUFDN0IsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFFBQVE7QUFDUixnQ0FBZ0M7QUFDaEMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFVBQVU7QUFDVixrQ0FBa0M7QUFDbEMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFVBQVU7QUFDViw0Q0FBNEM7QUFDNUMsbUZBQW1GO0FBQ25GLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsbUJBQW1CO0FBQ25CLDJDQUEyQztBQUMzQyxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRztJQUNsQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixzREFBc0Q7QUFDdEQsd0RBQXdEO0FBQ3hELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRztJQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGtCQUFrQjtBQUNsQiwwQ0FBMEM7QUFDMUMsaUVBQWlFO0FBQ2pFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixtQkFBbUI7QUFDbkIsc0RBQXNEO0FBQ3RELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0Ysc0JBQXNCO0FBQ3RCLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRztJQUNyQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE9BQU87QUFDUCw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHO0lBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxLQUFLO0lBQ3BDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsbUJBQW1CO0FBQ25CLGlGQUFpRjtBQUNqRixFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRztJQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDakQsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsOEZBQThGO0FBQzlGLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHO0lBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLE1BQU07QUFDTix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDL0MsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRWxCLE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQ3JCLElBQUksQ0FBQyxLQUFLO1NBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNmLE1BQU0sRUFBRTtTQUNSLElBQUksQ0FBQyxVQUFVLEdBQUc7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FDTCxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsMEJBQTBCO0FBQzFCLHdGQUF3RjtBQUN4RixxRkFBcUY7QUFDckYscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLHVCQUF1QixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbkUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsSUFDRSxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUztRQUN0QyxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN0QyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUM1QixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxRCxJQUFJLHdCQUF3QixLQUFLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFELHdDQUF3QztRQUN4QyxPQUFPLGtCQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlGLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxNQUFNO0lBQ2hELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztJQUMvRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQseUZBQXlGO1FBQ3pGLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQ2xGLENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVGLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixnQkFBZ0I7QUFDaEIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELDJGQUEyRjtJQUMzRixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVsRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQzNDLElBQUksT0FBTyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLGFBQWEsR0FBRyxhQUFhLEtBQUssTUFBTSxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztJQUN4RCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqRyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3pCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDMUMsS0FBSyxHQUFHLFlBQVksQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FDckIsSUFBSSxDQUFDLEtBQUs7U0FDUCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUM7U0FDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNaLE1BQU0sRUFBRTtTQUNSLElBQUksQ0FBQyxVQUFVLElBQUk7UUFDbEIsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUNMLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0lBQ2pGLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzNCLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLGtCQUFrQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3QixRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRWpFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUEsNkJBQWtCLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekUsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDbkUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxXQUFXLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVwRSxNQUFNLGNBQWMsR0FBUTtRQUMxQixTQUFTLEVBQUUsSUFBSTtRQUNmLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7S0FDbEIsQ0FBQztJQUVGLE1BQU0sRUFDSixZQUFZLEVBQUUsWUFBWSxFQUMxQixZQUFZLEVBQ1osYUFBYSxHQUNkLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyRyxjQUFjLENBQUMsYUFBYSxHQUFHLGFBQWEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsY0FBYyxDQUFDLFlBQVksR0FBRyxZQUFZLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELGNBQWMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxjQUFjLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUEscUJBQVUsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTdGLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixrQkFBa0I7QUFDbEIsa0ZBQWtGO0FBQ2xGLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxVQUFVLE1BQU07SUFDakQsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUUzRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN2RixJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFlBQVk7QUFDWixxQ0FBcUM7QUFDckMsbUJBQW1CO0FBQ25CLHlDQUF5QztBQUN6QyxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNyRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRCxNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7SUFDdEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixLQUFLLENBQUMsS0FBSyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuQyxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2pELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFFdkMsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNuRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsaUVBQWlFO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxnQkFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsc0NBQXNDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25FLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNsQixzQ0FBc0M7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7U0FDQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ1YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixVQUFVO0FBQ1YsMERBQTBEO0FBQzFELHNGQUFzRjtBQUN0RixtQkFBbUI7QUFDbkIsOENBQThDO0FBQzlDLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ25ELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV6RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ2xELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEcsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFNBQVM7QUFDVCxxQkFBcUI7QUFDckIsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsU0FBUztBQUNULHNEQUFzRDtBQUN0RCxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNsRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbkQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEYsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN6RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixXQUFXO0FBQ1gsdUNBQXVDO0FBQ3ZDLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3BELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRWxCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFMUUsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEcsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGNBQWM7QUFDZCx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDdkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXpELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUVsQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTFFLE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLFdBQVc7QUFDWCwyQ0FBMkM7QUFDM0MsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRixzQkFBc0I7QUFDdEIsNkRBQTZEO0FBQzdELG9FQUFvRTtBQUNwRSwrQ0FBK0M7QUFDL0Msb0VBQW9FO0FBQ3BFLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3BELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFFbEIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLElBQUksRUFBRSxLQUFNO1FBQzdDLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2IsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU07WUFDMUQsaUhBQWlIO1lBQ2pILDRHQUE0RztZQUM1RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBRUQsNkdBQTZHO1lBQzdHLDZCQUE2QjtZQUM3QixJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QyxPQUFPLFdBQVcsQ0FBQyxDQUFDLCtDQUErQztZQUNyRSxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLDhHQUE4RztZQUM5RyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xGLGtDQUFrQztnQkFDbEMsa0RBQWtEO2dCQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxRQUE0QixDQUFDO2dCQUNqQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDZCwyRkFBMkY7b0JBQzNGLFFBQVEsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsQ0FBQztnQkFDRCxPQUFPLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixPQUFPLGdCQUFnQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDdkYsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV4QyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEMsNERBQTREO1FBQzVELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQztRQUN4QixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQzFCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDM0QsQ0FBQztJQUVELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsZUFBZTtBQUNmLDJDQUEyQztBQUMzQyxtQkFBbUI7QUFDbkIsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDeEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBRXBDLE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLGNBQWM7QUFDZCw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMxRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLHFCQUFxQjtBQUNyQixtREFBbUQ7QUFDbkQsY0FBYztBQUNkLGlCQUFpQjtBQUNqQixxREFBcUQ7QUFDckQsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM5RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO0lBQ3BDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFFekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV6QixNQUFNLFVBQVUsR0FBRztRQUNqQixPQUFPLElBQUk7YUFDUixjQUFjLENBQUMsTUFBTSxDQUFDO2FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDakIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsVUFBVSxHQUFHO1lBQ2xCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsRixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFDRCxPQUFPLGtCQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLE9BQU8sVUFBVSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLE9BQU8sVUFBVSxFQUFFLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLDZCQUE2QjtBQUM3QixzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzVFLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFMUQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsYUFBYTtBQUNiLDBDQUEwQztBQUMxQyxnSEFBZ0g7QUFDaEgseUdBQXlHO0FBQ3pHLE1BQU0sQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNwRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsc0NBQXNDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSztZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztnQkFDdkUsS0FBSyxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztnQkFDL0MsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVwRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELGlGQUFpRjtZQUNqRixRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3BELElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQ0QsT0FBTyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDO1NBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNWLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0Ysb0JBQW9CO0FBQ3BCLGtFQUFrRTtBQUNsRSxjQUFjO0FBQ2QsaUhBQWlIO0FBQ2pILHFEQUFxRDtBQUNyRCxpREFBaUQ7QUFDakQsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSwwRkFBMEY7QUFDMUYsMkRBQTJEO0FBQzNELDBIQUEwSDtBQUMxSCxXQUFXO0FBQ1gsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM3RCxNQUFNLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELElBQ0UsQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDaEUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUVyQixPQUFPLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4RSxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0Ysa0JBQWtCO0FBQ2xCLHdEQUF3RDtBQUN4RCxjQUFjO0FBQ2QsNkRBQTZEO0FBQzdELDZFQUE2RTtBQUM3RSx1RUFBdUU7QUFDdkUsNEJBQTRCO0FBQzVCLHdEQUF3RDtBQUN4RCxnRUFBZ0U7QUFDaEUsa0hBQWtIO0FBQ2xILFdBQVc7QUFDWCwrQkFBK0I7QUFDL0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTlCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sa0JBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5RixvRUFBb0U7UUFDcEUsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUN0RixLQUFLLENBQUMsSUFBSSxHQUFHLGdDQUFnQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0YsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLE9BQU8sa0JBQWtCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztTQUM5QyxJQUFJLENBQUMsVUFBVSxNQUFNO1FBQ3BCLE9BQU87WUFDTCxFQUFFLEVBQUUsTUFBTSxDQUFDLGNBQWM7U0FDMUIsQ0FBQztJQUNKLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsT0FBTztBQUNQLHVEQUF1RDtBQUN2RCxvSEFBb0g7QUFDcEgsY0FBYztBQUNkLHNEQUFzRDtBQUN0RCxXQUFXO0FBQ1gsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDM0QsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEUsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN2RixJQUFJLENBQUMsVUFBVSxJQUFJO1FBQ2xCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sZ0JBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFVBQVU7WUFDbEIsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7SUFDSixDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN2RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXJFLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLGdCQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQ0UsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDckIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDOUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVU7WUFDM0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDekIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFDckIsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsZUFBZTtBQUNmLCtDQUErQztBQUMvQyxjQUFjO0FBQ2QsMENBQTBDO0FBQzFDLHVFQUF1RTtBQUN2RSxXQUFXO0FBQ1gsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDeEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFL0UsTUFBTSxPQUFPLEdBQVE7UUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztLQUNoQyxDQUFDO0lBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekcsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLDhCQUE4QjtBQUM5QiwwREFBMEQ7QUFDMUQsNkRBQTZEO0FBQzdELGNBQWM7QUFDZCwwQ0FBMEM7QUFDMUMsd0VBQXdFO0FBQ3hFLFdBQVc7QUFDWCxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3ZFLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLO1NBQ2QsT0FBTyxFQUFFO1NBQ1QsV0FBVyxFQUFFO1NBQ2IsSUFBSSxDQUFDLFVBQVUsT0FBTztRQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUc7WUFDM0MsT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHO1lBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtTQUMxQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQztRQUNKLHNDQUFzQztRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsWUFBWTtBQUNaLDJFQUEyRTtBQUMzRSwwRkFBMEY7QUFDMUYsdUJBQXVCO0FBQ3ZCLDhDQUE4QztBQUM5QywrQ0FBK0M7QUFDL0Msb0NBQW9DO0FBQ3BDLEVBQUU7QUFDRixjQUFjO0FBQ2Qsc0NBQXNDO0FBQ3RDLCtDQUErQztBQUMvQyx3REFBd0Q7QUFDeEQsd0ZBQXdGO0FBQ3hGLGdGQUFnRjtBQUNoRiw0RUFBNEU7QUFDNUUsV0FBVztBQUNYLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3JELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbEUsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUVsRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixXQUFXO0FBQ1gsb0ZBQW9GO0FBQ3BGLDBGQUEwRjtBQUMxRix1QkFBdUI7QUFDdkIsOENBQThDO0FBQzlDLCtDQUErQztBQUMvQyxvQ0FBb0M7QUFDcEMsRUFBRTtBQUNGLGNBQWM7QUFDZCw2RkFBNkY7QUFDN0Ysd0ZBQXdGO0FBQ3hGLGdGQUFnRjtBQUNoRiw0RUFBNEU7QUFDNUUsV0FBVztBQUNYLEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3BELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRWxCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxZQUFZLENBQUM7SUFFakIsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixXQUFXO1FBQ1gsU0FBUztRQUNULGFBQWE7UUFDYiw2QkFBNkI7UUFDN0Isc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxVQUFVO1FBQ1YsVUFBVTtRQUNWLGVBQWU7UUFDZixTQUFTO0tBQ1YsQ0FBQztJQUNGLE1BQU0sb0JBQW9CLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFakUsd0JBQXdCO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUM7U0FDckQsSUFBSSxDQUFDLFVBQVUsV0FBVztRQUN6Qix1QkFBdUI7UUFDdkIsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDaEMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDdEMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtZQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDZix3RUFBd0U7WUFDeEUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1lBQ3hDLFdBQVcsRUFBRSxvQkFBb0I7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLFVBQVUsTUFBTTtRQUNwQixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RixNQUFNLFNBQVMsR0FBRyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsTUFBTSxVQUFVLEdBQUcsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM3QixDQUFDO1FBQ0QsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUVyQiwrRUFBK0U7UUFDL0UsOEVBQThFO1FBQzlFLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxJQUFJO3FCQUNSLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDdkMsSUFBSSxDQUFDO29CQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHO29CQUNqQixXQUFXLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxVQUFVLEdBQUc7b0JBQ2xCLHFCQUFxQjtvQkFDckIsV0FBVyxDQUFDLFlBQVksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsMkJBQTJCO2dCQUMzQixXQUFXLENBQUMsWUFBWSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELElBQUksQ0FBQztRQUNKLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsU0FBUyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsUUFBUTtJQUN0RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVoQyxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQztZQUM1RCxXQUFXLEVBQUUsSUFBSTtZQUNqQixZQUFZLEVBQUUsS0FBSztZQUNuQixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFFLENBQUM7U0FDWCxDQUFDLENBQUM7UUFFSCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3ZFLGdFQUFnRTtRQUNoRSw0REFBNEQ7UUFDNUQsTUFBTSxtQkFBbUIsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7UUFFL0UseURBQXlEO1FBQ3pELHdEQUF3RDtRQUN4RCxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFNUQsT0FBTyxnQkFBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1FBQ3BHLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QjtZQUMxQyxNQUFNLGtCQUFrQixHQUFVLEVBQUUsQ0FBQztZQUVyQyxzRUFBc0U7WUFDdEUsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSxzRUFBc0U7WUFDdEUsSUFBSSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM1RyxJQUFJLGlCQUFpQixHQUFHLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDO1lBRXBFLE9BQU8saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztnQkFDeEUsZ0VBQWdFO2dCQUNoRSxzQ0FBc0M7Z0JBQ3RDLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNwQyxXQUFXLEVBQUUsQ0FBQztvQkFDZCxNQUFNLEVBQUUsaUJBQWlCO29CQUN6QixLQUFLLEVBQUUsV0FBVyxHQUFHLGtCQUFrQixDQUFDLE1BQU07aUJBQy9DLENBQUMsQ0FBUSxDQUFDO2dCQUVYLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsaUNBQWlDO29CQUNqQyxNQUFNO2dCQUNSLENBQUM7Z0JBRUQsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7Z0JBRS9CLHFFQUFxRTtnQkFDckUsc0VBQXNFO2dCQUN0RSx1RUFBdUU7Z0JBQ3ZFLHNFQUFzRTtnQkFDdEUsaUVBQWlFO2dCQUNqRSxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDOUIsNkJBQTZCO29CQUM3QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO3dCQUNsRixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2xCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2hCLENBQUM7b0JBRUQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNqQyxzQkFBc0IsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQztnQkFFSCx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDeEcsaUJBQWlCLEdBQUcsdUJBQXVCLEdBQUcsaUJBQWlCLEdBQUcsc0JBQXNCLENBQUM7WUFDM0YsQ0FBQztZQUVELElBQUksaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLHdEQUF3RDtnQkFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsT0FBTztnQkFDTCxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixXQUFXLEVBQUUsdUJBQXVCO2dCQUNwQyxTQUFTLEVBQUUsTUFBTTthQUNsQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssVUFBVSxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQTBCO1FBQ2xFLE1BQU0sZUFBZSxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLE9BQU8sVUFBVSxNQUFNLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUNiLHlEQUF5RCxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRTtRQUNuQyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEMsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUMsT0FBTyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCwyREFBMkQ7UUFDM0QsK0RBQStEO1FBQy9ELG9FQUFvRTtRQUNwRSxnQ0FBZ0M7UUFDaEMsTUFBTSxLQUFLLENBQUMsNkNBQTZDLGVBQWUsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakgsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRTtRQUN6QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEUsNkVBQTZFO1lBQzdFLE9BQU8sZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLHVCQUFZLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM3RixDQUFDO1FBQ0Qsd0VBQXdFO1FBQ3hFLE9BQU8sZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLHVCQUFZLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEYsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsdUJBQXVCO1FBQ3pDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUvRCxvQkFBb0I7UUFDcEIsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksTUFBTSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLHdHQUF3RztZQUN4RyxNQUFNLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0sS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxNQUFNLENBQUMsYUFBYSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFFRCw2REFBNkQ7UUFDN0QsTUFBTSxhQUFhLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVFLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLGVBQWUsTUFBTSxDQUFDLGFBQWEscUVBQXFFLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBRUQsOERBQThEO1FBQzlELHlEQUF5RDtRQUN6RCwrREFBK0Q7UUFDL0QsZ0VBQWdFO1FBQ2hFLG9CQUFvQjtRQUNwQixNQUFNLGFBQWEsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUQsSUFBSSxrQkFBa0IsQ0FBQztRQUN2QixJQUFJLFdBQVcsQ0FBQztRQUVoQixPQUFPLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLFdBQVcsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFbEMsMkRBQTJEO1lBQzNELG1EQUFtRDtZQUNuRCw2RUFBNkU7WUFDN0Usc0NBQXNDO1lBQ3RDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUMxQixPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUs7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsa0JBQWtCLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3RELDhDQUE4QztnQkFDOUMsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCw0Q0FBNEM7Z0JBQzVDLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxvRUFBb0U7UUFDcEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDL0UsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEQscURBQXFEO1FBQ3JELDJFQUEyRTtRQUMzRSx5Q0FBeUM7UUFDekMsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsNkJBQTZCLGFBQWEsQ0FBQyxLQUFLLEVBQUUscUNBQXFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsa0VBQWtFO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDdkQsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsaURBQWlELFVBQVUsdUNBQXVDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsQ0FDM0gsQ0FBQztRQUNKLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsTUFBTSxvQkFBb0IsR0FDeEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxDQUFDO1FBRTFGLElBQUksV0FBVyxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DLENBQUM7UUFFRixJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztZQUM5QixNQUFNLEVBQUUsV0FBVztZQUNuQixTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUc7WUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFdBQVc7U0FDWixDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFM0MsK0VBQStFO1FBQy9FLDRGQUE0RjtRQUM1RixzQ0FBc0M7UUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDO1FBRXJFLElBQUksV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDakQsZ0VBQWdFO1lBQ2hFLHdEQUF3RDtZQUN4RCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLHNCQUFzQixDQUFDO2dCQUMxRSxNQUFNLEVBQUUsV0FBVztnQkFDbkIsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLEtBQUs7Z0JBQ3BDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxxQkFBcUI7Z0JBQ3pDLFdBQVc7YUFDWixDQUFDLENBQUM7WUFDSCxRQUFRLEdBQUcsV0FBVyxDQUFDO1lBQ3ZCLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCw2REFBNkQ7UUFDN0QsOERBQThEO1FBQzlELHNEQUFzRDtRQUN0RCxzQ0FBc0M7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sYUFBYSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDL0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDNUMsNkRBQTZEO1FBQzdELE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUU3RCxJQUFJLGVBQWUsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRCxlQUFlLHVDQUF1QyxVQUFVLFNBQVMsQ0FDckksQ0FBQztRQUNKLENBQUM7UUFFRCwyREFBMkQ7UUFDM0Qsb0VBQW9FO1FBQ3BFLDJFQUEyRTtRQUMzRSwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ25GLHNDQUFzQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLHNDQUFzQztRQUN0QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV2RSxvQ0FBb0M7UUFDcEMsc0NBQXNDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQzdDLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87b0JBQzlCLE1BQU0sRUFBRSxZQUFZO2lCQUNyQjthQUNGO1lBQ0QsR0FBRyxFQUFFLFFBQVE7WUFDYixRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxFQUFFLEVBQUU7YUFDWjtZQUNELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzFDLENBQUMsQ0FBQztRQUVILDBEQUEwRDtRQUMxRCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDcEQsSUFBSSxZQUFZLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFDOUIsc0VBQXNFO1lBQ3RFLDRGQUE0RjtZQUM1RixFQUFFLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQztTQUNDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsRUFBRTtBQUNGLDJCQUEyQjtBQUMzQixxREFBcUQ7QUFDckQsRUFBRTtBQUNGLGNBQWM7QUFDZCx5REFBeUQ7QUFDekQsd0ZBQXdGO0FBQ3hGLDRFQUE0RTtBQUM1RSxXQUFXO0FBQ1gsRUFBRTtBQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUNwRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLHVCQUF1QixJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUNsRixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQVEsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUV0Qyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsc0NBQXNDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLFdBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGlDQUFpQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELHNFQUFzRTtZQUN0RSxzQ0FBc0M7WUFDdEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsc0NBQXNDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUM5RCxJQUFJLGdCQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLHNDQUFzQztnQkFDdEMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDekcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFFRCxXQUFXLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDckQsc0NBQXNDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUN0QixHQUFHO1lBQ0gsT0FBTztZQUNQLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixRQUFRO1lBQ1IsV0FBVztZQUNYLGFBQWE7WUFDYixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO1NBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNWLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsK0JBQStCO0FBQy9CLDBEQUEwRDtBQUMxRCxrRkFBa0Y7QUFDbEYsd0VBQXdFO0FBQ3hFLDJHQUEyRztBQUMzRyw2RkFBNkY7QUFDN0YsRUFBRTtBQUNGLGNBQWM7QUFDZCxrQ0FBa0M7QUFDbEMsMENBQTBDO0FBQzFDLHdGQUF3RjtBQUN4RixXQUFXO0FBQ1gsb0RBQW9EO0FBQ3BELEVBQUU7QUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLDRCQUE0QixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDeEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFdEIsb0RBQW9EO0lBQ3BELElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFFbEIsc0NBQXNDO0lBQ3RDLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxRQUFRO1lBQzVELHlDQUF5QztZQUN6QyxJQUFJLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzNHLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLGdCQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzdGLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLElBQUksSUFBSSxDQUFDO0lBQ1QsSUFBSSxDQUFDO1FBQ0gsSUFBSSxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsZ0JBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSztTQUNkLFNBQVMsRUFBRTtTQUNYLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNuQixJQUFJLENBQUMsVUFBVSxRQUFRO1FBQ3RCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sa0JBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ2pDLGtEQUFrRDtRQUNsRCxtRkFBbUY7UUFDbkYsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDbEMsbURBQW1EO1FBQ25ELE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDN0Isb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQ7Ozs7Ozs7O1dBUUc7UUFDSCxNQUFNLGtDQUFrQyxHQUFHLFVBQVUsS0FBSyxFQUFFLFNBQVM7WUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDL0MsK0JBQStCO1lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsMkRBQTJEO1lBQzNELGdCQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELG1EQUFtRDtZQUNuRCxnQkFBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUMsbURBQW1EO1lBQ25ELDBGQUEwRjtZQUMxRixJQUFJLElBQUEsZ0JBQUMsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEtBQUssSUFBSSxJQUFBLGdCQUFDLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUVGLCtFQUErRTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFRLENBQUM7UUFDL0UsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsMERBQTBEO1FBQzFELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixxR0FBcUc7UUFDckcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLHNCQUFzQixFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQkFBQyxFQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV0RCw2REFBNkQ7UUFDN0QsTUFBTSxRQUFRLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXpCLHdEQUF3RDtRQUN4RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUMvRSxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxrQkFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVELGdGQUFnRjtRQUNoRixNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0Usc0ZBQXNGO1FBQ3RGLFFBQVEsQ0FBQyxVQUFVLEdBQUcsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hGLFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzlCLDRHQUE0RztRQUM1RyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixpRkFBaUY7WUFDakYsdUVBQXVFO1lBQ3ZFLG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkQseUdBQXlHO2dCQUN6RyxNQUFNLFdBQVcsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNuRSxLQUFLLENBQUMsT0FBTyxJQUFJLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDNUUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM5QyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUQsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDekMsUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUM1QyxDQUFDO1lBRUQsa0RBQWtEO1lBQ2xELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDNUMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3hCLE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDO1lBQ25DLFFBQVEsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLHFHQUFxRztZQUNyRywwRUFBMEU7WUFDMUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsYUFBYTtZQUNsRSwwREFBMEQ7WUFDMUQsTUFBTSxxQkFBcUIsR0FBRyxrQ0FBa0MsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEYseURBQXlEO1lBQ3pELFFBQVEsQ0FBQyxVQUFVLEdBQUcsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLFdBQVcsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxPQUFPLElBQUksb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUVELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUQsb0ZBQW9GO1FBQ3BGLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLFFBQVE7UUFDeEUsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMvRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUV4RSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO1NBQU0sSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxvRkFBb0Y7UUFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUM1QixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUM7SUFDekQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsNkVBQTZFO1FBQzdFLGFBQWEsR0FBRyxlQUFlLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7SUFDeEcsQ0FBQztTQUFNLElBQUksYUFBYSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQ0UsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkYsaUJBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDM0IsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDbEMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsc0RBQXNEO1FBQ3RELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBWSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUYsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE9BQU8sR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLG9FQUFvRTtZQUNwRSxPQUFPLENBQUMsR0FBRyxDQUNULDBDQUEwQztnQkFDeEMsT0FBTztnQkFDUCxrR0FBa0csQ0FDckcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBRXZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUUzQjs7O09BR0c7SUFDSCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDdkMsTUFBTSx5QkFBeUIsR0FBVSxFQUFFLENBQUM7UUFDNUMsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDakMsY0FBYyxFQUFFLENBQUM7UUFDakI7Ozs7Ozs7Ozs7V0FVRztRQUVILE1BQU0sV0FBVyxHQUFRO1lBQ3ZCLEtBQUssRUFBRSxNQUFNLEdBQUcsYUFBYTtZQUM3QixXQUFXLEVBQUUsV0FBVztZQUN4QixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsV0FBVyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBUSxDQUFDO1FBQzlELDBEQUEwRDtRQUMxRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLDBEQUEwRDtnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO1lBQzNGLENBQUM7aUJBQU0sQ0FBQztnQkFDTix5R0FBeUc7Z0JBQ3pHLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFFNUMsc0RBQXNEO1FBQ3RELHVFQUF1RTtRQUN2RSxJQUFJLGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEUsNkZBQTZGO1FBQzdGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFN0QsdUdBQXVHO1FBQ3ZHLHNFQUFzRTtRQUN0RSxvQkFBb0IsR0FBRyxVQUFVLEtBQUssZ0JBQWdCLElBQUksY0FBYyxLQUFLLGlCQUFpQixDQUFDO1FBRS9GLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFRLENBQUM7UUFDakcsTUFBTSxRQUFRLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNsQywrREFBK0Q7UUFDL0QsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQkFBQyxFQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGNBQWM7UUFFdEUsUUFBUSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDakMsUUFBUSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDekIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3RELFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBRUQsd0ZBQXdGO1FBQ3hGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLG9EQUFvRDtZQUNwRCxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELHlHQUF5RztnQkFDekcsTUFBTSxXQUFXLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbkUsS0FBSyxDQUFDLE9BQU8sSUFBSSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVFLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDOUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxRCxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxRQUFRLElBQUksUUFBUSxDQUFDO2dCQUNyQixRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzVDLENBQUM7WUFFRCxvRkFBb0Y7WUFDcEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RyxrREFBa0Q7WUFDbEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDeEIsT0FBTyxRQUFRLENBQUMsa0JBQWtCLENBQUM7WUFFbkMsNEJBQTRCO1lBQzVCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUM3RCxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDdEQsQ0FBQztRQUNELDJHQUEyRztRQUMzRyxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLFdBQVcsR0FBRyxnQkFBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxPQUFPLElBQUksb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUNELHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLGdCQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO2dCQUNmLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixLQUFLLEVBQUUsa0JBQWtCO2FBQzFCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLGtHQUFrRztZQUNsRywyREFBMkQ7WUFDM0QsMEdBQTBHO1lBQzFHLE1BQU0sa0JBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IseUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUksQ0FBQyxNQUFNLG9CQUFvQixFQUFFLENBQVMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCx1RkFBdUY7UUFDdkYsT0FBTyx5QkFBeUIsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sb0JBQW9CLEVBQUU7U0FDMUIsS0FBSyxDQUFDLFVBQVUsR0FBRztRQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3ZELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRW5HLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV6RixJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLGNBQWMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLO1NBQ2QsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztTQUNwRCxJQUFJLENBQUMsVUFBVSxNQUFNO1FBQ3BCLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxRQUFRO2dCQUM5RCx5Q0FBeUM7Z0JBQ3pDLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztvQkFDdkQsQ0FBQztvQkFDRCxJQUFJLENBQUM7d0JBQ0gsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUMzRyxDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO29CQUNyRCxDQUFDO29CQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQWEsR0FBRSxDQUFDO29CQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFlLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUV4RixjQUFjLEdBQUc7d0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO3dCQUNuQixhQUFhLEVBQUUsZ0JBQWdCO3dCQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUMzQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07d0JBQ3hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtxQkFDbkIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDO1FBV0osTUFBTSxPQUFPLEdBQVk7WUFDdkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtTQUNsQyxDQUFDO1FBQ0YsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN0RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdEQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FDckIsSUFBSSxDQUFDLEtBQUs7U0FDUCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDLElBQUksRUFBRTtTQUNOLE1BQU0sRUFBRSxDQUNaLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDckQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakcsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRCxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFckUsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVHLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM1RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1RyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3hELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ25HLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUMzRCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXhGLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUV4RCxJQUFJLENBQUMsU0FBUyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUNqRixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixvQ0FBb0M7SUFFcEMsd0RBQXdEO0lBQ3hELE1BQU0sY0FBYyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFdkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUNyQixJQUFJLENBQUMsS0FBSztTQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUM7U0FDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQztTQUNwQixNQUFNLEVBQUUsQ0FDWixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3RELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFN0QsT0FBTyxrQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFHLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU3RCxPQUFPLGtCQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekcsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN2RCxpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVoRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0lBRTNDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLG9HQUFvRztRQUNwRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2QsT0FBTyxFQUFFLGlCQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLHNCQUFzQjtZQUNuRixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDckMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUUxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDaEUsT0FBTztZQUNMLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYTtZQUMvQixHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUc7WUFDWCxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87U0FDcEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUM1RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTVELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1RyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDNUQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXBELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1RyxDQUFDLENBQUM7QUFFRixFQUFFO0FBQ0YsY0FBYztBQUNkLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtJQUN2RCxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixpQkFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sa0JBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3RyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7S0FRSztBQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssV0FBVyxNQUFNO0lBQy9DLElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMzRSxJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxnQ0FBcUIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyx1QkFBWSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xELE1BQU0sZUFBZSxHQUNuQix1QkFBWSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsR0FBRyx1QkFBWSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN2RyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTdGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixVQUFVO1FBQ1YsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztLQUM5QixDQUFDLENBQUM7SUFFSCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JILElBQUEsZ0JBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBQSxnQkFBTSxFQUFDLGdCQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFakgsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN0RyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUU3RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFHLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QyxHQUFHLFVBQVU7UUFDYixjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDL0IsVUFBVSxFQUFFLGNBQWM7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGOzs7Ozs7O0tBT0s7QUFDTCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLFdBQVcsTUFBTTtJQUM3QyxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLGdCQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBSSxnQkFBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksZ0JBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMzRSxJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxnQ0FBcUIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyx1QkFBWSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xELE1BQU0sZUFBZSxHQUNuQix1QkFBWSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsR0FBRyx1QkFBWSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN2RyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTdGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixVQUFVO1FBQ1YsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztLQUM5QixDQUFDLENBQUM7SUFFSCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JILElBQUEsZ0JBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBQSxnQkFBTSxFQUFDLGdCQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFakgsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN0RyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUU3RixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsaUJBQVMsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBXYWxsZXQgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciBmb3IgYSBzcGVjaWZpYyB3YWxsZXRcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2l6ZXMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0TmV0d29yayxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgQmx1ZWJpcmQgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNpZ25Qc2J0UmVxdWVzdCB9IGZyb20gJy4vc2lnblBzYnQnO1xuXG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuY29uc3QgUGVuZGluZ0FwcHJvdmFsID0gcmVxdWlyZSgnLi9wZW5kaW5nYXBwcm92YWwnKTtcblxuY29uc3QgY28gPSBCbHVlYmlyZC5jb3JvdXRpbmU7XG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBnZXRJbnRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gdXR4b2xpYi5iaXRnbztcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFdhbGxldCA9IGZ1bmN0aW9uIChiaXRnbywgd2FsbGV0KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICh0aGlzLmJpdGdvIGFzIGFueSkgPSBiaXRnbztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMua2V5Y2hhaW5zID0gW107XG5cbiAgaWYgKHdhbGxldC5wcml2YXRlKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLmtleWNoYWlucyA9IHdhbGxldC5wcml2YXRlLmtleWNoYWlucztcbiAgfVxufTtcblxuV2FsbGV0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldDtcbn07XG5cbi8vXG4vLyBpZFxuLy8gR2V0IHRoZSBpZCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuaWQ7XG59O1xuXG4vL1xuLy8gbGFiZWxcbi8vIEdldCB0aGUgbGFiZWwgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmxhYmVsO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5iYWxhbmNlO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHVuY29uZmlybWVkIGFuZCBleHRlcm5hbFxuLy9cbldhbGxldC5wcm90b3R5cGUuc3BlbmRhYmxlQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY29uZmlybWVkQmFsYW5jZVxuLy8gR2V0IHRoZSBjb25maXJtZWRCYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybWVkQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY2FuU2VuZEluc3RhbnRcbi8vIFJldHVybnMgaWYgdGhlIHdhbGxldCBjYW4gc2VuZCBpbnN0YW50IHRyYW5zYWN0aW9uc1xuLy8gVGhpcyBpcyBpbXBhY3RlZCBieSB0aGUgY2hvaWNlIG9mIGJhY2t1cCBrZXkgcHJvdmlkZXJcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNhblNlbmRJbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQgJiYgdGhpcy53YWxsZXQuY2FuU2VuZEluc3RhbnQ7XG59O1xuXG4vL1xuLy8gaW5zdGFudCBiYWxhbmNlXG4vLyBHZXQgdGhlIGluc3RhbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyB0aGF0IG1heSBiZSBzcGVudCBpbnN0YW50bHkuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pbnN0YW50QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhblNlbmRJbnN0YW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhbiBpbnN0YW50IHdhbGxldCcpO1xuICB9XG4gIHJldHVybiB0aGlzLndhbGxldC5pbnN0YW50QmFsYW5jZTtcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFNlbmRzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRTZW5kcyBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkU2VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFNlbmRzO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkUmVjZWl2ZXNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFJlY2VpdmVzIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFJlY2VpdmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRSZWNlaXZlcztcbn07XG5cbi8vXG4vLyB0eXBlXG4vLyBHZXQgdGhlIHR5cGUgb2YgdGhpcyB3YWxsZXQsIGUuZy4gJ3NhZmVoZCdcbi8vXG5XYWxsZXQucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC50eXBlO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAoZXh0cmEpIHtcbiAgZXh0cmEgPSBleHRyYSB8fCAnJztcbiAgcmV0dXJuIHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG59O1xuXG4vL1xuLy8gcGVuZGluZ0FwcHJvdmFsc1xuLy8gcmV0dXJucyB0aGUgcGVuZGluZyBhcHByb3ZhbHMgbGlzdCBmb3IgdGhpcyB3YWxsZXQgYXMgcGVuZGluZyBhcHByb3ZhbCBvYmplY3RzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5wZW5kaW5nQXBwcm92YWxzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwoc2VsZi5iaXRnbywgcCwgc2VsZik7XG4gIH0pO1xufTtcblxuLy9cbi8vIGFwcHJvdmFsc1JlcXVpcmVkXG4vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIHRvIGFwcHJvdmUgcGVuZGluZyBhcHByb3ZhbHMgaW52b2x2aW5nIHRoaXMgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkIHx8IDE7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBSZWZldGNoZXMgdGhpcyB3YWxsZXQgYW5kIHJldHVybnMgaXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogQmx1ZWJpcmQ8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgpKVxuICAgICAgLnJlc3VsdCgpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHNlbGYud2FsbGV0ID0gcmVzO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH0pXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdXBkYXRlQXBwcm92YWxzUmVxdWlyZWRcbi8vIFVwZGF0ZXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgb24gYSBwZW5kaW5nIGFwcHJvdmFsIGludm9sdmluZyB0aGlzIHdhbGxldC5cbi8vIFRoZSBhcHByb3ZhbHMgcmVxdWlyZWQgaXMgYnkgZGVmYXVsdCAxLCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGVcbi8vIG51bWJlciBzdWNoIHRoYXQgMSA8PSBhcHByb3ZhbHNSZXF1aXJlZCA8PSB3YWxsZXRBZG1pbnMubGVuZ3RoIC0gMVxuLy9cbldhbGxldC5wcm90b3R5cGUudXBkYXRlQXBwcm92YWxzUmVxdWlyZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjayk6IEJsdWViaXJkPGFueT4ge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoXG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkID09PSB1bmRlZmluZWQgfHxcbiAgICAhXy5pc0ludGVnZXIocGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB8fFxuICAgIHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCA8IDFcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFwcHJvdmFsc1JlcXVpcmVkOiBtdXN0IGJlIGEgbm9uemVybyBwb3NpdGl2ZSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBjb25zdCBjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPSB0aGlzLmFwcHJvdmFsc1JlcXVpcmVkKCk7XG4gIGlmIChjdXJyZW50QXBwcm92YWxzUmVxdWlyZWQgPT09IHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCkge1xuICAgIC8vIG5vLW9wLCBqdXN0IHJldHVybiB0aGUgY3VycmVudCB3YWxsZXRcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLndhbGxldDtcbiAgICB9KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvcnJlY3QgY2hhaW4gZm9yIGNoYW5nZSwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBzZWd3aXRcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRDaGFuZ2VDaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IHVzZVNlZ3dpdENoYW5nZSA9ICEhdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdENoYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2Vnd2l0Q2hhbmdlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgc2Vnd2l0IGlzIGRpc2FibGVkIHRocm91Z2ggdGhlIGNvbnN0YW50cywgc2Vnd2l0IGNoYW5nZSBzaG91bGQgc3RpbGwgbm90IGJlIGNyZWF0ZWRcbiAgICB1c2VTZWd3aXRDaGFuZ2UgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdCAmJiBwYXJhbXMuc2Vnd2l0Q2hhbmdlO1xuICB9XG4gIHJldHVybiB1c2VTZWd3aXRDaGFuZ2UgPyBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRJbnRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFkZHJlc3Ncbi8vIENyZWF0ZXMgYSBuZXcgYWRkcmVzcyBmb3IgdXNlIHdpdGggdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmICh0aGlzLnR5cGUoKSA9PT0gJ3NhZmUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHVzaW5nIGEgbGVnYWN5IHdhbGxldCB0aGF0IGNhbm5vdCBjcmVhdGUgYSBuZXcgYWRkcmVzcycpO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBjbGllbnQtc2lkZSBhZGRyZXNzIHZhbGlkYXRpb24gb24sIGZvciBzYWZldHkuIFVzZSB2YWxpZGF0ZT1mYWxzZSB0byBkaXNhYmxlLlxuICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuXG4gIGNvbnN0IGFsbG93RXhpc3RpbmcgPSBwYXJhbXMuYWxsb3dFeGlzdGluZztcbiAgaWYgKHR5cGVvZiBhbGxvd0V4aXN0aW5nICE9PSAnYm9vbGVhbicpIHtcbiAgICBwYXJhbXMuYWxsb3dFeGlzdGluZyA9IGFsbG93RXhpc3RpbmcgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGlzU2Vnd2l0ID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQ7XG4gIGNvbnN0IGRlZmF1bHRDaGFpbiA9IGlzU2Vnd2l0ID8gZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2hQMndzaCcpIDogZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcblxuICBsZXQgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiA9PT0gbnVsbCB8fCBjaGFpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2hhaW4gPSBkZWZhdWx0Q2hhaW47XG4gIH1cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy9hZGRyZXNzLycgKyBjaGFpbikpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChhZGRyKSB7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgIHNlbGYudmFsaWRhdGVBZGRyZXNzKGFkZHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgfSlcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYWRkcmVzcyBsb2NhbGx5IHdpdGhvdXQgY2FsbGluZyBzZXJ2ZXJcbiAqIEBwYXJhbSBwYXJhbXNcbiAqXG4gKi9cbldhbGxldC5wcm90b3R5cGUuZ2VuZXJhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHsgc2Vnd2l0LCBwYXRoLCBrZXljaGFpbnMsIHRocmVzaG9sZCB9KSB7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFzZWd3aXQ7XG4gIGxldCBzaWduYXR1cmVUaHJlc2hvbGQgPSAyO1xuICBpZiAoXy5pc0ludGVnZXIodGhyZXNob2xkKSkge1xuICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhyZXNob2xkIGhhcyB0byBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhdGhSZWdleCA9IC9eXFwvMT9bMDFdXFwvXFxkKyQvO1xuICBpZiAoIXBhdGgubWF0Y2gocGF0aFJlZ2V4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgcGF0aDogJyArIHBhdGgpO1xuICB9XG5cbiAgbGV0IHJvb3RLZXlzID0gdGhpcy5rZXljaGFpbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGtleWNoYWlucykpIHtcbiAgICByb290S2V5cyA9IGtleWNoYWlucztcbiAgfVxuXG4gIGNvbnN0IG5ldHdvcmsgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5ldHdvcms7XG5cbiAgY29uc3QgZGVyaXZlZEtleXMgPSByb290S2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICBjb25zdCBoZG5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGsueHB1Yik7XG4gICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBrLnBhdGggKyAoay53YWxsZXRTdWJQYXRoIHx8ICcnKSArIHBhdGg7XG4gICAgcmV0dXJuIGhkbm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChkZXJpdmF0aW9uUGF0aCkpLnB1YmxpY0tleTtcbiAgfSk7XG5cbiAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoQ29tcG9uZW50cyA9IF8ubWFwKHBhdGhDb21wb25lbnRzLCAoY29tcG9uZW50KSA9PiB7XG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbXBvbmVudCwgMTApO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHBhdGhEZXRhaWxzID0gXy5maWx0ZXIobm9ybWFsaXplZFBhdGhDb21wb25lbnRzLCBfLmlzSW50ZWdlcik7XG5cbiAgY29uc3QgYWRkcmVzc0RldGFpbHM6IGFueSA9IHtcbiAgICBjaGFpblBhdGg6IHBhdGgsXG4gICAgcGF0aDogcGF0aCxcbiAgICBjaGFpbjogcGF0aERldGFpbHNbMF0sXG4gICAgaW5kZXg6IHBhdGhEZXRhaWxzWzFdLFxuICAgIHdhbGxldDogdGhpcy5pZCgpLFxuICB9O1xuXG4gIGNvbnN0IHtcbiAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICByZWRlZW1TY3JpcHQsXG4gICAgd2l0bmVzc1NjcmlwdCxcbiAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRLZXlzLCBpc1NlZ3dpdCA/ICdwMnNoUDJ3c2gnIDogJ3Ayc2gnKTtcblxuICBhZGRyZXNzRGV0YWlscy53aXRuZXNzU2NyaXB0ID0gd2l0bmVzc1NjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5yZWRlZW1TY3JpcHQgPSByZWRlZW1TY3JpcHQ/LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMub3V0cHV0U2NyaXB0ID0gb3V0cHV0U2NyaXB0LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgZ2V0TmV0d29yayhuZXR3b3JrKSk7XG5cbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzO1xufTtcblxuLy9cbi8vIHZhbGlkYXRlQWRkcmVzc1xuLy8gVmFsaWRhdGVzIGFuIGFkZHJlc3MgYW5kIHBhdGggYnkgY2FsY3VsYXRpbmcgaXQgbG9jYWxseSBmcm9tIHRoZSBrZXljaGFpbiB4cHVic1xuLy9cbldhbGxldC5wcm90b3R5cGUudmFsaWRhdGVBZGRyZXNzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnLCAncGF0aCddLCBbXSk7XG4gIGNvbnN0IGlzU2Vnd2l0ID0gISFwYXJhbXMud2l0bmVzc1NjcmlwdCAmJiBwYXJhbXMud2l0bmVzc1NjcmlwdC5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IGdlbmVyYXRlZEFkZHJlc3MgPSB0aGlzLmdlbmVyYXRlQWRkcmVzcyh7IHBhdGg6IHBhcmFtcy5wYXRoLCBzZWd3aXQ6IGlzU2Vnd2l0IH0pO1xuICBpZiAoZ2VuZXJhdGVkQWRkcmVzcy5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICcgKyBwYXJhbXMuYWRkcmVzcyArICcgdnMuICcgKyBnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MpO1xuICB9XG59O1xuXG4vL1xuLy8gYWRkcmVzc2VzXG4vLyBHZXRzIHRoZSBhZGRyZXNzZXMgb2YgYSBIRCB3YWxsZXQuXG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgbGltaXQ6IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzIHRvIGdldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYWRkcmVzc2VzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gIGlmIChwYXJhbXMuZGV0YWlscykge1xuICAgIHF1ZXJ5LmRldGFpbHMgPSAxO1xuICB9XG5cbiAgY29uc3QgY2hhaW4gPSBwYXJhbXMuY2hhaW47XG4gIGlmIChjaGFpbiAhPT0gbnVsbCAmJiBjaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhaW4pKSB7XG4gICAgICBxdWVyeS5jaGFpbiA9IF8udW5pcShfLmZpbHRlcihjaGFpbiwgXy5pc0ludGVnZXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoYWluICE9PSAwICYmIGNoYWluICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaGFpbiBhcmd1bWVudCwgZXhwZWN0aW5nIDAgb3IgMScpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG4gIH1cbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5za2lwID0gcGFyYW1zLnNraXA7XG4gIH1cbiAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzZXMnKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zdGF0cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9zdGF0cycgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7V2FsbGV0fVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICAvLyB3aGVuIHNldCB0byB0cnVlLCBncGsgcmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHNhZmUgd2FsbGV0c1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5leHRlbmQoe30sIF8ucGljayhwYXJhbXMsIFsnZ3BrJ10pKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMud2FsbGV0ID0gcmVzO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkcmVzc1xuLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBhZGRyZXNzIG9uIGEgSEQgd2FsbGV0LlxuLy8gSW5mb3JtYXRpb24gaW5jbHVkZXMgaW5kZXgsIHBhdGgsIHJlZGVlbVNjcmlwdCwgc2VudCwgcmVjZWl2ZWQsIHR4Q291bnQgYW5kIGJhbGFuY2Vcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBhZGRyZXNzOiB0aGUgYWRkcmVzcyBvbiB0aGlzIHdhbGxldCB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZyZWV6ZSB0aGUgd2FsbGV0IGZvciBhIGR1cmF0aW9uIG9mIGNob2ljZSwgc3RvcHBpbmcgQml0R28gZnJvbSBzaWduaW5nIGFueSB0cmFuc2FjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIGR1cmF0aW9uIHRvIGZyZWV6ZSB0aGUgd2FsbGV0IGZvciBpbiBzZWNvbmRzLCBkZWZhdWx0cyB0byAzNjAwLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmZyZWV6ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb24gLSBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVcbi8vIERlbGV0ZXMgdGhlIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgpKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGFiZWxzXG4vLyBMaXN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhZGRyZXNzZXMgaW4gYSBnaXZlbiB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVscyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoJ2xhYmVscycpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVuYW1lIGEgd2FsbGV0XG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgLSBsYWJlbDogdGhlIHdhbGxldCdzIGludGVuZGVkIG5ldyBuYW1lXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNldFdhbGxldE5hbWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpKTtcbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodXJsKS5zZW5kKHsgbGFiZWw6IHBhcmFtcy5sYWJlbCB9KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2V0TGFiZWxcbi8vIFNldHMgYSBsYWJlbCBvbiB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVMYWJlbFxuLy8gRGVsZXRlcyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHVybCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVuc3BlbnRzXG4vLyBMaXN0IEFMTCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHBhZ2VkIGxpc3Qgb2YgYWxsIHVuc3BlbnRzXG4vL1xuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBsaW1pdDogIHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuLy8gICBtaW5Db25mOiBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbi8vICAgdGFyZ2V0OiB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4vLyAgIGluc3RhbnQ6IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuLy9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFsbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjb25zdCBnZXRVbnNwZW50c0JhdGNoID0gZnVuY3Rpb24gKHNraXAsIGxpbWl0Pykge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcbiAgICBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LnNraXAgPSBza2lwO1xuICAgIH1cbiAgICBpZiAobGltaXQgJiYgbGltaXQgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnVuc3BlbnRzUGFnZWQocXVlcnlPYmplY3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gVGhlIEFQSSBoYXMgaXRzIG93biBsaW1pdCBoYW5kbGluZy4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdHMgYmlnZ2VyIHRoYW4gNTAwLiBJZiB0aGUgbGltaXRcbiAgICAgIC8vIHNwZWNpZmllZCBoZXJlIGlzIGJpZ2dlciB0aGFuIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBkbyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIG5lY2Vzc2FyeSBsaW1pdCBhZGp1c3RtZW50LlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudW5zcGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlc3VsdC51bnNwZW50c1tpXTtcbiAgICAgICAgYWxsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3VyIGxpbWl0IGFkanVzdG1lbnQgbWFrZXMgc3VyZSB0aGF0IHdlIG5ldmVyIGZldGNoIG1vcmUgdW5zcGVudHMgdGhhbiB3ZSBuZWVkLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGl0IHRoZVxuICAgICAgLy8gbGltaXQsIHdlIGhpdCBpdCBwcmVjaXNlbHlcbiAgICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gcGFyYW1zLmxpbWl0KSB7XG4gICAgICAgIHJldHVybiBhbGxVbnNwZW50czsgLy8gd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYW55IGZ1cnRoZXIgdW5zcGVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG90YWxVbnNwZW50Q291bnQgPSByZXN1bHQudG90YWw7XG4gICAgICAvLyBpZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgU0RLIGluZGljYXRlcyB0aGF0IHRoZXJlIGhhcyBiZWVuIGEgbGltaXQsIHdlIG5lZWQgdG8gZmV0Y2ggYW5vdGhlciBiYXRjaFxuICAgICAgaWYgKCFwYXJhbXMudGFyZ2V0ICYmIHRvdGFsVW5zcGVudENvdW50ICYmIHRvdGFsVW5zcGVudENvdW50ID4gYWxsVW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgLy8gbGV0J3MganVzdCBvZmZzZXQgdGhlIGN1cnJlbnQgc2tpcCBieSB0aGUgY291bnRcbiAgICAgICAgY29uc3QgbmV3U2tpcCA9IHNraXAgKyByZXN1bHQuY291bnQ7XG4gICAgICAgIGxldCBuZXdMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobGltaXQgPiAwKSB7XG4gICAgICAgICAgLy8gd2Ugc2V0IHRoZSBuZXcgbGltaXQgdG8gYmUgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgbWlzc2luZyB1bnNwZW50cyB0byBoaXQgb3VyIG93biBsaW1pdFxuICAgICAgICAgIG5ld0xpbWl0ID0gbGltaXQgLSBhbGxVbnNwZW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2gobmV3U2tpcCwgbmV3TGltaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsVW5zcGVudHM7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2goMCwgcGFyYW1zLmxpbWl0KS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogTGlzdCB0aGUgdW5zcGVudHMgKHBhZ2VkKSBmb3IgYSBnaXZlbiB3YWxsZXQsIHJldHVybmluZyB0aGUgcmVzdWx0IGFzIGFuIG9iamVjdCBvZiB1bnNwZW50cywgY291bnQsIHNraXAgYW5kIHRvdGFsXG4gKiBUaGlzIG1ldGhvZCBtYXkgbm90IHJldHVybiBhbGwgdGhlIHVuc3BlbnRzIGFzIHRoZSBsaXN0IGlzIHBhZ2VkIGJ5IHRoZSBBUElcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMubGltaXQgdGhlIG9wdGlvbmFsIGxpbWl0IG9mIHVuc3BlbnRzIHRvIGNvbGxlY3QgaW4gQlRDXG4gKiBAcGFyYW0gcGFyYW1zLnNraXAgaW5kZXggaW4gbGlzdCBvZiB1bnNwZW50cyB0byBzdGFydCBwYWdpbmcgZnJvbVxuICogQHBhcmFtIHBhcmFtcy5taW5Db25maXJtcyBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0IHRoZSBhbW91bnQgb2YgYnRjIHRvIGZpbmQgdG8gc3BlbmRcbiAqIEBwYXJhbSBwYXJhbXMuaW5zdGFudCBvbmx5IGZpbmQgaW5zdGFudCB0cmFuc2FjdGlvbnMgKG11c3Qgc3BlY2lmeSBhIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgZGVzaXJlZCBudW1iZXIgb2YgdW5zcGVudHMgdG8gaGF2ZSBpbiB0aGUgd2FsbGV0IGFmdGVyIHRoZSB0eCBnb2VzIHRocm91Z2ggKHJlcXVpcmVzIHRhcmdldClcbiAqIEBwYXJhbSBwYXJhbXMubWluU2l6ZSBtaW5pbXVtIHVuc3BlbnQgc2l6ZSBpbiBzYXRvc2hpc1xuICogQHBhcmFtIHBhcmFtcy5zZWd3aXQgcmVxdWVzdCBzZWd3aXQgdW5zcGVudHMgKGRlZmF1bHRzIHRvIHRydWUgaWYgdW5kZWZpbmVkKVxuICogQHBhcmFtIHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCBhbGxvdyBzZWd3aXQgdW5zcGVudHMgZm9yIGxlZGdlciBkZXZpY2VzIChkZWZhdWx0cyB0byBmYWxzZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnVuc3BlbnRzUGFnZWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2tpcCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzSW50ZWdlcihwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSAmJiAhXy5pc051bWJlcihwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RhbnQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgZmxhZyAtIHNob3VsZCBiZSBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFyZ2V0V2FsbGV0VW5zcGVudHMgZmxhZyAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pblNpemUpICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5TaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogbWluU2l6ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdvbmx5IG9uZSBvZiBpbnN0YW50IGFuZCBtaW5Db25maXJtcyBtYXkgYmUgZGVmaW5lZCcpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldFdhbGxldFVuc3BlbnRzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgdGFyZ2V0Jyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQ6IGFsbG93TGVkZ2VyU2Vnd2l0IG11c3QgYmUgYSBib29sZWFuJyk7XG4gIH1cblxuICBjb25zdCBxdWVyeU9iamVjdCA9IF8uY2xvbmVEZWVwKHBhcmFtcyk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgLy8gc2tpcCBhbmQgbGltaXQgYXJlIHVuYXZhaWxhYmxlIHdoZW4gYSB0YXJnZXQgaXMgc3BlY2lmaWVkXG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LnNraXA7XG4gICAgZGVsZXRlIHF1ZXJ5T2JqZWN0LmxpbWl0O1xuICB9XG5cbiAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gdHJ1ZTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3Quc2Vnd2l0ID0gcGFyYW1zLnNlZ3dpdDtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpKSB7XG4gICAgcXVlcnlPYmplY3QuYWxsb3dMZWRnZXJTZWd3aXQgPSBwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQ7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25zXG4vLyBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBPcHRpb25zIGluY2x1ZGU6XG4vLyAgICAgVE9ETzogIEFkZCBpdGVyYXRvcnMgZm9yIHN0YXJ0L2NvdW50L2V0Y1xuV2FsbGV0LnByb3RvdHlwZS50cmFuc2FjdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2xpbWl0PScgKyBwYXJhbXMubGltaXQpO1xuICB9XG4gIGlmIChwYXJhbXMuc2tpcCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ3NraXA9JyArIHBhcmFtcy5za2lwKTtcbiAgfVxuICBpZiAocGFyYW1zLm1pbkhlaWdodCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkhlaWdodCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5IZWlnaHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtaW5IZWlnaHQ9JyArIHBhcmFtcy5taW5IZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWF4SGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4SGVpZ2h0KSB8fCBwYXJhbXMubWF4SGVpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heEhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtYXhIZWlnaHQ9JyArIHBhcmFtcy5tYXhIZWlnaHQpO1xuICB9XG4gIGlmIChwYXJhbXMubWluQ29uZmlybXMpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykgfHwgcGFyYW1zLm1pbkNvbmZpcm1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkNvbmZpcm1zIGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkNvbmZpcm1zPScgKyBwYXJhbXMubWluQ29uZmlybXMpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY29tcGFjdCkpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jb21wYWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvbXBhY3QgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnY29tcGFjdD0nICsgcGFyYW1zLmNvbXBhY3QpO1xuICB9XG4gIGxldCBxdWVyeSA9ICcnO1xuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIGFyZ3Muam9pbignJicpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eCcgKyBxdWVyeSk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb25cbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IElEIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvJyArIHBhcmFtcy5pZCk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gcG9sbEZvclRyYW5zYWN0aW9uXG4vLyBQb2xsIGEgdHJhbnNhY3Rpb24gdW50aWwgc3VjY2Vzc2Z1bCBvciB0aW1lcyBvdXRcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGlkOiB0aGUgdHhpZFxuLy8gICBkZWxheTogZGVsYXkgYmV0d2VlbiBwb2xscyBpbiBtcyAoZGVmYXVsdDogMTAwMClcbi8vICAgdGltZW91dDogdGltZW91dCBpbiBtcyAoZGVmYXVsdDogMTAwMDApXG5XYWxsZXQucHJvdG90eXBlLnBvbGxGb3JUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHBhcmFtcy5kZWxheSAmJiAhXy5pc051bWJlcihwYXJhbXMuZGVsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRlbGF5IHBhcmFtZXRlcicpO1xuICB9XG4gIGlmIChwYXJhbXMudGltZW91dCAmJiAhXy5pc051bWJlcihwYXJhbXMudGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGltZW91dCBwYXJhbWV0ZXInKTtcbiAgfVxuICBwYXJhbXMuZGVsYXkgPSBwYXJhbXMuZGVsYXkgfHwgMTAwMDtcbiAgcGFyYW1zLnRpbWVvdXQgPSBwYXJhbXMudGltZW91dCB8fCAxMDAwMDtcblxuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgZG9OZXh0UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZlxuICAgICAgLmdldFRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0IHx8IG5ldyBEYXRlKCkudmFsdWVPZigpIC0gc3RhcnQudmFsdWVPZigpID4gcGFyYW1zLnRpbWVvdXQpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsdWViaXJkLmRlbGF5KHBhcmFtcy5kZWxheSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRvTmV4dFBvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZG9OZXh0UG9sbCgpO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0V2FsbGV0VHJhbnNhY3Rpb25CeVNlcXVlbmNlSWQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgvc2VxdWVuY2UvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBLZXkgY2hhaW5zXG4vLyBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbi8vIFRoZSB1c2VyIGtleSBjaGFpbiBpcyB0eXBpY2FsbHkgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIGhhcyB0aGUgZW5jcnlwdGVkIHhwcml2IHN0b3JlZCBvbiBCaXRHby5cbi8vIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuV2FsbGV0LnByb3RvdHlwZS5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHRyeUtleUNoYWluID0gY28oZnVuY3Rpb24qIChpbmRleCkge1xuICAgICAgaWYgKCFzZWxmLmtleWNoYWlucyB8fCBpbmRleCA+PSBzZWxmLmtleWNoYWlucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgeHB1Yjogc2VsZi5rZXljaGFpbnNbaW5kZXhdLnhwdWIgfTtcblxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSB5aWVsZCBzZWxmLmJpdGdvLmtleWNoYWlucygpLmdldChwYXJhbXMpO1xuICAgICAgLy8gSWYgd2UgZmluZCB0aGUgeHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoID0gc2VsZi5rZXljaGFpbnNbaW5kZXhdLnBhdGg7XG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVUcmFuc2FjdGlvblxuLy8gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gKHVuc2lnbmVkKS4gVG8gc2lnbiBpdCwgZG8gc2lnblRyYW5zYWN0aW9uXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gb2JqZWN0IG9mIHJlY2lwaWVudCBhZGRyZXNzZXMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4ge2FkZHJlc3M6MTUwMCwgYWRkcmVzczI6MTUwMH1cbi8vICAgZmVlICAgICAgLSB0aGUgYmxvY2tjaGFpbiBmZWUgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIGZlZVJhdGUgIC0gdGhlIGZlZSBwZXIga2IgdG8gc2VuZCAob3B0aW9uYWwpXG4vLyAgIG1pbkNvbmZpcm1zIC0gbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdG8gdXNlIHdoZW4gZ2F0aGVyaW5nIHVuc3BlbnRzXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQgLSBmb3JjZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSBsYXN0IG91dHB1dCAob3B0aW9uYWwpXG4vLyAgIG5vU3BsaXRDaGFuZ2UgLSBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbi8vICAgY2hhbmdlQWRkcmVzcyAtIG92ZXJyaWRlIHRoZSBjaGFuZ2UgYWRkcmVzcyAob3B0aW9uYWwpXG4vLyAgIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIGNoYW5nZSBhZGRyZXNzZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB7IHRyYW5zYWN0aW9uSGV4OiBzdHJpbmcsIHVuc3BlbnRzOiBbaW5wdXRzXSwgZmVlOiBzYXRvc2hpcyB9KVxuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoXG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB8fFxuICAgICghXy5pc051bWJlcihwYXJhbXMubWluQ29uZmlybXMpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpKSB8fFxuICAgICghXy5pc1N0cmluZyhwYXJhbXMuY2hhbmdlQWRkcmVzcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmNoYW5nZUFkZHJlc3MpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLnZhbGlkYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMudmFsaWRhdGUpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5pbnN0YW50KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMud2FsbGV0ID0gdGhpcztcblxuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgaWYgKHBhcmFtcy5wc2J0KSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeSgoKSA9PiBzaWduUHNidFJlcXVlc3QocGFyYW1zKSkubm9kZWlmeShjYWxsYmFjayk7XG4gIH1cblxuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSGV4J10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuXG4gIGlmICgoIV8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSB8fCAhcGFyYW1zLmtleWNoYWluLnhwcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5zaWduaW5nS2V5KSkge1xuICAgIC8vIGFsbG93IHBhc3NpbmcgaW4gYSBXSUYgcHJpdmF0ZSBrZXkgZm9yIGxlZ2FjeSBzYWZlIHdhbGxldCBzdXBwb3J0XG4gICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGtleWNoYWluIG9iamVjdCB3aXRoIHhwcnYgb3Igc2lnbmluZ0tleSBXSUYnKTtcbiAgICBlcnJvci5jb2RlID0gJ21pc3Npbmdfa2V5Y2hhaW5fb3Jfc2lnbmluZ0tleSc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwYXJhbXMudmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcbiAgcGFyYW1zLmJpdGdvID0gdGhpcy5iaXRnbztcbiAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4OiByZXN1bHQudHJhbnNhY3Rpb25IZXgsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRcbi8vIFNlbmQgYSB0cmFuc2FjdGlvbiB0byB0aGUgQml0Y29pbiBuZXR3b3JrIHZpYSBCaXRHby5cbi8vIE9uZSBvZiB0aGUga2V5cyBpcyB0eXBpY2FsbHkgc2lnbmVkLCBhbmQgQml0R28gd2lsbCBzaWduIHRoZSBvdGhlciAoaWYgYXBwcm92ZWQpIGFuZCByZWxheSBpdCB0byB0aGUgUDJQIG5ldHdvcmsuXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB0eCAgLSB0aGUgaGV4IGVuY29kZWQsIHNpZ25lZCB0cmFuc2FjdGlvbiB0byBzZW5kXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4J10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3R4L3NlbmQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICBpZiAoYm9keS5wZW5kaW5nQXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAncGVuZGluZ0FwcHJvdmFsJyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkub3RwKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZChib2R5LCB7IHN0YXR1czogJ290cCcgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2FjY2VwdGVkJyxcbiAgICAgICAgdHg6IGJvZHkudHJhbnNhY3Rpb24sXG4gICAgICAgIGhhc2g6IGJvZHkudHJhbnNhY3Rpb25IYXNoLFxuICAgICAgICBpbnN0YW50OiBib2R5Lmluc3RhbnQsXG4gICAgICAgIGluc3RhbnRJZDogYm9keS5pbnN0YW50SWQsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTaGFyZSB0aGUgd2FsbGV0IHdpdGggYW4gZXhpc3RpbmcgQml0R28gdXNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSByZWNpcGllbnQncyB1c2VyIGlkLCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHVzZXIgcmVjb3JkIGluIG91ciBkYXRhYmFzZS5cbiAqIEBwYXJhbSB7a2V5Y2hhaW59IGtleWNoYWluIFRoZSBrZXljaGFpbiB0byBiZSBzaGFyZWQgd2l0aCB0aGUgcmVjaXBpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb25zIEEgY29tbWEtc2VwYXJhdGVkIHZhbHVlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgcmVjaXBpZW50J3MgcGVybWlzc2lvbnMgaWYgdGhlIHNoYXJlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhpcyBzaGFyZS5cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zLmtleWNoYWluLnhwdWIgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHhwdWIsIGVuY3J5cHRlZFhwcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVJbnZpdGVcbi8vIGludml0ZSBhIG5vbiBCaXRHbyBjdXN0b21lciB0byBqb2luIGEgd2FsbGV0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBlbWFpbCAtIHRoZSByZWNpcGllbnQncyBlbWFpbCBhZGRyZXNzXG4vLyAgIHBlcm1pc3Npb25zIC0gdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUludml0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICB0b0VtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgfTtcblxuICBpZiAocGFyYW1zLm1lc3NhZ2UpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ludml0ZScpKS5zZW5kKG9wdGlvbnMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXRcbi8vIGNvbmZpcm0gbXkgaW52aXRlIG9uIHRoaXMgd2FsbGV0IHRvIGEgcmVjaXBpZW50IHdobyBoYXNcbi8vIHN1YnNlcXVlbnRseSBzaWduZWQgdXAgYnkgY3JlYXRpbmcgdGhlIGFjdHVhbCB3YWxsZXQgc2hhcmVcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHdhbGxldEludml0ZUlkIC0gdGhlIHdhbGxldCBpbnZpdGUgaWRcbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHJlcXVpcmVkIGlmIHRoZSB3YWxsZXQgc2hhcmUgc3VjY2VzcyBpcyBleHBlY3RlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNvbmZpcm1JbnZpdGVBbmRTaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRJbnZpdGVJZCddLCBbJ3dhbGxldFBhc3NwaHJhc2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC53YWxsZXRzKClcbiAgICAubGlzdEludml0ZXMoKVxuICAgIC50aGVuKGZ1bmN0aW9uIChpbnZpdGVzKSB7XG4gICAgICBjb25zdCBvdXRnb2luZyA9IGludml0ZXMub3V0Z29pbmc7XG4gICAgICBjb25zdCBpbnZpdGUgPSBfLmZpbmQob3V0Z29pbmcsIGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgcmV0dXJuIG91dC5pZCA9PT0gcGFyYW1zLndhbGxldEludml0ZUlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoIWludml0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBpbnZpdGUgbm90IGZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVtYWlsOiBpbnZpdGUudG9FbWFpbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IGludml0ZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLm1lc3NhZ2UsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGYuc2hhcmVXYWxsZXQob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kQ29pbnNcbi8vIFNlbmQgY29pbnMgdG8gYSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZyb20gdGhpcyB3YWxsZXQgdXNpbmcgdGhlIHVzZXIga2V5LlxuLy8gMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHhwcml2XG4vLyAyLiBEZWNyeXB0cyB1c2VyIGtleVxuLy8gMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuLy8gNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbi8vIDMuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGFkZHJlc3MgLSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuLy8gICBhbW91bnQgLSB0aGUgYW1vdW50IGluIHNhdG9zaGlzIHRvIGJlIHNlbnRcbi8vICAgbWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRDb2lucyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gIHBhcmFtcy5yZWNpcGllbnRzW3BhcmFtcy5hZGRyZXNzXSA9IHBhcmFtcy5hbW91bnQ7XG5cbiAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kTWFueVxuLy8gU2VuZCBjb2lucyB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgZnJvbSB0aGlzIHdhbGxldCB1c2luZyB0aGUgdXNlciBrZXkuXG4vLyAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgeHByaXZcbi8vIDIuIERlY3J5cHRzIHVzZXIga2V5XG4vLyAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4vLyA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuLy8gMy4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgdHJhdmVsSW5mbzogb2JqZWN0IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kTWFueSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpbnN0YW50IC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICB9XG5cbiAgbGV0IGJpdGdvRmVlO1xuICBsZXQgdHJhdmVsSW5mb3M7XG4gIGxldCBmaW5hbFJlc3VsdDtcbiAgbGV0IHVuc3BlbnRzVXNlZDtcblxuICBjb25zdCBhY2NlcHRlZEJ1aWxkUGFyYW1zID0gW1xuICAgICdudW1CbG9ja3MnLFxuICAgICdmZWVSYXRlJyxcbiAgICAnbWluQ29uZmlybXMnLFxuICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICd0YXJnZXRXYWxsZXRVbnNwZW50cycsXG4gICAgJ21lc3NhZ2UnLFxuICAgICdtaW5WYWx1ZScsXG4gICAgJ21heFZhbHVlJyxcbiAgICAnbm9TcGxpdENoYW5nZScsXG4gICAgJ2NvbW1lbnQnLFxuICBdO1xuICBjb25zdCBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIGFjY2VwdGVkQnVpbGRQYXJhbXMpO1xuXG4gIC8vIEdldCB0aGUgdXNlciBrZXljaGFpblxuICBjb25zdCByZXRQcm9taXNlID0gdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgIC50aGVuKGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgICAgLy8gU2VuZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIGJpdGdvRmVlID0gdHJhbnNhY3Rpb24uYml0Z29GZWU7XG4gICAgICB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgICAgdW5zcGVudHNVc2VkID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG4gICAgICByZXR1cm4gc2VsZi5zZW5kVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eDogdHJhbnNhY3Rpb24udHgsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICAgIG90cDogcGFyYW1zLm90cCxcbiAgICAgICAgLy8gVGhlIGJlbG93IHBhcmFtcyBhcmUgZm9yIGxvZ2dpbmcgb25seSwgYW5kIGRvIG5vdCBpbXBhY3QgdGhlIEFQSSBjYWxsXG4gICAgICAgIGVzdGltYXRlZFNpemU6IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemUsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiBwcmVzZXJ2ZWRCdWlsZFBhcmFtcyxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChyZXN1bHQudHgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICBjb25zdCBpbnB1dHNTdW0gPSBfLnN1bUJ5KHVuc3BlbnRzVXNlZCwgJ3ZhbHVlJyk7XG4gICAgICBjb25zdCBvdXRwdXRzU3VtID0gXy5zdW1CeSh0eC5vdXRzLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IGZlZVVzZWQgPSBpbnB1dHNTdW0gLSBvdXRwdXRzU3VtO1xuICAgICAgaWYgKGlzTmFOKGZlZVVzZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVVc2VkJyk7XG4gICAgICB9XG4gICAgICAocmVzdWx0LmZlZSA9IGZlZVVzZWQpLCAocmVzdWx0LmZlZVJhdGUgPSAoZmVlVXNlZCAqIDEwMDApIC8gdHgudmlydHVhbFNpemUoKSk7XG4gICAgICByZXN1bHQudHJhdmVsSW5mb3MgPSB0cmF2ZWxJbmZvcztcbiAgICAgIGlmIChiaXRnb0ZlZSkge1xuICAgICAgICByZXN1bHQuYml0Z29GZWUgPSBiaXRnb0ZlZTtcbiAgICAgIH1cbiAgICAgIGZpbmFsUmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAvLyBIYW5kbGUgc2VuZGluZyB0cmF2ZWwgaW5mb3MgaWYgdGhleSBleGlzdCwgYnV0IG1ha2Ugc3VyZSB3ZSBuZXZlciBmYWlsIGhlcmUuXG4gICAgICAvLyBFcnJvciBvciByZXN1bHQgKHdpdGggcG9zc2libGUgc3ViLWVycm9ycykgd2lsbCBiZSBwcm92aWRlZCBpbiB0cmF2ZWxSZXN1bHRcbiAgICAgIGlmICh0cmF2ZWxJbmZvcyAmJiB0cmF2ZWxJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gc2VsZlxuICAgICAgICAgICAgLnBvbGxGb3JUcmFuc2FjdGlvbih7IGlkOiByZXN1bHQuaGFzaCB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5iaXRnby50cmF2ZWxSdWxlKCkuc2VuZE1hbnkocmVzdWx0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHJlcztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAvLyBjYXRjaCBhc3luYyBlcnJvcnNcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0geyBlcnJvcjogZXJyLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBjYXRjaCBzeW5jaHJvbm91cyBlcnJvcnNcbiAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluYWxSZXN1bHQ7XG4gICAgfSk7XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHJldFByb21pc2UpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBBY2NlbGVyYXRlIGEgc3R1Y2sgdHJhbnNhY3Rpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKS5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHN0dWNrIHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIG5vIHVuY29uZmlybWVkIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gSW5wdXQgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50cmFuc2FjdGlvbklEIC0gSUQgb2YgdHJhbnNhY3Rpb24gdG8gYWNjZWxlcmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gTmV3IGVmZmVjdGl2ZSBmZWUgcmF0ZSBmb3Igc3R1Y2sgdHJhbnNhY3Rpb24gKHNhdCBwZXIgMTAwMCBieXRlcylcbiAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIC0gTWF4aW11bSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSBmcm9tIHRoZSB3YWxsZXQgdG8gY292ZXIgYW55IGNoaWxkIGZlZXMgdGhhdCB0aGUgcGFyZW50IHVuc3BlbnQgb3V0cHV0IGNhbm5vdCBjb3Zlci4gRGVmYXVsdHMgdG8gMTAwLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2Ugd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgd2FsbGV0IHByaXZhdGUga2V5LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIFRoZSBwcml2YXRlIGtleSBmb3IgdGhlIHdhbGxldC4gT25lIG9mIGVpdGhlciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgaXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMgUmVzdWx0IG9mIHNlbmRUcmFuc2FjdGlvbigpIG9uIHRoZSBjaGlsZCB0cmFuc2FjdGlvblxuICovXG5XYWxsZXQucHJvdG90eXBlLmFjY2VsZXJhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIGFjY2VsZXJhdGVUcmFuc2FjdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVzdGltYXRlIGEgdHJhbnNhY3Rpb25zIHNpemUgaW4gdmlydHVhbCBieXRlcy5cbiAgICogQWN0dWFsIHRyYW5zYWN0aW9ucyBtYXkgYmUgc2xpZ2h0bHkgZmV3ZXIgdmlydHVhbCBieXRlcywgZHVlIHRvXG4gICAqIHRoZSBmYWN0IHRoYXQgdmFsaWQgRUNTREEgc2lnbmF0dXJlcyBoYXZlIGEgdmFyaWFibGUgbGVuZ3RoXG4gICAqIGJldHdlZW4gOCBhbmQgNzMgdmlydHVhbCBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cy5zZWd3aXQgVGhlIG51bWJlciBvZiBzZWd3aXQgaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyU0ggVGhlIG51bWJlciBvZiBQMlNIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cy5QMlBLSCBUaGUgbnVtYmVyIG9mIFAyUEtIIGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNvbnN0IGVzdGltYXRlVHhWU2l6ZSA9IChpbnB1dHMpID0+IHtcbiAgICBjb25zdCBzZWd3aXQgPSBpbnB1dHMuc2Vnd2l0IHx8IDA7XG4gICAgY29uc3QgUDJTSCA9IGlucHV0cy5QMlNIIHx8IDA7XG4gICAgY29uc3QgUDJQS0ggPSBpbnB1dHMuUDJQS0ggfHwgMDtcblxuICAgIGNvbnN0IGNoaWxkRmVlSW5mbyA9IFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8oe1xuICAgICAgblAyc2hJbnB1dHM6IFAyU0gsXG4gICAgICBuUDJwa2hJbnB1dHM6IFAyUEtILFxuICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0LFxuICAgICAgbk91dHB1dHM6IDEsXG4gICAgICBmZWVSYXRlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoaWxkRmVlSW5mby5zaXplO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGF0IHNob3VsZCBiZSBwYWlkIGluIGZlZXMgYnkgdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXRzIHRvIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiB3aGljaCBhcmUgcGFzc2VkIHRvIGVzdGltYXRlVHhWU2l6ZVxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIGZlZVJhdGUgVGhlIG5ldyBmZWUgcmF0ZSB3aGljaCBzaG91bGQgYmUgcGFpZCBieSB0aGUgY29tYmluZWQgQ1BGUCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBjaGlsZCB0eCBzaG91bGQgcGF5IGluIGZlZXNcbiAgICovXG4gIGNvbnN0IGVzdGltYXRlQ2hpbGRGZWUgPSAoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGUgfSkgPT4ge1xuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBtb3JlIHdlICpzaG91bGQqIGhhdmUgcGFpZCBpbiBwYXJlbnQgZmVlcyxcbiAgICAvLyBoYWQgdGhlIHBhcmVudCBiZWVuIG9yaWdpbmFsbHkgc2VudCB3aXRoIHRoZSBuZXcgZmVlIHJhdGVcbiAgICBjb25zdCBhZGRpdGlvbmFsUGFyZW50RmVlID0gXy5jZWlsKChwYXJlbnRWU2l6ZSAqIGZlZVJhdGUpIC8gMTAwMCkgLSBwYXJlbnRGZWU7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggd2Ugd291bGQgcGF5IGluIGZlZXMgZm9yIHRoZSBjaGlsZCxcbiAgICAvLyBpZiBpdCB3ZXJlIG9ubHkgcGF5aW5nIGZvciBpdHNlbGYgYXQgdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGNoaWxkRmVlID0gKGVzdGltYXRlVHhWU2l6ZShpbnB1dHMpICogZmVlUmF0ZSkgLyAxMDAwO1xuXG4gICAgcmV0dXJuIF8uY2VpbChjaGlsZEZlZSArIGFkZGl0aW9uYWxQYXJlbnRGZWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSB0byBwYXkgdGhlIGNoaWxkIHR4IGZlZXMuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRoZSBwYXJlbnQgdHggb3V0cHV0IGlzIG5vdCBzdWZmaWNpZW50IHRvXG4gICAqIGNvdmVyIHRoZSB0b3RhbCBmZWVzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjaGlsZCB0eC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRPdXRwdXRWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggd2UgYXJlIHVzaW5nIGFzIGFuIGlucHV0IHRvIHRoZSBjaGlsZCB0eFxuICAgKiBAcGFyYW0gcGFyZW50RmVlIFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIHBhcmVudCB0eCBvcmlnaW5hbGx5IHBhaWQgaW4gZmVlc1xuICAgKiBAcGFyYW0gcGFyZW50VlNpemUgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJ5dGVzIGluIHRoZSBwYXJlbnQgdHhcbiAgICogQHBhcmFtIG1heFVuc3BlbnRzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRpdGlvbmFsIHVuc3BlbnRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlc1xuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UsIHRoZSB1cGRhdGVkIG51bWJlciBvZiBzYXRvc2hpcyB3aGljaCBzaG91bGQgYmUgcGFpZCBieVxuICAgKiAgICAgICAgICB0aGUgY2hpbGQgdHgsIGFuZCB0aGUgdXBkYXRlZCBpbnB1dHMgZm9yIHRoZSBjaGlsZCB0eC5cbiAgICovXG4gIGNvbnN0IGZpbmRBZGRpdGlvbmFsVW5zcGVudHMgPSAoeyBpbnB1dHMsIHBhcmVudE91dHB1dFZhbHVlLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBtYXhVbnNwZW50cyB9KSA9PiB7XG4gICAgcmV0dXJuIGNvKGZ1bmN0aW9uKiBjb0ZpbmRBZGRpdGlvbmFsVW5zcGVudHMoKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsVW5zcGVudHM6IGFueVtdID0gW107XG5cbiAgICAgIC8vIGFzayB0aGUgc2VydmVyIGZvciBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIGNoaWxkIGZlZSwgYXNzdW1pbmdcbiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGRvbmUgd2l0aG91dCBhZGRpdGlvbmFsIHVuc3BlbnRzICh3aGljaCBpcyBub3QgcG9zc2libGUsXG4gICAgICAvLyBzaW5jZSBpZiB0aGF0IHdlcmUgdGhlIGNhc2UsIGZpbmRBZGRpdGlvbmFsVW5zcGVudHMgd291bGQgbm90IGhhdmUgYmVlblxuICAgICAgLy8gY2FsbGVkIGluIHRoZSBmaXJzdCBwbGFjZS4gVGhpcyB3aWxsIGJlIGNvcnJlY3RlZCBiZWZvcmUgcmV0dXJuaW5nKVxuICAgICAgbGV0IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlID0gZXN0aW1hdGVDaGlsZEZlZSh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUgfSk7XG4gICAgICBsZXQgdW5jb3ZlcmVkQ2hpbGRGZWUgPSBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSAtIHBhcmVudE91dHB1dFZhbHVlO1xuXG4gICAgICB3aGlsZSAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwICYmIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGggPCBtYXhVbnNwZW50cykge1xuICAgICAgICAvLyB0cnkgdG8gZ2V0IGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgcmVzdCBvZiB0aGUgY2hpbGQgZmVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICAgIGNvbnN0IHVuc3BlbnRzID0gKHlpZWxkIHRoaXMudW5zcGVudHMoe1xuICAgICAgICAgIG1pbkNvbmZpcm1zOiAxLFxuICAgICAgICAgIHRhcmdldDogdW5jb3ZlcmVkQ2hpbGRGZWUsXG4gICAgICAgICAgbGltaXQ6IG1heFVuc3BlbnRzIC0gYWRkaXRpb25hbFVuc3BlbnRzLmxlbmd0aCxcbiAgICAgICAgfSkpIGFzIGFueTtcblxuICAgICAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gbm8gbW9yZSB1bnNwZW50cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSA9IDA7XG5cbiAgICAgICAgLy8gY29uc3VtZSBhbGwgdW5zcGVudHMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciwgZXZlbiBpZiB3ZSBkb24ndCBuZWVkXG4gICAgICAgIC8vIGFsbCBvZiB0aGVtIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgc2VydmVyIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIGVub3VnaCB1bnNwZW50IHZhbHVlIHRvIGVuc3VyZSB0aGF0IHRoZSBtaW5pbXVtIGNoYW5nZSBhbW91bnRcbiAgICAgICAgLy8gaXMgYWNoaWV2ZWQgZm9yIHRoZSBjaGlsZCB0eCwgYW5kIHdlIGNhbid0IGxlYXZlIG91dCB0aG9zZSB1bnNwZW50c1xuICAgICAgICAvLyBvciBlbHNlIHRoZSBtaW5pbXVtIGNoYW5nZSBhbW91bnQgY29uc3RyYWludCBjb3VsZCBiZSB2aW9sYXRlZFxuICAgICAgICBfLmZvckVhY2godW5zcGVudHMsICh1bnNwZW50KSA9PiB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBjaGlsZCB0eCBpbnB1dHNcbiAgICAgICAgICBjb25zdCB1bnNwZW50Q2hhaW4gPSBnZXRDaGFpbih1bnNwZW50KTtcbiAgICAgICAgICBpZiAoaXNDaGFpbkNvZGUodW5zcGVudENoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudENoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgICAgICAgIGlucHV0cy5zZWd3aXQrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRzLlAyU0grKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRpdGlvbmFsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgICAgICBhZGRpdGlvbmFsVW5zcGVudFZhbHVlICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlID0gZXN0aW1hdGVDaGlsZEZlZSh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUgfSk7XG4gICAgICAgIHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZSAtIGFkZGl0aW9uYWxVbnNwZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmNvdmVyZWRDaGlsZEZlZSA+IDApIHtcbiAgICAgICAgLy8gVW5hYmxlIHRvIGZpbmQgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN1ZmZpY2llbnQgY29uZmlybWVkIHVuc3BlbnRzIGF2YWlsYWJsZSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvdW5kIGVub3VnaCB1bnNwZW50c1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkaXRpb25hbDogYWRkaXRpb25hbFVuc3BlbnRzLFxuICAgICAgICBuZXdDaGlsZEZlZTogY3VycmVudENoaWxkRmVlRXN0aW1hdGUsXG4gICAgICAgIG5ld0lucHV0czogaW5wdXRzLFxuICAgICAgfTtcbiAgICB9KS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgZnVsbCBjb3B5IChpbmNsdWRpbmcgd2l0bmVzcyBkYXRhKSBvZiBhbiBhcmJpdHJhcnkgdHggdXNpbmcgb25seSB0aGUgdHggaWQuXG4gICAqXG4gICAqIFdlIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIHNlcnZpY2UgZm9yIHRoaXMgKGN1cnJlbnRseSBibG9ja3N0cmVhbS5pbmZvKSwgc2luY2VcbiAgICogdGhlIHYxIGluZGV4ZXIgc2VydmljZSAoYmFzZWQgb24gYml0Y29pbmopIGRvZXMgbm90IGhhdmUgc2Vnd2l0IHN1cHBvcnQgYW5kXG4gICAqIGRvZXMgbm90IHJldHVybiBhbnkgc2Vnd2l0IHJlbGF0ZWQgZmllbGRzIGluIHRoZSB0eCBoZXguXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRUeElkIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZ2V0IHRoZSBmdWxsIGhleCBvZlxuICAgKiBAcmV0dXJucyB7Qmx1ZWJpcmQ8YW55Pn0gVGhlIGZ1bGwgaGV4IGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQgfTogeyBwYXJlbnRUeElkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhwbG9yZXJCYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tzZWxmLmJpdGdvLmdldEVudigpXS5idGNFeHBsb3JlckJhc2VVcmw7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5nZXQoYCR7ZXhwbG9yZXJCYXNlVXJsfS90eC8ke3BhcmVudFR4SWR9L2hleGApO1xuXG4gICAgaWYgKCFyZXN1bHQudGV4dCB8fCAhLyhbYS1mMC05XXsyfSkrLy50ZXN0KHJlc3VsdC50ZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZSBwYXJlbnQgdHggaGV4LiBSZWNlaXZlZCAnJHtfLnRydW5jYXRlKHJlc3VsdC50ZXh0LCB7IGxlbmd0aDogMTAwIH0pfScgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjaGFpbiBmcm9tIGFuIHVuc3BlbnQgb3IgdHggb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0T3JVbnNwZW50IFRoZSBvdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBjaGFpbiBzaG91bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2hhaW4gZm9yIHRoZSBnaXZlbiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKi9cbiAgY29uc3QgZ2V0Q2hhaW4gPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgaWYgKG91dHB1dE9yVW5zcGVudC5jaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LmNoYWluO1xuICAgIH1cblxuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfLnRvTnVtYmVyKG91dHB1dE9yVW5zcGVudC5jaGFpblBhdGguc3BsaXQoJy8nKVsxXSk7XG4gICAgfVxuXG4gICAgLy8gbm8gd2F5IHRvIHRlbGwgdGhlIGNoYWluLCBsZXQncyBqdXN0IGJsb3cgdXAgbm93IGluc3RlYWRcbiAgICAvLyBvZiBibG93aW5nIHVwIGxhdGVyIHdoZW4gdGhlIHVuZGVmaW5lZCByZXR1cm4gdmFsdWUgaXMgdXNlZC5cbiAgICAvLyBOb3RlOiBmb3IgdW5zcGVudHMgdGhlIGZpZWxkIHRvIHVzZSBpcyAnYWRkcmVzcycsIGJ1dCBmb3Igb3V0cHV0c1xuICAgIC8vIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FjY291bnQnXG4gICAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBnZXQgY2hhaW4gZm9yIG91dHB1dCBvbiBhY2NvdW50ICR7b3V0cHV0T3JVbnNwZW50LmFjY291bnQgfHwgb3V0cHV0T3JVbnNwZW50LmFkZHJlc3N9YCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCB2YWx1ZSBjb250cmlidXRpb24gYW4gb3V0cHV0IG9yIHVuc3BlbnQgd2lsbFxuICAgKiBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC4gRWFjaCB0eXBlIG9mIG91dHB1dCBvciB1bnNwZW50XG4gICAqIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBjb250cmlidXRpb24gc2luY2UgZWFjaCB0eXBlIGhhcyBhIGRpZmZlcmVudCBudW1iZXJcbiAgICogb2YgdmlydHVhbCBieXRlcywgYW5kIHRodXMgd2lsbCBjYXVzZSBhIGRpZmZlcmVudCBmZWUgdG8gYmUgcGFpZC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBPdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBlZmZlY3RpdmUgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGFjdHVhbCBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCB0aGlzIHVuc3BlbnQgb3Igb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gYSB0cmFuc2FjdGlvbiwgd2VyZSBpdCB0byBiZSB1c2VkLlxuICAgKi9cbiAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgY29uc3QgY2hhaW4gPSBnZXRDaGFpbihvdXRwdXRPclVuc3BlbnQpO1xuICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSBpcyBpbiBieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGtCXG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gICAgfVxuICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQudmFsdWUgLSAoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvcm91dGluZSB3aGljaCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBhY2NlbGVyYXRlVHJhbnNhY3Rpb24gYWxnb3JpdGhtXG4gICAqXG4gICAqIERlc2NyaWJlZCBhdCBhIGhpZ2ggbGV2ZWwsIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAgICogMSkgRmluZCBhcHByb3ByaWF0ZSBvdXRwdXQgZnJvbSBwYXJlbnQgdHJhbnNhY3Rpb24gdG8gdXNlIGFzIGNoaWxkIHRyYW5zYWN0aW9uIGlucHV0XG4gICAqIDIpIEZpbmQgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXQuIElmIG5vdCBmb3VuZCwgcmV0dXJuIHRvIHN0ZXAgMS5cbiAgICogMykgRGV0ZXJtaW5lIGlmIHBhcmVudCB0cmFuc2FjdGlvbiB1bnNwZW50IGNhbiBjb3ZlciBlbnRpcmUgY2hpbGQgZmVlLCBwbHVzIG1pbmltdW0gY2hhbmdlXG4gICAqIDQpIElmIHllcywgZ28gdG8gc3RlcCA2XG4gICAqIDUpIE90aGVyd2lzZSwgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIGZyb20gdGhlIHdhbGxldCB0byB1c2UgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVcbiAgICogNikgQ3JlYXRlIGFuZCBzaWduIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiwgdXNpbmcgdGhlIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXRcbiAgICogICAgKGFuZCwgaWYgbmVjZXNzYXJ5LCBhZGRpdGlvbmFsIHdhbGxldCB1bnNwZW50cykgYXMgaW5wdXRzXG4gICAqIDcpIEJyb2FkY2FzdCB0aGUgbmV3IGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqL1xuICByZXR1cm4gY28oZnVuY3Rpb24qIGNvQWNjZWxlcmF0ZVRyYW5zYWN0aW9uKCk6IGFueSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25JRCddLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgLy8gdmFsaWRhdGUgZmVlIHJhdGVcbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNGaW5pdGUocGFyYW1zLmZlZVJhdGUpIHx8IHBhcmFtcy5mZWVSYXRlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgZm9yIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1heFVuc3BlbnRzXG4gICAgaWYgKHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYnkgZGVmYXVsdCwgdXNlIGF0IG1vc3QgMTAwIGFkZGl0aW9uYWwgdW5zcGVudHMgKG5vdCBpbmNsdWRpbmcgdGhlIHVuc3BlbnQgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eClcbiAgICAgIHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPSAxMDA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzKSB8fCBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdFeHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlciBmb3IgcGFyYW1ldGVyOiBtYXhBZGRpdGlvbmFsVW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHBhcmVudFR4ID0geWllbGQgdGhpcy5nZXRUcmFuc2FjdGlvbih7IGlkOiBwYXJhbXMudHJhbnNhY3Rpb25JRCB9KTtcbiAgICBpZiAocGFyZW50VHguY29uZmlybWF0aW9ucyA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtwYXJhbXMudHJhbnNhY3Rpb25JRH0gaXMgYWxyZWFkeSBjb25maXJtZWQgYW5kIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgb3V0cHV0cyBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggYXJlIHRvIG91ciB3YWxsZXRcbiAgICBjb25zdCB3YWxsZXRPdXRwdXRzID0gXy5maWx0ZXIocGFyZW50VHgub3V0cHV0cywgKG91dHB1dCkgPT4gb3V0cHV0LmlzTWluZSk7XG5cbiAgICBpZiAod2FsbGV0T3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGNvbnRhaW5zIG5vIG91dHB1dHMgdG8gdGhpcyB3YWxsZXQsIGFuZCB0aHVzIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGFuIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgd2l0aCBsYXJnZXN0IGVmZmVjdGl2ZSB2YWx1ZSxcbiAgICAvLyBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgdW5zcGVudC5cbiAgICAvLyBBbiBvdXRwdXQgY291bGQgYmUgc3BlbnQgYWxyZWFkeSBpZiB0aGUgb3V0cHV0IHdhcyB1c2VkIGluIGFcbiAgICAvLyBjaGlsZCB0eCB3aGljaCBpdHNlbGYgaGFzIGJlY29tZSBzdHVjayBkdWUgdG8gbG93IGZlZXMgYW5kIGlzXG4gICAgLy8gYWxzbyB1bmNvbmZpcm1lZC5cbiAgICBjb25zdCBzb3J0ZWRPdXRwdXRzID0gXy5zb3J0Qnkod2FsbGV0T3V0cHV0cywgZWZmZWN0aXZlVmFsdWUpO1xuICAgIGxldCBwYXJlbnRVbnNwZW50VG9Vc2U7XG4gICAgbGV0IG91dHB1dFRvVXNlO1xuXG4gICAgd2hpbGUgKHNvcnRlZE91dHB1dHMubGVuZ3RoID4gMCAmJiBwYXJlbnRVbnNwZW50VG9Vc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0cHV0VG9Vc2UgPSBzb3J0ZWRPdXRwdXRzLnBvcCgpO1xuXG4gICAgICAvLyBmaW5kIHRoZSB1bnNwZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIG91dHB1dFxuICAgICAgLy8gVE9ETzogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzIHVuc3BlbnQ/XG4gICAgICAvLyBUT0RPOiBUaGUgYmVzdCB3ZSBjYW4gZG8gaGVyZSBpcyBzZXQgbWluU2l6ZSA9IG1heFNpemUgPSBvdXRwdXRUb1VzZS52YWx1ZVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHVuc3BlbnRzUmVzdWx0ID0geWllbGQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgIG1pblNpemU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBtYXhTaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJlbnRVbnNwZW50VG9Vc2UgPSBfLmZpbmQodW5zcGVudHNSZXN1bHQsICh1bnNwZW50KSA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIHR4aWRcbiAgICAgICAgaWYgKHVuc3BlbnQudHhfaGFzaCAhPT0gcGFyYW1zLnRyYW5zYWN0aW9uSUQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBzdXJlIHVuc3BlbnQgaGFzIGNvcnJlY3Qgdl9vdXQgaW5kZXhcbiAgICAgICAgcmV0dXJuIHVuc3BlbnQudHhfb3V0cHV0X24gPT09IG91dHB1dFRvVXNlLnZvdXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdW5zcGVudCBvdXRwdXQgZnJvbSBwYXJlbnQgdHggdG8gdXNlIGFzIGNoaWxkIGlucHV0YCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBmdWxsIGhleCBmb3IgdGhlIHBhcmVudCB0eCBhbmQgZGVjb2RlIGl0IHRvIGdldCBpdHMgdnNpemVcbiAgICBjb25zdCBwYXJlbnRUeEhleCA9IHlpZWxkIGdldFBhcmVudFR4SGV4KHsgcGFyZW50VHhJZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgY29uc3QgZGVjb2RlZFBhcmVudCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHBhcmVudFR4SGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGNvbnN0IHBhcmVudFZTaXplID0gZGVjb2RlZFBhcmVudC52aXJ0dWFsU2l6ZSgpO1xuXG4gICAgLy8gbWFrZSBzdXJlIGlkIGZyb20gZGVjb2RlZCB0eCBhbmQgZ2l2ZW4gdHggaWQgbWF0Y2hcbiAgICAvLyB0aGlzIHNob3VsZCBjYXRjaCBwcm9ibGVtcyBlbWFuYXRpbmcgZnJvbSB0aGUgdXNlIG9mIGFuIGV4dGVybmFsIHNlcnZpY2VcbiAgICAvLyBmb3IgZ2V0dGluZyB0aGUgY29tcGxldGUgcGFyZW50IHR4IGhleFxuICAgIGlmIChkZWNvZGVkUGFyZW50LmdldElkKCkgIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWNvZGVkIHRyYW5zYWN0aW9uIGlkIGlzICR7ZGVjb2RlZFBhcmVudC5nZXRJZCgpfSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gdHhpZCAke3BhcmFtcy50cmFuc2FjdGlvbklEfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIG5ldyBmZWUgcmF0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHBhcmVudCdzIGN1cnJlbnQgZmVlIHJhdGVcbiAgICAvLyB2aXJ0dWFsU2l6ZSBpcyByZXR1cm5lZCBpbiB2Ynl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrdkJcbiAgICBjb25zdCBwYXJlbnRSYXRlID0gKDEwMDAgKiBwYXJlbnRUeC5mZWUpIC8gcGFyZW50VlNpemU7XG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlIDw9IHBhcmVudFJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBsb3dlciBmZWUgcmF0ZSEgKFBhcmVudCB0eCBmZWUgcmF0ZSBpcyAke3BhcmVudFJhdGV9IHNhdC9rQiwgYW5kIHJlcXVlc3RlZCBmZWUgcmF0ZSB3YXMgJHtwYXJhbXMuZmVlUmF0ZX0gc2F0L2tCKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHBhcmVudCBvdXRwdXQgY2FuIGNvdmVyIGNoaWxkIGZlZVxuICAgIGNvbnN0IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID1cbiAgICAgIGlzQ2hhaW5Db2RlKG91dHB1dFRvVXNlLmNoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4ob3V0cHV0VG9Vc2UuY2hhaW4pID09PSAncDJzaFAyd3NoJztcblxuICAgIGxldCBjaGlsZElucHV0cyA9IHtcbiAgICAgIHNlZ3dpdDogaXNQYXJlbnRPdXRwdXRTZWd3aXQgPyAxIDogMCxcbiAgICAgIFAyU0g6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMCA6IDEsXG4gICAgfTtcblxuICAgIGxldCBjaGlsZEZlZSA9IGVzdGltYXRlQ2hpbGRGZWUoe1xuICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUsXG4gICAgICBwYXJlbnRWU2l6ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc3BlbnRzVG9Vc2UgPSBbcGFyZW50VW5zcGVudFRvVXNlXTtcblxuICAgIC8vIHRyeSB0byBnZXQgdGhlIG1pbiBjaGFuZ2Ugc2l6ZSBmcm9tIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDAuMSBCVENcbiAgICAvLyBUT0RPOiBtaW5DaGFuZ2VTaXplIGlzIG5vdCBjdXJyZW50bHkgYSBjb25zdGFudCBkZWZpbmVkIG9uIHRoZSBjbGllbnQgYW5kIHNob3VsZCBiZSBhZGRlZFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgbWluQ2hhbmdlU2l6ZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluQ2hhbmdlU2l6ZSB8fCAxZTc7XG5cbiAgICBpZiAob3V0cHV0VG9Vc2UudmFsdWUgPCBjaGlsZEZlZSArIG1pbkNoYW5nZVNpemUpIHtcbiAgICAgIC8vIHBhcmVudCBvdXRwdXQgY2Fubm90IGNvdmVyIGNoaWxkIGZlZSBwbHVzIHRoZSBtaW5pbXVtIGNoYW5nZSxcbiAgICAgIC8vIG11c3QgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBkaWZmZXJlbmNlXG4gICAgICBjb25zdCB7IGFkZGl0aW9uYWwsIG5ld0NoaWxkRmVlLCBuZXdJbnB1dHMgfSA9IHlpZWxkIGZpbmRBZGRpdGlvbmFsVW5zcGVudHMoe1xuICAgICAgICBpbnB1dHM6IGNoaWxkSW5wdXRzLFxuICAgICAgICBwYXJlbnRPdXRwdXRWYWx1ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgICBtYXhVbnNwZW50czogcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgcGFyZW50VlNpemUsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkRmVlID0gbmV3Q2hpbGRGZWU7XG4gICAgICBjaGlsZElucHV0cyA9IG5ld0lucHV0cztcbiAgICAgIHVuc3BlbnRzVG9Vc2UucHVzaCguLi5hZGRpdGlvbmFsKTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdHkgY2hlY2sgdGhlIGZlZSByYXRlIHdlJ3JlIHBheWluZyBmb3IgdGhlIGNvbWJpbmVkIHR4XG4gICAgLy8gdG8gbWFrZSBzdXJlIGl0J3MgdW5kZXIgdGhlIG1heCBmZWUgcmF0ZS4gT25seSB0aGUgY2hpbGQgdHhcbiAgICAvLyBjYW4gYnJlYWsgdGhpcyBsaW1pdCwgYnV0IHRoZSBjb21iaW5lZCB0eCBzaGFsbCBub3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1heEZlZVJhdGUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1heEZlZVJhdGU7XG4gICAgY29uc3QgY2hpbGRWU2l6ZSA9IGVzdGltYXRlVHhWU2l6ZShjaGlsZElucHV0cyk7XG4gICAgY29uc3QgY29tYmluZWRWU2l6ZSA9IGNoaWxkVlNpemUgKyBwYXJlbnRWU2l6ZTtcbiAgICBjb25zdCBjb21iaW5lZEZlZSA9IHBhcmVudFR4LmZlZSArIGNoaWxkRmVlO1xuICAgIC8vIGNvbWJpbmVkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjb21iaW5lZEZlZVJhdGUgPSAoMTAwMCAqIGNvbWJpbmVkRmVlKSAvIGNvbWJpbmVkVlNpemU7XG5cbiAgICBpZiAoY29tYmluZWRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gY2Fubm90IGJlIGFjY2VsZXJhdGVkLiBDb21iaW5lZCBmZWUgcmF0ZSBvZiAke2NvbWJpbmVkRmVlUmF0ZX0gc2F0L2tCIGV4Y2VlZHMgbWF4aW11bSBmZWUgcmF0ZSBvZiAke21heEZlZVJhdGV9IHNhdC9rQmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgbmV3IGNoYW5nZSBhZGRyZXNzIGFuZCBkZXRlcm1pbmUgY2hhbmdlIGFtb3VudC5cbiAgICAvLyB0aGUgdHggYnVpbGRlciB3aWxsIHJlamVjdCB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyByZWNpcGllbnRzLFxuICAgIC8vIGFuZCBzdWNoIHplcm8tb3V0cHV0IHRyYW5zYWN0aW9ucyBhcmUgZm9yYmlkZGVuIGJ5IHRoZSBCaXRjb2luIHByb3RvY29sLFxuICAgIC8vIHNvIHdlIG5lZWQgYXQgbGVhc3QgYSBzaW5nbGUgcmVjaXBpZW50IGZvciB0aGUgY2hhbmdlIHdoaWNoIHdvbid0IGJlIHBydW5lZC5cbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBfLnN1bUJ5KHVuc3BlbnRzVG9Vc2UsICh1bnNwZW50KSA9PiB1bnNwZW50LnZhbHVlKSAtIGNoaWxkRmVlO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSB0aGlzLmdldENoYW5nZUNoYWluKHt9KTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSB5aWVsZCB0aGlzLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4gfSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGNoaWxkIHR4IGFuZCBicm9hZGNhc3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHR4ID0geWllbGQgdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdW5zcGVudHM6IHVuc3BlbnRzVG9Vc2UsXG4gICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmVlOiBjaGlsZEZlZSxcbiAgICAgIGJpdGdvRmVlOiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICB9LFxuICAgICAgeHBydjogcGFyYW1zLnhwcnYsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIC8vIGNoaWxkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjaGlsZEZlZVJhdGUgPSAoMTAwMCAqIGNoaWxkRmVlKSAvIGNoaWxkVlNpemU7XG4gICAgaWYgKGNoaWxkRmVlUmF0ZSA+IG1heEZlZVJhdGUpIHtcbiAgICAgIC8vIGNvbWJpbmVkIHR4IGlzIHdpdGhpbiBtYXggZmVlIHJhdGUgbGltaXRzLCBidXQgdGhlIGNoaWxkIHR4IGlzIG5vdC5cbiAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byB1c2UgdGhlIGlnbm9yZU1heEZlZVJhdGUgZmxhZyB0byBnZXQgdGhlIGNoaWxkIHR4IHRvIGJlIGFjY2VwdGVkXG4gICAgICB0eC5pZ25vcmVNYXhGZWVSYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbih0eCk7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uXG4vLyBJTlRFUk5BTCBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHNpZ24gYSB0cmFuc2FjdGlvblxuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBhcnJheSBvZiB7IGFkZHJlc3MsIGFtb3VudCB9IHRvIHNlbmQgdG9cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gY28oZnVuY3Rpb24qICgpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZHluYW1pY0ZlZUNvbmZpcm1UYXJnZXQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBjb25maXJtVGFyZ2V0IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaW5zdGFudCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKHlpZWxkIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuICAgIGNvbnN0IGZlZSA9IHRyYW5zYWN0aW9uLmZlZTtcbiAgICBjb25zdCBmZWVSYXRlID0gdHJhbnNhY3Rpb24uZmVlUmF0ZTtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZTtcbiAgICBjb25zdCBiaXRnb0ZlZSA9IHRyYW5zYWN0aW9uLmJpdGdvRmVlO1xuICAgIGNvbnN0IHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgY29uc3QgdW5zcGVudHMgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcblxuICAgIC8vIFNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCBrZXljaGFpbiA9IHlpZWxkIHRoaXMuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbihwYXJhbXMpO1xuICAgICAgdHJhbnNhY3Rpb24ua2V5Y2hhaW4gPSBrZXljaGFpbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSAnbm9fZW5jcnlwdGVkX2tleWNoYWluX29uX3dhbGxldCcpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBzYWZlIHdhbGxldCwgc28gbGV0J3MgcmV0cmlldmUgdGhlIHByaXZhdGUga2V5IGluZm9cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICB5aWVsZCB0aGlzLnJlZnJlc2goeyBncGs6IHRydWUgfSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qgc2FmZVVzZXJLZXkgPSBfLmdldCh0aGlzLndhbGxldCwgJ3ByaXZhdGUudXNlclByaXZLZXknKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHNhZmVVc2VyS2V5KSAmJiBfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICB0cmFuc2FjdGlvbi5zaWduaW5nS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogc2FmZVVzZXJLZXkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmZlZVNpbmdsZUtleVdJRiA9IHBhcmFtcy5mZWVTaW5nbGVLZXlXSUY7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIF8uZXh0ZW5kKHJlc3VsdCwge1xuICAgICAgZmVlLFxuICAgICAgZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWUsXG4gICAgICB0cmF2ZWxJbmZvcyxcbiAgICAgIGVzdGltYXRlZFNpemUsXG4gICAgICB1bnNwZW50cyxcbiAgICB9KTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluXG4vLyBJTlRFUk5BTCBmdW5jdGlvbiB0byBnZXQgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHNpZ25pbmcuXG4vLyBDYWxsZXIgbXVzdCBwcm92aWRlciBlaXRoZXIgYSBrZXljaGFpbiwgb3Igd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGFzIGEgc3RyaW5nXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBrZXljaGFpbiB3aXRoIHhwcnYsIGl0IGlzIHNpbXBseSByZXR1cm5lZC5cbi8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGVuY3J5cHRlZCB4cHJ2ICh3YWxsZXRQYXNzcGhyYXNlKSwgdGhlbiBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBkZWNyeXB0XG4vLyBPdGhlcndpc2UgaWYgdGhlIHhwcnYgaXMgcHJvdmlkZWQsIGZldGNoIHRoZSBrZXljaGFpbiBvYmplY3QgYW5kIGF1Z21lbnQgaXQgd2l0aCB0aGUgeHBydi5cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBrZXljaGFpbiAtIGtleWNoYWluIHdpdGggeHBydlxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyBSZXR1cm5zOlxuLy8gICBLZXljaGFpbiBvYmplY3QgY29udGFpbmluZyB4cHJ2LCB4cHViIGFuZCBwYXRoc1xuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAvLyBJZiBrZXljaGFpbiB3aXRoIHhwcnYgaXMgYWxyZWFkeSBwcm92aWRlZCwgdXNlIGl0XG4gIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgJiYgcGFyYW1zLmtleWNoYWluLnhwcnYpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShwYXJhbXMua2V5Y2hhaW4pO1xuICB9XG5cbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgaWYgKChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiBwYXJhbXMueHBydikgfHwgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiAhcGFyYW1zLnhwcnYpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZXhhY3RseSBvbmUgb2YgeHBydiBvciB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYSB3YWxsZXQgcGFzc3BocmFzZVxuICBpZiAocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleWNoYWluLnhwdWIgJiYgYmlwMzIuZnJvbUJhc2U1OChrZXljaGFpbi54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgIT09IGtleWNoYWluLnhwdWIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkIHhwdWIgZG9lcyBub3QgbWF0Y2ggc3RvcmVkIHhwdWInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENhbGxlciBwcm92aWRlZCBhbiB4cHJ2IC0gdmFsaWRhdGUgYW5kIGNvbnN0cnVjdCBrZXljaGFpbiBvYmplY3RcbiAgbGV0IHhwdWI7XG4gIHRyeSB7XG4gICAgeHB1YiA9IGJpcDMyLmZyb21CYXNlNTgocGFyYW1zLnhwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSB4cHJ2Jyk7XG4gIH1cblxuICBpZiAoeHB1YiA9PT0gcGFyYW1zLnhwcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwcnYgcHJvdmlkZWQgd2FzIG5vdCBhIHByaXZhdGUga2V5IChmb3VuZCB4cHViIGluc3RlYWQpJyk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRYcHVicyA9IF8ubWFwKHNlbGYua2V5Y2hhaW5zLCAneHB1YicpO1xuICBpZiAoIV8uaW5jbHVkZXMod2FsbGV0WHB1YnMsIHhwdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBrZXljaGFpbiBvbiB0aGlzIHdhbGxldCEnKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW4gb2JqZWN0IGZyb20gYml0Z28gdG8gZmluZCB0aGUgcGF0aCBhbmQgKHBvdGVudGlhbCkgd2FsbGV0IHN0cnVjdHVyZVxuICByZXR1cm4gc2VsZi5iaXRnb1xuICAgIC5rZXljaGFpbnMoKVxuICAgIC5nZXQoeyB4cHViOiB4cHViIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBrZXljaGFpbi54cHJ2ID0gcGFyYW1zLnhwcnY7XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFRha2VzIGEgd2FsbGV0J3MgdW5zcGVudHMgYW5kIGZhbnMgdGhlbSBvdXQgaW50byBhIGxhcmdlciBudW1iZXIgb2YgZXF1YWxseSBzaXplZCB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogIHRhcmdldDogc2V0IGhvdyBtYW55IHVuc3BlbnRzIHlvdSB3YW50IHRvIGhhdmUgaW4gdGhlIGVuZFxuICogIG1pbkNvbmZpcm1zOiBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0aGUgdW5zcGVudHMgbXVzdCBoYXZlXG4gKiAgeHBydjogcHJpdmF0ZSBrZXkgdG8gc2lnbiB0cmFuc2FjdGlvblxuICogIHdhbGxldFBhc3NwaHJhc2U6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIHdhbGxldCdzIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLmZhbk91dFVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBCbHVlYmlyZC5jb3JvdXRpbmUoZnVuY3Rpb24qICgpIHtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBpbnB1dHMgZm9yIGZhbm91dCB0cmFuc2FjdGlvblxuICAgIC8vICh3aGVuIGZhbm5pbmcgb3V0LCB3ZSB0YWtlIGFsbCB0aGUgdW5zcGVudHMgYW5kIG1ha2UgYSBiaWdnZXIgbnVtYmVyIG9mIG91dHB1dHMpXG4gICAgY29uc3QgTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCA9IDgwO1xuICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dHMgZm9yIGZhbm91dCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UID0gMzAwO1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuICAgIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IHR3bywgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAyIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0ID4gTUFYX0ZBTk9VVF9PVVRQVVRfQ09VTlQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFuIG91dCB0YXJnZXQgdG9vIGhpZ2gnKTtcbiAgICB9XG5cbiAgICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gICAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pbkNvbmZpcm1zID0gMTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWluQ29uZmlybXMgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciA+PSAwJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3BsaXQgYSBuYXR1cmFsIG51bWJlciBOIGludG8gbiBhbG1vc3QgZXF1YWxseSBzaXplZCAowrExKSBuYXR1cmFsIG51bWJlcnMuXG4gICAgICogSW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBzaXplcyBvZiB0aGUgcGFydHMsIHdlIGNhbGN1bGF0ZSBmbG9vcihOL24pLCBhbmQgdGh1cyBoYXZlIHRoZSBiYXNlIHNpemUgb2YgYWxsIHBhcnRzLlxuICAgICAqIElmIE4gJSBuICE9PSAwLCB0aGlzIGxlYXZlcyB1cyB3aXRoIGEgcmVtYWluZGVyIHIgd2hlcmUgciA8IG4uIFdlIGRpc3RyaWJ1dGUgciBlcXVhbGx5IGFtb25nIHRoZSBuIHBhcnRzIGJ5XG4gICAgICogYWRkaW5nIDEgdG8gdGhlIGZpcnN0IHIgcGFydHMuXG4gICAgICogQHBhcmFtIHRvdGFsXG4gICAgICogQHBhcmFtIHBhcnRDb3VudFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBjb25zdCBzcGxpdE51bWJlckludG9DbG9zZU5hdHVyYWxOdW1iZXJzID0gZnVuY3Rpb24gKHRvdGFsLCBwYXJ0Q291bnQpIHtcbiAgICAgIGNvbnN0IHBhcnRTaXplID0gTWF0aC5mbG9vcih0b3RhbCAvIHBhcnRDb3VudCk7XG4gICAgICBjb25zdCByZW1haW5kZXIgPSB0b3RhbCAtIHBhcnRTaXplICogcGFydENvdW50O1xuICAgICAgLy8gaW5pdGlhbGl6ZSBwbGFjZWhvbGRlciBhcnJheVxuICAgICAgY29uc3QgYWxtb3N0RXF1YWxQYXJ0cyA9IG5ldyBBcnJheShwYXJ0Q291bnQpO1xuICAgICAgLy8gZmlsbCB0aGUgZmlyc3QgcmVtYWluZGVyIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplKzFcbiAgICAgIF8uZmlsbChhbG1vc3RFcXVhbFBhcnRzLCBwYXJ0U2l6ZSArIDEsIDAsIHJlbWFpbmRlcik7XG4gICAgICAvLyBmaWxsIHRoZSByZW1haW5pbmcgcGFydHMgd2l0aCB0aGUgdmFsdWUgcGFydFNpemVcbiAgICAgIF8uZmlsbChhbG1vc3RFcXVhbFBhcnRzLCBwYXJ0U2l6ZSwgcmVtYWluZGVyKTtcbiAgICAgIC8vIGFzc2VydCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsbW9zdCBlcXVhbCBwYXJ0c1xuICAgICAgLy8gVE9ETzogYWRkIGNoZWNrIGZvciB0aGUgYmlnZ2VzdCBkZXZpYXRpb24gYmV0d2VlbiBhbnkgdHdvIHBhcnRzIGFuZCBtYWtlIHN1cmUgaXQncyA8PSAxXG4gICAgICBpZiAoXyhhbG1vc3RFcXVhbFBhcnRzKS5zdW0oKSAhPT0gdG90YWwgfHwgXyhhbG1vc3RFcXVhbFBhcnRzKS5zaXplKCkgIT09IHBhcnRDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnQgc3VtIG9yIHBhcnQgY291bnQgbWlzbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhbG1vc3RFcXVhbFBhcnRzO1xuICAgIH07XG5cbiAgICAvLyBmaXJzdCwgbGV0J3MgdGFrZSBhbGwgdGhlIHdhbGxldCdzIHVuc3BlbnRzICh3aXRoIG1pbiBjb25maXJtcyBpZiBuZWNlc3NhcnkpXG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoeWllbGQgc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KSkgYXMgYW55O1xuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVuc3BlbnRzIHRvIGJyYW5jaCBvdXQnKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA+PSB0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFuIG91dCB0YXJnZXQgaGFzIHRvIGJlIGJpZ2dlciB0aGFuIGN1cnJlbnQgbnVtYmVyIG9mIHVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gd2UgaGF2ZSBhdCB0aGUgdmVyeSBtaW5pbXVtIDgxIGlucHV0cywgYW5kIDgxIG91dHB1dHMuIFRoYXQgdHJhbnNhY3Rpb24gd2lsbCBiZSBiaWdcbiAgICAvLyBpbiB0aGUgbWVkaXVtIHJ1biwgdGhpcyBhbGdvcml0aG0gY291bGQgYmUgcmV3b3JrZWQgdG8gb25seSB3b3JrIHdpdGggYSBzdWJzZXQgb2YgdGhlIHRyYW5zYWN0aW9uc1xuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPiBNQVhfRkFOT1VUX0lOUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBpcyBhbGwgdGhlIG1vbmV5IHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSB3YWxsZXRcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oYWxsVW5zcGVudHMpLm1hcCgndmFsdWUnKS5zdW0oKTtcblxuICAgIC8vIGluIG9yZGVyIHRvIG5vdCBtb2RpZnkgdGhlIHBhcmFtcyBvYmplY3QsIHdlIGNyZWF0ZSBhIGNvcHlcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gYWxsVW5zcGVudHM7XG4gICAgdHhQYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuXG4gICAgLy8gY3JlYXRlIHRhcmdldCBhbW91bnQgb2YgbmV3IGFkZHJlc3NlcyBmb3IgdGhpcyB3YWxsZXRcbiAgICBjb25zdCBuZXdBZGRyZXNzUHJvbWlzZXMgPSBfLnJhbmdlKHRhcmdldCkubWFwKCgpID0+XG4gICAgICBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSlcbiAgICApO1xuICAgIGNvbnN0IG5ld0FkZHJlc3NlcyA9IHlpZWxkIEJsdWViaXJkLmFsbChuZXdBZGRyZXNzUHJvbWlzZXMpO1xuICAgIC8vIGxldCdzIGZpbmQgYSBuaWNlLCBlcXVhbCBkaXN0cmlidXRpb24gb2Ygb3VyIFNhdG9zaGlzIGFtb25nIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgY29uc3Qgc3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhncm9zc0Ftb3VudCwgdGFyZ2V0KTtcbiAgICAvLyBtYXAgdGhlIG5ld2x5IGNyZWF0ZWQgYWRkcmVzc2VzIHRvIHRoZSBhbG1vc3QgY29tcG9uZW50cyBhbW91bnRzIHdlIGp1c3QgY2FsY3VsYXRlZFxuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHNwbGl0QW1vdW50cyk7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG4gICAgLy8gYXR0ZW1wdCB0byBjcmVhdGUgYSB0cmFuc2FjdGlvbi4gQXMgaXQgaXMgYSB3YWxsZXQtc3dlZXBpbmcgdHJhbnNhY3Rpb24gd2l0aCBubyBmZWUsIHdlIGV4cGVjdCBpdCB0byBmYWlsXG4gICAgdHJ5IHtcbiAgICAgIHlpZWxkIHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBhcyBleHBlY3RlZCwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIGRpZCBpbmRlZWQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZlZXNcbiAgICAgIC8vIHRoZSBlcnJvciBzdWdnZXN0cyBhIGZlZSB2YWx1ZSB3aGljaCB3ZSB0aGVuIHVzZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBob3dldmVyLCBsZXQncyBtYWtlIHN1cmUgaXQgd2Fzbid0IHNvbWV0aGluZyBlbHNlXG4gICAgICBpZiAoIWVycm9yLmZlZSAmJiAoIWVycm9yLnJlc3VsdCB8fCAhZXJyb3IucmVzdWx0LmZlZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIGVycm9yIGRvZXMgbm90IGNvbnRhaW4gYSBmZWUgcHJvcGVydHksIGl0IGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgaGFzIGdvbmUgYXdyeSwgYW5kIHdlIHRocm93IGl0XG4gICAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2VGZWUgPSBlcnJvci5mZWUgfHwgZXJyb3IucmVzdWx0LmZlZTtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgdG90YWxGZWUgKz0gZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudDtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5lZWQgdG8gY2xlYXIgdGhlc2Ugb3V0IHNpbmNlIG9ubHkgMSBtYXkgYmUgc2V0XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlO1xuICAgICAgdHhQYXJhbXMub3JpZ2luYWxGZWVSYXRlID0gdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldDtcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGJhc2VGZWU7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgZXF1YWwgZGlzdHJpYnV0aW9uLCB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBmZWUgZnJvbSB0aGUgY3VtdWxhdGl2ZSBmdW5kc1xuICAgICAgLy8gaW4gY2FzZSBzb21lIHVuc3BlbnRzIGdvdCBwcnVuZWQsIHdlIG5lZWQgdG8gdXNlIGVycm9yLnJlc3VsdC5hdmFpbGFibGVcbiAgICAgIGNvbnN0IG5ldEFtb3VudCA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSB0b3RhbEZlZTsgLy8gYWZ0ZXIgZmVlc1xuICAgICAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgY29uc3QgcmVtYWluaW5nU3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhuZXRBbW91bnQsIHRhcmdldCk7XG4gICAgICAvLyBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBhZ2FpbiBtYXBwZWQgdG8gdGhlIG5ldyBhZGRyZXNzZXNcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHJlbWFpbmluZ1NwbGl0QW1vdW50cyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB0aW1lLCB0aGUgdHJhbnNhY3Rpb24gY3JlYXRpb24gc2hvdWxkIHdvcmtcbiAgICBsZXQgZmFub3V0VHg7XG4gICAgdHJ5IHtcbiAgICAgIGZhbm91dFR4ID0geWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKGZhbm91dFR4KS5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfSkoKS5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmFuIG91dCBvciBjb2FsZXNjZSBhIHdhbGxldCdzIHVuc3BlbnRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtSZXF1ZXN0fFByb21pc2UuPFQ+fCp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUucmVncm91cFVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb25zdCB0YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuICBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBzZWxmLnVuc3BlbnRzKHsgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zIH0pLnRoZW4oZnVuY3Rpb24gKHVuc3BlbnRzKSB7XG4gICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdW5zcGVudHM7XG4gICAgfSBlbHNlIGlmICh1bnNwZW50cy5sZW5ndGggPiB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNvbnNvbGlkYXRlVW5zcGVudHMocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIGlmICh1bnNwZW50cy5sZW5ndGggPCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBzZWxmLmZhbk91dFVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnNvbGlkYXRlIGEgd2FsbGV0J3MgdW5zcGVudHMgaW50byBmZXdlciB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogIHRhcmdldDogc2V0IGhvdyBtYW55IHVuc3BlbnRzIHlvdSB3YW50IHRvIGhhdmUgaW4gdGhlIGVuZFxuICogIG1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uOiBzZXQgaG93IG1hbnkgbWF4aW11bSBpbnB1dHMgYXJlIHRvIGJlIHBlcm1pdHRlZCBwZXIgY29uc29saWRhdGlvbiBiYXRjaFxuICogIHhwcnY6IHByaXZhdGUga2V5IHRvIHNpZ24gdHJhbnNhY3Rpb25cbiAqICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXQgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSB3YWxsZXQncyBwcml2YXRlIGtleVxuICogIG1heEl0ZXJhdGlvbkNvdW50OiBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB1bnRpbCBmdW5jdGlvbiBzdG9wc1xuICogIHByb2dyZXNzQ2FsbGJhY2s6IG1ldGhvZCB0byBiZSBjYWxsZWQgd2l0aCBvYmplY3Qgb3V0bGluaW5nIGN1cnJlbnQgcHJvZ3Jlc3MgZGV0YWlsc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jb25zb2xpZGF0ZVVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSwgY2FsbGJhY2spO1xuICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGFyZ2V0ID0gMTtcbiAgfSBlbHNlIGlmICghXy5pc051bWJlcih0YXJnZXQpIHx8IHRhcmdldCA8IDEgfHwgdGFyZ2V0ICUgMSAhPT0gMCkge1xuICAgIC8vIHRoZSB0YXJnZXQgbXVzdCBiZSBkZWZpbmVkLCBiZSBhIG51bWJlciwgYmUgYXQgbGVhc3Qgb25lLCBhbmQgYmUgYSBuYXR1cmFsIG51bWJlclxuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5tYXhTaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5tYXhTaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWF4U2l6ZSBzaG91bGQgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWluU2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluU2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pblNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBtYXhpbXVtIG51bWJlciBvZiBpbnB1dHMgcGVyIHRyYW5zYWN0aW9uIGZvciBjb25zb2xpZGF0aW9uXG4gIGNvbnN0IE1BWF9JTlBVVF9DT1VOVCA9IDIwMDtcbiAgbGV0IG1heElucHV0Q291bnQgPSBwYXJhbXMubWF4SW5wdXRDb3VudFBlckNvbnNvbGlkYXRpb247XG4gIGlmIChtYXhJbnB1dENvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBudWxsIG9yIHVuaWRlbnRpZmllZCwgYmVjYXVzZSBlcXVhbGl0eSB0byB6ZXJvIHJldHVybnMgdHJ1ZSBpbiBpZighIGNsYXVzZVxuICAgIG1heElucHV0Q291bnQgPSBNQVhfSU5QVVRfQ09VTlQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBtYXhJbnB1dENvdW50ICE9PSAnbnVtYmVyJyB8fCBtYXhJbnB1dENvdW50IDwgMiB8fCBtYXhJbnB1dENvdW50ICUgMSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSBjb25zb2xpZGF0aW9uIGlucHV0IGNvdW50IG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMicpO1xuICB9IGVsc2UgaWYgKG1heElucHV0Q291bnQgPiBNQVhfSU5QVVRfQ09VTlQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gJyArIE1BWF9JTlBVVF9DT1VOVCk7XG4gIH1cblxuICBjb25zdCBtYXhJdGVyYXRpb25Db3VudCA9IHBhcmFtcy5tYXhJdGVyYXRpb25Db3VudCB8fCAtMTtcbiAgaWYgKFxuICAgIChwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgJiYgKCFfLmlzTnVtYmVyKG1heEl0ZXJhdGlvbkNvdW50KSB8fCBtYXhJdGVyYXRpb25Db3VudCA8IDEpKSB8fFxuICAgIG1heEl0ZXJhdGlvbkNvdW50ICUgMSAhPT0gMFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gaXRlcmF0aW9uIGNvdW50IG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMScpO1xuICB9XG5cbiAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICBpZiAobWluQ29uZmlybXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG1pbkNvbmZpcm1zID0gMTtcbiAgfVxuICBpZiAoIV8uaXNOdW1iZXIobWluQ29uZmlybXMpIHx8IG1pbkNvbmZpcm1zIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluQ29uZmlybXMgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBlcXVhbCB0byBvciBiaWdnZXIgdGhhbiAwJyk7XG4gIH1cblxuICBsZXQgbWluU2l6ZSA9IHBhcmFtcy5taW5TaXplIHx8IDA7XG4gIGlmIChwYXJhbXMuZmVlUmF0ZSkge1xuICAgIC8vIGZlZSByYXRlIGlzIGluIHNhdG9zaGlzIHBlciBrQiwgaW5wdXQgc2l6ZSBpbiBieXRlc1xuICAgIGNvbnN0IGZlZUJhc2VkTWluU2l6ZSA9IE1hdGguY2VpbCgoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDApO1xuICAgIGlmIChwYXJhbXMubWluU2l6ZSAmJiBtaW5TaXplIDwgZmVlQmFzZWRNaW5TaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVkIG1pblNpemUgdG9vIGxvdyBkdWUgdG8gdG9vIGhpZ2ggZmVlIHJhdGUnKTtcbiAgICB9XG4gICAgbWluU2l6ZSA9IE1hdGgubWF4KGZlZUJhc2VkTWluU2l6ZSwgbWluU2l6ZSk7XG5cbiAgICBpZiAoIXBhcmFtcy5taW5TaXplKSB7XG4gICAgICAvLyBmZWUgcmF0ZS1iYXNlZCBtaW4gc2l6ZSBuZWVkcyBubyBsb2dnaW5nIGlmIGl0IHdhcyBzZXQgZXhwbGljaXRseVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdPbmx5IGNvbnNvbGlkYXRpbmcgdW5zcGVudHMgbGFyZ2VyIHRoYW4gJyArXG4gICAgICAgICAgbWluU2l6ZSArXG4gICAgICAgICAgJyBzYXRvc2hpcyB0byBhdm9pZCB3YXN0aW5nIG1vbmV5IG9uIGZlZXMuIFRvIGNvbnNvbGlkYXRlIHNtYWxsZXIgdW5zcGVudHMsIHVzZSBhIGxvd2VyIGZlZSByYXRlLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGl0ZXJhdGlvbkNvdW50ID0gMDtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgbGV0IGNvbnNvbGlkYXRpb25JbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9uZSBiYXRjaCBvZiB1cCB0byBNQVhfSU5QVVRfQ09VTlQgdW5zcGVudHMuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgY29uc3QgcnVuTmV4dENvbnNvbGlkYXRpb24gPSBjbyhmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM6IGFueVtdID0gW107XG4gICAgbGV0IGlzRmluYWxDb25zb2xpZGF0aW9uID0gZmFsc2U7XG4gICAgaXRlcmF0aW9uQ291bnQrKztcbiAgICAvKlxuICAgICBXZSB0YWtlIGEgbWF4aW11bSBvZiB1bnNwZW50QnVsa1NpemVMaW1pdCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3dpcGUgdGhlIHdhbGxldFxuICAgICBjbGVhbiBvZiBhbGwgZXhjZXNzaXZlIHVuc3BlbnRzLCBzbyB3ZSBhZGQgMSB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnQgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuICAgICBJbiBjYXNlIHRoZXJlIGFyZSBldmVuIG1vcmUgdW5zcGVudHMgdGhhbiB0aGF0LCB0byBtYWtlIHRoZSBjb25zb2xpZGF0aW9uIGFzIGZhc3QgYXMgcG9zc2libGUsIHdlIGV4cGFuZCBvdXJcbiAgICAgc2VsZWN0aW9uIHRvIGluY2x1ZGUgYXMgbWFueSBhcyB0aGUgbWF4aW11bSBwZXJtaXNzaWJsZSBudW1iZXIgb2YgaW5wdXRzIHBlciBjb25zb2xpZGF0aW9uIGJhdGNoLlxuICAgICBTaG91bGQgdGhlIHRhcmdldCBudW1iZXIgb2YgdW5zcGVudHMgYmUgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIGlmIGlucHV0cyBwZXIgY29uc29saWRhdGlvbixcbiAgICAgd2Ugc3RpbGwgd2FudCB0byBmZXRjaCB0aGVtIGFsbCBzaW1wbHkgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBjb25zb2xpZGF0aW9uIGNhbiBiZSBwZXJmb3JtZWRcbiAgICAgYXQgYWxsLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIG51bWJlciBvZiBhbGwgdW5zcGVudHMgYmVpbmcgaGlnaGVyIHRoYW4gdGhlIHRhcmdldC5cbiAgICAgSW4gdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgdW5zcGVudHMgdmVyc2lvbiBTREssIHdlIHdpbGwga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIGZldGNoXG4gICAgIHRoZW0sIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoaXMgbWV0aG9kLlxuICAgICAqL1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHtcbiAgICAgIGxpbWl0OiB0YXJnZXQgKyBtYXhJbnB1dENvdW50LFxuICAgICAgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zLFxuICAgICAgbWluU2l6ZTogbWluU2l6ZSxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMubWF4U2l6ZSkge1xuICAgICAgcXVlcnlQYXJhbXMubWF4U2l6ZSA9IHBhcmFtcy5tYXhTaXplO1xuICAgIH1cbiAgICBjb25zdCBhbGxVbnNwZW50cyA9ICh5aWVsZCBzZWxmLnVuc3BlbnRzKHF1ZXJ5UGFyYW1zKSkgYXMgYW55O1xuICAgIC8vIHRoaXMgY29uc29saWRhdGlvbiBpcyBlc3NlbnRpYWxseSBqdXN0IGEgd2FzdGUgb2YgbW9uZXlcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDw9IHRhcmdldCkge1xuICAgICAgaWYgKGl0ZXJhdGlvbkNvdW50IDw9IDEpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uLCBzbyB0aGUgbWV0aG9kIGlzIGluY29ycmVjdFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zld2VyIHVuc3BlbnRzIHRoYW4gY29uc29saWRhdGlvbiB0YXJnZXQuIFVzZSBmYW5PdXRVbnNwZW50cyBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaXQncyBhIGxhdGVyIGl0ZXJhdGlvbiwgc28gdGhlIHRhcmdldCBtYXkgaGF2ZSBiZWVuIHN1cnBhc3NlZCAoZHVlIHRvIGNvbmZpcm1hdGlvbnMgaW4gdGhlIGJhY2tncm91bmQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbFVuc3BlbnRzQ291bnQgPSBhbGxVbnNwZW50cy5sZW5ndGg7XG5cbiAgICAvLyBob3cgbWFueSBvZiB0aGUgdW5zcGVudHMgZG8gd2Ugd2FudCB0byBjb25zb2xpZGF0ZT9cbiAgICAvLyB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgY29uc29saWRhdGVkIGJsb2NrIGJlY29tZXMgYSBuZXcgdW5zcGVudCBsYXRlclxuICAgIGxldCB0YXJnZXRJbnB1dENvdW50ID0gYWxsVW5zcGVudHNDb3VudCAtIHRhcmdldCArIDE7XG4gICAgdGFyZ2V0SW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIGFsbFVuc3BlbnRzLmxlbmd0aCk7XG5cbiAgICAvLyBpZiB0aGUgdGFyZ2V0SW5wdXRDb3VudCByZXF1aXJlcyBtb3JlIGlucHV0cyB0aGFuIHdlIGFsbG93IHBlciBiYXRjaCwgd2UgcmVkdWNlIHRoZSBudW1iZXJcbiAgICBjb25zdCBpbnB1dENvdW50ID0gTWF0aC5taW4odGFyZ2V0SW5wdXRDb3VudCwgbWF4SW5wdXRDb3VudCk7XG5cbiAgICAvLyBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiBpbnB1dHMgbGVmdCB0byBjb2FsZXNjZSBlcXVhbHMgdGhlIG51bWJlciB3ZSB3aWxsIGNvYWxlc2NlIGluIHRoaXMgaXRlcmF0aW9uXG4gICAgLy8gb3IgaWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG1hdGNoZXMgdGhlIG1heGltdW0gcGVybWl0dGVkIG51bWJlclxuICAgIGlzRmluYWxDb25zb2xpZGF0aW9uID0gaW5wdXRDb3VudCA9PT0gdGFyZ2V0SW5wdXRDb3VudCB8fCBpdGVyYXRpb25Db3VudCA9PT0gbWF4SXRlcmF0aW9uQ291bnQ7XG5cbiAgICBjb25zdCBjdXJyZW50Q2h1bmsgPSBhbGxVbnNwZW50cy5zcGxpY2UoMCwgaW5wdXRDb3VudCk7XG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBzZWxmLmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgY29uc3QgbmV3QWRkcmVzcyA9ICh5aWVsZCBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4sIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KSkgYXMgYW55O1xuICAgIGNvbnN0IHR4UGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBuZXdBZGRyZXNzO1xuICAgIC8vIHRoZSB0b3RhbCBhbW91bnQgdGhhdCB3ZSBhcmUgY29uc29saWRhdGluZyB3aXRoaW4gdGhpcyBiYXRjaFxuICAgIGNvbnN0IGdyb3NzQW1vdW50ID0gXyhjdXJyZW50Q2h1bmspLm1hcCgndmFsdWUnKS5zdW0oKTsgLy8gYmVmb3JlIGZlZXNcblxuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gY3VycmVudENodW5rO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBncm9zc0Ftb3VudDtcbiAgICB0eFBhcmFtcy5ub1NwbGl0Q2hhbmdlID0gdHJ1ZTtcblxuICAgIGlmICh0eFBhcmFtcy51bnNwZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb25lJyk7XG4gICAgfVxuXG4gICAgLy8gbGV0J3MgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyB0cmFuc2FjdGlvbi4gV2UgZXhwZWN0IGl0IHRvIGZhaWwgYmVjYXVzZSBubyBmZWUgaXMgc2V0LlxuICAgIHRyeSB7XG4gICAgICB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdGhpcyBlcnJvciBzaG91bGQgb2NjdXIgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kc1xuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgYml0Z29GZWUgPSAwO1xuICAgICAgbGV0IHRvdGFsRmVlID0gYmFzZUZlZTtcbiAgICAgIGlmIChlcnJvci5yZXN1bHQuYml0Z29GZWUgJiYgZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudCkge1xuICAgICAgICBiaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHRvdGFsRmVlICs9IGJpdGdvRmVlO1xuICAgICAgICB0eFBhcmFtcy5iaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIG5ldCBhbW91bnQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBtaW5pbXVtIG91dHB1dCBzaXplXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBNYXRoLm1heChlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWUsIHNlbGYuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluT3V0cHV0U2l6ZSk7XG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG5cbiAgICAgIC8vIHdlIHNldCB0aGUgZmVlIGV4cGxpY2l0bHlcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSBuZXRBbW91bnQgLSBiaXRnb0ZlZTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbbmV3QWRkcmVzcy5hZGRyZXNzXSA9IG5ldEFtb3VudDtcbiAgICB9XG4gICAgLy8gdGhpcyB0cmFuc2FjdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbm8gaXNzdWVzLCBiZWNhdXNlIGFuIGFwcHJvcHJpYXRlIGZlZSBpcyBzZXRcbiAgICBsZXQgc2VudFR4O1xuICAgIHRyeSB7XG4gICAgICBzZW50VHggPSB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaChzZW50VHgpO1xuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnByb2dyZXNzQ2FsbGJhY2spKSB7XG4gICAgICBwYXJhbXMucHJvZ3Jlc3NDYWxsYmFjayh7XG4gICAgICAgIHR4aWQ6IHNlbnRUeC5oYXNoLFxuICAgICAgICBkZXN0aW5hdGlvbjogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogZ3Jvc3NBbW91bnQsXG4gICAgICAgIGZlZTogc2VudFR4LmZlZSxcbiAgICAgICAgaW5wdXRDb3VudDogaW5wdXRDb3VudCxcbiAgICAgICAgaW5kZXg6IGNvbnNvbGlkYXRpb25JbmRleCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uSW5kZXgrKztcbiAgICBpZiAoIWlzRmluYWxDb25zb2xpZGF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGxhc3QgY29uc29saWRhdGlvbiBoYXMgbm90IHlldCBicm91Z2h0IHRoZSB1bnNwZW50cyBjb3VudCBkb3duIHRvIHRoZSB0YXJnZXQgdW5zcGVudCBjb3VudFxuICAgICAgLy8gdGhlcmVmb3JlLCB3ZSBwcm9jZWVkIGJ5IGNvbnNvbGlkYXRpbmcgeWV0IGFub3RoZXIgYmF0Y2hcbiAgICAgIC8vIGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSB3YWl0IDEgc2Vjb25kIHNvIHRoYXQgdGhlIG5ld2x5IGNyZWF0ZWQgdW5zcGVudCB3aWxsIGJlIGZldGNoZWQgaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgIHlpZWxkIEJsdWViaXJkLmRlbGF5KDEwMDApO1xuICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKC4uLigoeWllbGQgcnVuTmV4dENvbnNvbGlkYXRpb24oKSkgYXMgYW55KSk7XG4gICAgfVxuICAgIC8vIHRoaXMgaXMgdGhlIGZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24uIFdlIHJldHVybiBhbGwgdGhlIG9uZXMgd2UndmUgaGFkIHNvIGZhclxuICAgIHJldHVybiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zO1xuICB9KTtcblxuICByZXR1cm4gcnVuTmV4dENvbnNvbGlkYXRpb24oKVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdEb25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnNoYXJlV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBzaGFyaW5nO1xuICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gIHJldHVybiB0aGlzLmJpdGdvXG4gICAgLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBzaGFyaW5nID0gcmVzdWx0O1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAga2V5Y2hhaW4ueHBydiA9IHNlbGYuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFhwcnYgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3RW5jcnlwdGVkWHBydiA9IHNlbGYuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi54cHJ2IH0pO1xuXG4gICAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgICAgeHB1Yjoga2V5Y2hhaW4ueHB1YixcbiAgICAgICAgICAgICAgZW5jcnlwdGVkWHBydjogbmV3RW5jcnlwdGVkWHBydixcbiAgICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgICAgdG9QdWJLZXk6IHNoYXJpbmcucHVia2V5LFxuICAgICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgICAgIHVzZXI6IGFueTtcbiAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgcmVzaGFyZTogYm9vbGVhbjtcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICBkaXNhYmxlRW1haWw6IGFueTtcbiAgICAgICAga2V5Y2hhaW4/OiBhbnk7XG4gICAgICAgIHNraXBLZXljaGFpbj86IGJvb2xlYW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgICByZXNoYXJlOiBwYXJhbXMucmVzaGFyZSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIH07XG4gICAgICBpZiAoc2hhcmVkS2V5Y2hhaW4pIHtcbiAgICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnJlbW92ZVVzZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlciddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy51cmwoJy91c2VyLycgKyBwYXJhbXMudXNlcikpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KClcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeScpKS5zZW5kKCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5nZXRQb2xpY3lTdGF0dXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcG9saWN5L3N0YXR1cycpKS5zZW5kKCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zZXRQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmNvbmRpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5hY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5saXN0V2ViaG9va3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2ltdWxhdGUgd2FsbGV0IHdlYmhvb2ssIGN1cnJlbnRseSBmb3Igd2ViaG9va3Mgb2YgdHlwZSB0cmFuc2FjdGlvbiBhbmQgcGVuZGluZyBhcHByb3ZhbFxuICogQHBhcmFtIHBhcmFtc1xuICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKTogaWQgb2YgdGhlIHdlYmhvb2sgdG8gYmUgc2ltdWxhdGVkXG4gKiAtIHR4SGFzaCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciB0cmFuc2FjdGlvbiB3ZWJob29rcykgaGFzaCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zYWN0aW9uXG4gKiAtIHBlbmRpbmdBcHByb3ZhbElkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgYXBwcm92YWwgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgcGVuZGluZyBhcHByb3ZhbFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5zaW11bGF0ZVdlYmhvb2sgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHhIYXNoJywgJ3BlbmRpbmdBcHByb3ZhbElkJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBoYXNUeEhhc2ggPSAhIXBhcmFtcy50eEhhc2g7XG4gIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG5cbiAgaWYgKChoYXNUeEhhc2ggJiYgaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHx8ICghaGFzVHhIYXNoICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhhc2ggb3IgcGVuZGluZ0FwcHJvdmFsSWQsIGJ1dCBub3QgYm90aCcpO1xuICB9XG5cbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAvLyBidXQgdGhlIHNlcnZlciB0YWtlcyBjYXJlIG9mIHRoYXRcblxuICAvLyBvbmx5IHRha2UgdGhlIHR4SGFzaCBhbmQgcGVuZGluZ0FwcHJvdmFsSWQgcHJvcGVydGllc1xuICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHhIYXNoJywgJ3BlbmRpbmdBcHByb3ZhbElkJ10pO1xuXG4gIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmFkZFdlYmhvb2sgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5lc3RpbWF0ZUZlZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMuYW1vdW50ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIGFtb3VudCBhcyB3ZWxsIGFzIHJlY2lwaWVudHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWNpcGllbnRzIG11c3QgYmUgYXJyYXkgb2YgeyBhZGRyZXNzOiBhYmMsIGFtb3VudDogMTAwMDAwIH0gb2JqZWN0cycpO1xuICB9XG4gIGlmIChwYXJhbXMuYW1vdW50ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3QgcmVjaXBpZW50cyA9IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdO1xuXG4gIGlmIChwYXJhbXMuYW1vdW50KSB7XG4gICAgLy8gb25seSB0aGUgYW1vdW50IHdhcyBwYXNzZWQgaW4sIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGZhbHNlIHJlY2lwaWVudCB0byBydW4gY3JlYXRlVHJhbnNhY3Rpb24gd2l0aFxuICAgIHJlY2lwaWVudHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZW52XS5zaWduaW5nQWRkcmVzcywgLy8gYW55IGFkZHJlc3Mgd2lsbCBkb1xuICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgdHJhbnNhY3Rpb25QYXJhbXMuYW1vdW50ID0gdW5kZWZpbmVkO1xuICB0cmFuc2FjdGlvblBhcmFtcy5yZWNpcGllbnRzID0gcmVjaXBpZW50cztcblxuICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvblBhcmFtcykudGhlbihmdW5jdGlvbiAodHgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXN0aW1hdGVkU2l6ZTogdHguZXN0aW1hdGVkU2l6ZSxcbiAgICAgIGZlZTogdHguZmVlLFxuICAgICAgZmVlUmF0ZTogdHguZmVlUmF0ZSxcbiAgICB9O1xuICB9KTtcbn07XG5cbi8vIE5vdCBmdWxseSBpbXBsZW1lbnRlZCAvIHJlbGVhc2VkIG9uIFNESy4gVGVzdGluZyBmb3Igbm93LlxuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmRlbGV0ZVBvbGljeVJ1bGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0Qml0R29GZWVcbi8vIEdldCB0aGUgcmVxdWlyZWQgb24tdHJhbnNhY3Rpb24gQml0R28gZmVlXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRCaXRHb0ZlZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQnKTtcbiAgfVxuICBpZiAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0YW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9iaWxsaW5nL2ZlZScpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qXG4gKiBAcGFyYW1zXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSBvZiB3YWxsZXQgdXNlZCB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQga2V5c1xuICogIHVuc3BlbnRzOiBhcnJheSBvZiB1bnNwZW50cyB0byByZWNvdmVyXG4gKiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb24gYWRkcmVzcyB0byByZWNvdmVyIGZ1bmRzIHRvXG4gKiAgZmVlUmF0ZTogZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqICB1c2VyS2V5OiBlbmNyeXB0ZWQgdXNlciBrZXlcbiAqICBiYWNrdXBLZXk6IGVuY3J5cHRlZCBiYWNrdXAga2V5XG4gKiAqL1xuV2FsbGV0LnByb3RvdHlwZS5yZWNvdmVyID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdW5zcGVudHMnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVSYXRlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXknKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiYWNrdXBLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBCaWdJbnQodXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHBhcmFtcy51bnNwZW50cykpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTaXplID0gVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPVxuICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy51bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlVHhGZWUgPSBCaWdJbnQoYXBwcm94aW1hdGVTaXplICogcGFyYW1zLmZlZVJhdGUpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZVR4RmVlO1xuICBjb25zdCByZWNpcGllbnRzID0gW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogTnVtYmVyKHJlY292ZXJ5QW1vdW50KSB9XTtcblxuICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICByZWNpcGllbnRzLFxuICAgIGZlZTogTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpLFxuICB9KTtcblxuICBjb25zdCBwYXJzZWRVbnNpZ25lZFR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgodW5zaWduZWRUeC50cmFuc2FjdGlvbkhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHguaW5zLmxlbmd0aCA9PT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCk7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lm91dHMubGVuZ3RoID09PSAxKTtcbiAgYXNzZXJ0KF8uc3VtQnkocGFyYW1zLnVuc3BlbnRzLCAndmFsdWUnKSAtIF8uc3VtQnkocGFyc2VkVW5zaWduZWRUeC5vdXRzLCAndmFsdWUnKSA9PT0gTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpKTtcblxuICBjb25zdCBwbGFpblVzZXJLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMudXNlcktleSB9KTtcbiAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oeyAuLi51bnNpZ25lZFR4LCBzaWduaW5nS2V5OiBwbGFpblVzZXJLZXkgfSk7XG5cbiAgY29uc3QgcGxhaW5CYWNrdXBLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMuYmFja3VwS2V5IH0pO1xuICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgLi4udW5zaWduZWRUeCxcbiAgICB0cmFuc2FjdGlvbkhleDogaGFsZlNpZ25lZFR4LnR4LFxuICAgIHNpZ25pbmdLZXk6IHBsYWluQmFja3VwS2V5LFxuICB9KTtcbiAgcmV0dXJuIGZ1bGxTaWduZWRUeC50eDtcbn07XG5cbi8qXG4gKiBAcGFyYW1zXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSBvZiB3YWxsZXQgdXNlZCB0byBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQga2V5c1xuICogIHVuc3BlbnRzOiBhcnJheSBvZiB1bnNwZW50cyB0byByZWNvdmVyXG4gKiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb24gYWRkcmVzcyB0byByZWNvdmVyIGZ1bmRzIHRvXG4gKiAgZmVlUmF0ZTogZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb25cbiAqICB1c2VyS2V5OiBlbmNyeXB0ZWQgdXNlciBrZXlcbiAqICovXG5XYWxsZXQucHJvdG90eXBlLnN3ZWVwID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdW5zcGVudHMnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmZWVSYXRlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBCaWdJbnQodXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHBhcmFtcy51bnNwZW50cykpO1xuICBpZiAodG90YWxJbnB1dEFtb3VudCA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTaXplID0gVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplO1xuICBjb25zdCBhcHByb3hpbWF0ZVNpemUgPVxuICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBvdXRwdXRTaXplICsgVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy51bnNwZW50cy5sZW5ndGg7XG4gIGNvbnN0IGFwcHJveGltYXRlVHhGZWUgPSBCaWdJbnQoYXBwcm94aW1hdGVTaXplICogcGFyYW1zLmZlZVJhdGUpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZVR4RmVlO1xuICBjb25zdCByZWNpcGllbnRzID0gW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogTnVtYmVyKHJlY292ZXJ5QW1vdW50KSB9XTtcblxuICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICByZWNpcGllbnRzLFxuICAgIGZlZTogTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpLFxuICB9KTtcblxuICBjb25zdCBwYXJzZWRVbnNpZ25lZFR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgodW5zaWduZWRUeC50cmFuc2FjdGlvbkhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHguaW5zLmxlbmd0aCA9PT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCk7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lm91dHMubGVuZ3RoID09PSAxKTtcbiAgYXNzZXJ0KF8uc3VtQnkocGFyYW1zLnVuc3BlbnRzLCAndmFsdWUnKSAtIF8uc3VtQnkocGFyc2VkVW5zaWduZWRUeC5vdXRzLCAndmFsdWUnKSA9PT0gTnVtYmVyKGFwcHJveGltYXRlVHhGZWUpKTtcblxuICBjb25zdCBwbGFpblVzZXJLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMudXNlcktleSB9KTtcbiAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oeyAuLi51bnNpZ25lZFR4LCBzaWduaW5nS2V5OiBwbGFpblVzZXJLZXkgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFRyYW5zYWN0aW9uKHtcbiAgICB0eDogaGFsZlNpZ25lZFR4LnR4LFxuICAgIHN1cHByZXNzQnJvYWRjYXN0OiB0cnVlLFxuICAgIG90cDogcGFyYW1zLm90cCxcbiAgfSk7XG59O1xuXG5leHBvcnQgPSBXYWxsZXQ7XG4iXX0=
|